PiKachu靶场实战:SSRF漏洞利用与防御全解析

张开发
2026/4/6 2:33:21 15 分钟阅读

分享文章

PiKachu靶场实战:SSRF漏洞利用与防御全解析
1. SSRF漏洞初探为什么它能让服务器叛变想象一下你家的智能门铃有个功能可以查看快递员是否到达门口。但如果这个功能设计不当黑客就能通过门铃偷看你整个家的监控画面——这就是SSRF服务端请求伪造漏洞的可怕之处。作为Web安全领域的隐形杀手SSRF能让本应对外提供服务的服务器变成攻击者探查内网的间谍工具。在PiKachu靶场实验中我们发现SSRF漏洞通常出现在需要从其他服务器获取数据的场景。比如电商网站显示第三方物流信息、社交平台预览URL链接内容等。开发者为方便直接使用PHP的file_get_contents()或curl_exec()等函数获取远程资源却忘记对用户输入的URL参数做严格校验。我曾在一个实际项目中看到攻击者通过修改图片上传接口的URL参数成功读取到了AWS元数据服务中的云服务器密钥。这类漏洞的危害呈几何级增长根据2023年某安全报告SSRF在云环境中的平均危害评分达到8.7满分10分。攻击者不仅能扫描内网拓扑、窃取敏感数据还能利用云平台的元数据服务获取临时凭证最终导致整个云环境沦陷。去年某知名云服务商的大规模入侵事件最初就是从一个简单的SSRF漏洞开始的。2. 靶场实战curl函数导致的SSRF漏洞2.1 curl的超能力与安全隐患PHP的curl库就像瑞士军刀支持http、https、ftp、gopher、file等多种协议。但正是这种灵活性埋下了隐患。在PiKachu靶场的ssrf_curl.php文件中我们能看到典型的危险代码$url $_GET[url]; $ch curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, false); curl_exec($ch); curl_close($ch);这段代码直接信任了用户输入的URL参数。我曾在审计某金融系统时发现类似代码让攻击者可以通过file协议读取服务器上的/etc/passwd文件http://target/vuln.php?urlfile:///etc/passwd更危险的是curl支持通过DNS重绑定技术绕过常规的黑名单过滤。攻击者可以注册一个域名设置极短的TTL值第一次解析返回合法外网IP通过校验实际请求时DNS却返回内网IP地址。2.2 内网探测的隐形扫描器通过curl的http协议支持SSRF秒变内网扫描工具。在靶场实验中修改URL参数为内网地址就能探测服务http://localhost/pikachu/vul/ssrf_curl.php?urlhttp://192.168.1.100:22根据响应时间差异可以判断目标端口是否开放。我曾用类似方法在授权测试中三小时就绘制出了客户整个内网拓扑图。更高级的攻击还会结合HTTP头注入如Host: 127.0.0.1302跳转绕过过滤CRLF注入伪造请求头这些技巧能让看似无害的请求变成攻击内网服务的特洛伊木马。3. file_get_contents的SSRF陷阱3.1 文件读取函数的越权问题file_get_contents()本是个简单的文件读取函数但支持php://filter等包装器让它变得危险。靶场中的ssrf_fgc.php展示了典型漏洞$file $_GET[file]; echo file_get_contents($file);攻击者可以通过以下方式读取系统文件http://target/vuln.php?filefile:///etc/shadow更隐蔽的是利用php://filter读取源码http://target/vuln.php?filephp://filter/readconvert.base64-encode/resourceconfig.php去年某CMS爆出的SSRF漏洞就是利用这种方式导致数万网站数据库凭证泄露。我在代码审计时发现很多开发者会忘记这个函数也支持http协议错误地认为只用于本地文件读取。3.2 协议处理器的暗门PHP的流包装器是个容易被忽视的风险点。除了常见的file/http还支持ftp:// - FTP服务器访问data:// - 直接包含Base64编码数据expect:// - 执行系统命令需安装扩展在一次渗透测试中我发现目标系统虽然过滤了file://但允许ftp://最终通过FTP被动模式读取到了敏感文件。防护措施必须考虑所有可能的协议处理器特别是PHP环境可能加载的扩展协议。4. 从攻击到防御构建SSRF防护体系4.1 输入校验的三道防线基于多次实战经验我总结出有效的防护策略白名单校验最可靠$allowed_hosts [api.trusted.com, cdn.safe.org]; $host parse_url($_GET[url], PHP_URL_HOST); if (!in_array($host, $allowed_hosts)) { die(非法请求来源); }DNS重绑定防护$ip gethostbyname($host); if ($ip ! $_SERVER[REMOTE_ADDR]) { // 防止DNS重绑定攻击 $forwarded $_SERVER[HTTP_X_FORWARDED_FOR] ?? ; if (!in_array($ip, explode(,, $forwarded))) { die(IP地址不匹配); } }协议禁用php.ini配置; 禁用危险协议 allow_url_fopen Off allow_url_include Off某电商平台在采用这三层防护后SSRF漏洞报告数量从每月20降为零。关键在于不仅要校验用户输入的是什么还要确认最终请求的是什么。4.2 网络层的纵深防御应用层防护可能被绕过需要网络层配合云环境元数据服务防护禁用169.254.169.254的直接访问使用IMDSv2需要携带特殊请求头内网隔离关键业务系统使用独立VPC设置严格的安全组规则出口流量监控记录服务器对外请求日志对异常目标地址进行告警在一次AWS环境的安全评估中我们发现虽然应用有SSRF漏洞但因为正确配置了安全组攻击者无法访问元数据服务有效降低了风险等级。5. 靶场之外的实战技巧5.1 漏洞挖掘的火眼金睛在日常代码审计中我重点关注以下SSRF高危场景Webhook回调URL处理第三方API代理接口文件导入/导出功能文档预览服务社交媒体链接预览特别要注意那些看似无害的功能。去年某OA系统的日历订阅功能就因为接受任意URL作为数据源导致SSRF漏洞。5.2 绕过过滤的七种武器攻击者常用的绕过技巧包括IP格式变异127.0.0.1 → 2130706433十进制 127.0.0.1 → 127.1省略后缀域名指向技巧evil.com → 127.0.0.1.nip.ioURL解析差异http://fooevil.com:80google.com302跳转利用// evil.com/redirect.php header(Location: http://169.254.169.254);在防御方案设计时必须考虑这些绕过手法的可能性。某次攻防演练中攻击者就利用GitHub Pages的跳转功能成功绕过了严格的白名单校验。

更多文章