国内CMS代码审计实战分析 (阿样发卡网v6.0)
一、前台SQL注入
利用Seay工具,进行审计。
跟进ajax.php文件
仔细看这个代码,可以发现这个文件先取POST包中的t参数,然后把取到的参数内容带入数据库中查询if_km表中的out_trade_no ,trade_no,rel 列
最后再输出代码
虽然这行代码总体看来没问题的且有可能存在注入,不过我们仔细看这里可以发现程序会把取到的参数带入_IF函数中进行过滤
显然程序对参数进行了过滤,那我们现在看看程序会对什么值进行过滤,然后对症下药
ajax.php的文件开头可以看出 包含了if/common.php 所以我们把注意转移到if/common.php上
找到了过滤文件,继续跟进
发现过滤还挺严格的
既然_if过滤这么严格,那我们就回到ajax.php继续通读代码,看看能不能发现一些额外惊喜
$out_trade_no
变量没有做任何过滤就直接带入了数据库,拿到程序测试一下
直接带进去了
二、前台修改管理密码
漏洞位置:admin/ajax.php
漏洞成因:单纯的header头判断
加入X-Requested-With: XMLHttpRequest 即可绕过判断
继续往下看,
漏洞位置:
绕过他前面的判断,这里就直接能重置密码了,复现一下试试
发现重置成功了,但是发现我们登陆不上去
怎么回事呢,我们去看看代码
原来我们的新密码要加上他的秘钥再MD5一下,我们直接全局查找$password_hash
,找到秘钥
找到秘钥
生成我们的新密码
利用刚才的漏洞,修改密码,登陆系统
后台任意文件上传
漏洞位置:admin/set.php
只判断了$ext是不是图片类型,并且没有进行一系列的过滤然后传入到了/assets/imgs/里面,名字为logo.xx
上传成功,访问/assets/imgs/logo.php
漏洞危害
探测内网服务及内网拓扑
向内部任意主机的任意端口发送精心构造的Payload
DOS攻击(请求大文件,始终保持连接Keep-Alive Always)
攻击内网的web应用,如xss、sql注入等
利用file、dict、gopher等协议读取本地文件等
常用协议
file协议可用于查看文件
dict协议可用于刺探端口
gopher协议支持GET/POST等请求,可用于攻击内网ftp、redis、telnet、smtp等服务
国外CMS实战代码审计分析
Joomla! Core SQL注入漏洞
CVE-2018-8045
受影响版本
Joomla! Joomla! 3.5.0-3.8.5
我们看下漏洞代码
$categoryId未经过滤直接拼接sql语句进行查询,造成了sql注入。
但是$categoryId参数如何控制呢?
存在漏洞的文件位于\administrator\components\com_users\models\notes.php,是一个joomla的模型文件,它的控制器是\administrator\components\com_users\controllers\notes.php
我们登录joomla后台来看一下在哪里触发这个漏洞。
访问administrator/index.php?option=com_users&view=notes 即可触发该控制器。
$categoryId未经过滤直接拼接sql语句进行查询,造成了sql注入。
但是$categoryId参数如何控制呢?
存在漏洞的文件位于\administrator\components\com_users\models\notes.php,是一个joomla的模型文件,它的控制器是\administrator\components\com_users\controllers\notes.php
但是如何控制$categoryId参数呢?
如果只访问administrator/index.php?option=com_users&view=notes
只会向服务器发送一个get请求,请求中根本不包含我们想要的categoryId参数
先看下出问题的这行代码
因此想向它传参,一定和高级搜索之类功能的有关。
选择Search Tools选项 Select Category选项。
此时joomla的发包情况
此时我们需要的filter[category_id]参数出现在了post参数中,通过这个参数的值,即可畅通无阻的进行注入。
下面验证下这个filter[category_id]参部分可以直接传递给后台的$categoryId
参数
我们修改了filter[category_id]参数内容为‘kingsguard_test’,并发包
后台下断点,抓取$categoryId
值,可见kingsguard_test 原封不动的被传递给$categoryId
参数,并拼接sql语句进行查询。
利用验证