Loading... ### ⚙️ **一、攻击原理(漏洞本质)** 1. **核心机制**SSRF(Server-Side Request Forgery)利用**服务端作为攻击代理**,通过篡改服务端发起的请求目标,使服务器向指定资源发起恶意请求。由于请求源自受信服务器,可绕过防火墙访问内网资源。 ```mermaid sequenceDiagram 攻击者->>漏洞服务器: 发送恶意URL参数 漏洞服务器->>内网主机: 以服务器身份发起请求 内网主机-->>漏洞服务器: 返回敏感数据/执行操作 漏洞服务器-->>攻击者: 返回响应或错误信息 ``` 2. **关键条件** - 服务端存在**从URL获取资源**的功能(如图片加载、API代理) - 目标地址**参数用户可控**且**无严格过滤** - 服务器具备**内网访问权限**(核心攻击面) --- ### 🛠️ **二、产生根源(漏洞成因)** | **漏洞类型** | **技术原因** | **典型案例** | | ---------------------- | -------------------------------------------------------- | ---------------------------------------------------------- | | **输入未过滤** | 直接拼接用户输入到请求函数(如 `file_get_contents()`) | 通过 `?url=http://attacker.com`注入恶意地址 | | **协议支持过广** | 允许 `file://`、`gopher://`等高危协议 | `file:///etc/passwd`读取服务器密码文件 | | **配置缺陷** | Nginx错误使用 `$uri`(自动解码URL) | `return 302 https://$host$uri` 注入 `%0d%0a`篡改响应头 | | **库函数误用** | 如Axios库忽略 `baseURL`校验(CVE-2025-27152) | 绝对URL绕过内部API路由,泄露凭证 | --- ### ⚔️ **三、利用手法(攻击场景与协议利用)** #### 1. **基础攻击场景** | **攻击目标** | **Payload示例** | **效果** | | ------------------------- | --------------------------------------------------- | ----------------------------- | | **内网端口扫描** | `http://vuln.com/load?url=http://192.168.1.1:22` | 根据响应时间/错误判断端口开放 | | **敏感文件读取** | `http://vuln.com/load?url=file:///etc/shadow` | 获取系统密码文件 | | **Redis未授权利用** | `gopher://127.0.0.1:6379/_*3%0d%0a$3%0d%0aset...` | 写入SSH密钥或计划任务 | #### 2. **协议利用深度解析** | **协议** | **攻击能力** | **利用工具** | | ----------------------- | --------------------------------------- | ------------------------------------ | | **`file://`** | 读取服务器本地文件 | 直接构造URL路径 | | **`dict://`** | 获取服务Banner信息(如Redis版本) | `dict://localhost:6379/info` | | **`gopher://`** | **万能协议**,可构造任意TCP数据包 | Gopherus生成Payload攻击MySQL/FastCGI | | **`http/s`** | 探测内网Web服务(如Jenkins管理界面) | 结合目录爆破工具 | #### 3. **高级绕过技巧** | **防御措施** | **绕过方法** | **原理** | | ---------------------- | ------------------------------------------------------------- | -------------------- | | **IP黑名单** | 短网址服务、`xip.io`域名(`127.0.0.1.xip.io`) | DNS解析机制绕过 | | **进制过滤** | IP转十进制(`2130706433`)或十六进制(`0x7f000001`) | 格式转换规避正则匹配 | | **协议白名单** | 302跳转:将 `https://allowed.com`重定向至 `gopher://内网` | 服务端追踪跳转未校验 | | **CRLF注入组合** | `http://evil.com%0d%0aHeader:注入内容` | 污染HTTP头实现越权 | --- ### 🛡️ **四、防御方案(纵深防御体系)** #### 1. **输入处理层** - **协议管控**:仅允许 `HTTP/HTTPS`,禁用 `file`、`gopher`等危险协议 - **白名单校验**:域名/IP白名单(如只允许 `*.example.com`) - **输入净化**:过滤 `@`、`#`、`CRLF`等特殊字符 #### 2. **网络层防护** - **端口限制**:仅开放Web常用端口(80, 443, 8080) - **内网隔离**:部署微服务间零信任网络,限制服务器出站流量 - **DNS加固**:禁用非常规域名解析(如 `xip.io`) #### 3. **应用层加固** ```java // Java示例:使用SafeURL库校验URL SafeURLValidator validator = new SafeURLValidator.Builder() .setAllowedProtocols("https") .setAllowedDomains("trusted.com") .build(); if (validator.isValid(userInput)) { // 发起请求 } ``` - **统一错误信息**:避免通过错误差异暴露端口状态(如“连接拒绝”vs“连接超时”) - **请求签名**:对内部API增加HMAC签名验证 #### 4. **监控与响应** - **日志审计**:记录所有外部请求的源IP、目标URL、响应状态 - **WAF规则**:拦截含内网IP或高危协议的请求(如Cloudflare SSRF规则集) --- ### ⚠️ **五、渗透测试验证方法** 1. **手工检测流程** - **定位注入点**:寻找 `url`、`link`、`image`等参数 - **发送探测Payload**: ```http GET /api/fetch?url=http://169.254.169.254/latest/meta-data HTTP/1.1 Host: example.com ``` - **验证响应**:检查是否返回AWS元数据等敏感信息 2. **工具化验证** - **Burp Suite**:`Intruder`模块爆破内网IP段(`192.168.0.0/24`) - **Gopherus**:生成攻击Redis的Payload: ```bash python gopherus.py --exploit redis --cmd "echo 'exploited' > /tmp/proof" ``` 3. **无回显检测** - **DNSLOG**:使用 `ceye.io`观察DNS解析记录确认漏洞 --- ### 💎 **总结与最佳实践** SSRF的本质是**信任边界崩塌**,根治需结合技术与管理措施: 1. **原则**: > **永不信任用户输入,始终验证输出目标** > 2. **纵深防御**: ```mermaid graph LR A[输入过滤] --> B[协议限制] B --> C[网络隔离] C --> D[请求签名] ``` 3. **演进防御**: - 定期更新依赖库(如修复Axios CVE-2025-27152) - 混沌工程测试:模拟内网服务不可用场景验证防护有效性 > **历史教训**:2025年Shopify因CRLF+SSRF组合漏洞导致内网Redis沦陷,损失千万级用户数据。根本修复方案:**协议白名单+请求签名**。 **权威参考**: - [OWASP SSRF防护指南](https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html) - [云安全联盟 SSRF最佳实践](https://cloudsecurityalliance.org/research/working-groups/ssrf/) 通过**输入管控+网络隔离+协议收敛**的三层防御,可彻底阻断SSRF攻击链,保障内网系统不可达性。 最后修改:2025 年 06 月 05 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏