服务器端请求伪造(SSRF)漏洞与防护(进阶实战篇)
字数 1559 2025-11-30 23:01:03
服务器端请求伪造(SSRF)漏洞与防护(进阶实战篇)
描述
服务器端请求伪造(SSRF)是一种安全漏洞,攻击者通过操纵服务器端应用程序发起非预期的网络请求,从而访问或攻击内部资源、云元数据服务或第三方系统。与基础SSRF不同,进阶实战场景涉及复杂绕过技术、多协议利用(如gopher、dict、file)、链式攻击(如结合Redis未授权访问)以及云环境特定风险(如AWS/Azure元数据服务)。防护需结合输入验证、协议限制、网络层隔离等多层防御。
解题过程
-
理解漏洞根源
- 漏洞成因:应用程序未严格验证用户提供的URL或主机名,直接使用后端服务(如cURL、HTTP客户端)发起请求。
- 关键风险点:
- 内部系统探测:通过请求
http://192.168.1.1/admin扫描内网。 - 云元数据访问:例如AWS元数据接口
http://169.254.169.254/latest/meta-data/泄露敏感信息。 - 协议处理不当:利用
file://协议读取本地文件,或gopher://协议与Redis/Memcached交互。
- 内部系统探测:通过请求
-
识别攻击向量
- 常见入口:
- Webhook配置、URL预览、文件导入、PDF生成等需要外部资源获取的功能。
- 参数名如
url、target、endpoint,可能通过GET/POST/Header传递。
- 进阶绕过技术:
- DNS重绑定:利用短TTL域名,首次解析为合法IP通过验证,第二次解析为内网IP。
- URL解析混淆:使用
@符号(如http://evil.com@内网IP)、IPv6或Unicode编码。 - 302重定向:控制外部服务返回重定向响应,指向内网地址。
- 常见入口:
-
利用链构造示例
- 场景:结合Redis未授权访问
- 用户输入URL被服务器请求:
gopher://redis-server:6379/_*3%0d%0a$3%0d%0aSET%0d%0a$5%0d%0akey1%0d%0a$5%0d%0avalue%0d%0a*1%0d%0a$4%0d%0aSAVE%0d%0a(编码后的Redis命令)。 - 服务器解析gopher协议并向内网Redis发送命令,导致数据篡改或持久化。
- 用户输入URL被服务器请求:
- 云元数据利用:
- 请求
http://169.254.169.254/latest/meta-data/iam/security-credentials/角色名获取临时凭据,进一步控制云资源。
- 请求
- 场景:结合Redis未授权访问
-
防护策略分层实施
- 输入验证层:
- 白名单校验:仅允许预期域名或IP(如
api.trusted.com),拒绝私有IP段(如10.0.0.0/8)。 - 协议限制:禁用高危协议(gopher、file、dict),仅允许HTTP/HTTPS。
- 白名单校验:仅允许预期域名或IP(如
- 网络层:
- 出口防火墙:限制后端服务出站流量,禁止访问元数据服务(169.254.169.254)或内网段。
- 代理策略:强制所有外部请求经安全代理,代理配置IP黑名单。
- 代码层:
- 使用URL解析库(如
url.parse())并设置allow_follow_redirects: false,避免重定向攻击。 - 为HTTP客户端设置超时和响应大小限制,防止数据外泄。
- 使用URL解析库(如
- 云环境加固:
- 配置IAM角色最小权限,元数据服务强制使用IMDSv2(需请求头认证)。
- 输入验证层:
-
测试与验证
- 工具扫描:使用SSRFmap、Gopherus等工具检测漏洞。
- 手动测试:尝试输入不同协议和地址(如
http://burpcollaborator.net观察回调)。 - 防护验证:模拟攻击请求,确认返回错误(如"Invalid URL")且无实际网络流量。
通过以上步骤,可系统化理解SSRF进阶利用手法并实施深度防护,减少内部资产暴露风险。