首次代审--熊海cmsV1.0
附源码下载链接
https://zdown.chinaz.com/201503/xhcms_v1.0.rar
将源码导入seay系统,并开始审计
0x01
index.php文件 文件包含
代码解读:
file变量接受get传参的r参数值
$action=$file==''?'index':$file;
这是简单的判断语句
条件表达式 ? 真值时的结果 : 假值时的结果
意思就是 如果file的值为空action就等于index否则等于$file变量
include() 函数 包含指定文件
漏洞验证:
在网站根目录放入一个phpinfo文件,后缀名为php
然后访问网站
127.0.0.1:8081/index.php?r=../test
0x02
adset.php文件sql注入
代码解读:
if ($save==1){
$query = "UPDATE adword SET
ad1='$ad1',
ad2='$ad2',
ad3='$ad3',
date=now()";
@mysql_query($query) or die('修改错误:'.mysql_error());
echo "<script>alert('亲爱的,广告设置成功更新。');location.href='?r=adset'</script>";
exit;
}
如果$save变量为1,就会更新adword表的记录$ad1、$ad2、$ad3为文本 now()为当前时间
@mysql_query($query) #执行sql语句
漏洞验证:
进入数据库查看一下该表数据
在web找到该功能点
开启mysql命令监听工具
点击保存
查看执行的语句
添加'--+干扰发现有魔术引号
因为数据库编码是utf-8编码,所以不能宽字节注入
只能尝试二次注入了 看功能点没办法进行二次注入 gg了
0x03
editoolumn.php 文件sql注入
代码解读
只要save变量等于1 都会执行update的sql语句
并且这些参数全是get和post传参
漏洞验证:
来到栏目管理 -》修改栏目
全跟一个单引号干扰,成功引出报错,存在sql注入
构造获取当前数据库名字语句
0' and updatexml(1,concat(0x7e,database(),0x7e),1)--+#
成功实现报错注入
3-15都是一个原理
0x04
downloads.php文件任意文件读取漏洞
代码解读:
$fp变量以二进制读取指定路径$socurceFile的文件
fread($fp, 1024 * 8)
:从文件指针 $fp
中读取数据。第一个参数是文件指针,第二个参数是要读取的最大字节数。在这里,每次读取的字节数是 1024 * 8,即 8192 字节(8KB)
例如python中的fp = open(socurceFile,"rb")
追溯到该参数的第一个位置 可以看见该文件sourceFile参数是$fileadd参上
再追溯fileadd参数 可以发现是$down关联数组键名为为softadd的值
addslashes():对预定义字符进行转义 例如 ’、\、“
!is_numeric():判断是否为数字
mysql_fetch_array()是PHP中用于从MySQL查询结果中获取数据的函数。它接受一个查询结果变量作为参数,并以数组的形式返回一行数据。
mysql_query():执行sql语句
这一套看下来 get传参cid参数的值进行转义后赋值给fileid参数
然后去数据库查询id=$fileid的结果赋值给 result
再将该查询结果变为数组赋值给 down
$down关联数组键名为为softadd的值赋值给$fileadd参数
fileadd又直接赋值给sourceFile
然后读取出来
ok 那么开始构造
漏洞验证:
来到前端的下载页面点击 【电信下载】
发现报错
复制文本来到源码查找原因
发现是因为$sourceFile变量为空导致
$fileadd=$down['softadd'];
$sourceFile = $fileadd;
进入数据库查看id=1时 softadd确实是为空
添加一个路径进去
再次访问就变成下载链接
但是这个路径不可控,所以说不存在任意文件下载
但是可以联合sql注入不断更新数据进行任意文件下载
0x05
downloads.php文件sql注入
代码解读:
0x04讲过这段代码
看注入点就是这个fileid了
漏洞验证:
在cid参数后添加'发现返回 : 错误的下载请求
查看源码发现
是因为cid参数必须是数值才能继续执行sql,所以说这里不存在sql注入
0x06
controller.php文件xss
代码解读:
seay系统爆漏洞是因为这个echo
if (isset($_GET["callback"])) { if (preg_match("/^[\w_]+$/", $_GET["callback"])) { echo htmlspecialchars($_GET["callback"]) . '(' . $result . ')';
} else {
echo json_encode(array(
'state'=> 'callback参数不合法'
));
}
} else {
echo $result;
}
isset():检查变量是否已设置并且不为null的函数,变量存在且不为null,则返回true,否则返回false
preg_match():已经介绍了,是正则的匹配函数
^ 匹配开头 [\w_] 匹配一个字母、数字或下划线 + 按照前面的匹配模式持续 $匹配结尾
联合起来:字符串是否完全由字母、数字、下划线组成
要满足这个正则才能执行echo
漏洞验证:
直接访问/seacmseditor/php/controller.php?callback=123
解密
查看源码
是进入了这个选择里,不用管这里
因为123已经写进去了,尝试xss payload
发现没有写入成功 因为这个正则过滤掉了<>这些符号
好了首次代审结束,有点收获:发现了代审的魅力所在了,再接再厉