服务器端请求伪造(SSRF)漏洞与防护(进阶实战篇)
字数 1315 2025-11-15 23:01:40
服务器端请求伪造(SSRF)漏洞与防护(进阶实战篇)
描述
SSRF(Server-Side Request Forgery)是一种攻击者通过操纵服务器端应用发送伪造请求的安全漏洞。在进阶实战场景中,攻击者可能利用复杂协议处理、URL解析差异、云服务元数据接口等手法,实现内网渗透、数据窃取或权限提升。与基础SSRF相比,进阶攻击更注重绕过防护机制和利用环境特性。
解题过程
-
理解漏洞核心原理
- 漏洞成因:应用未对用户提供的URL进行严格验证,直接使用后端服务(如cURL、file_get_contents)发起请求
- 关键风险点:
- 协议处理器的多样性(如
file://、gopher://、dict://) - 云环境元数据API(如AWS的169.254.169.254)
- URL解析器差异(如对
@、#等符号的解析不一致)
- 协议处理器的多样性(如
-
识别攻击面进阶技巧
- 协议混淆技术:
- 利用
file://协议读取本地系统文件(如file:///etc/passwd) - 通过
gopher://构造任意TCP流量攻击内网服务(如Redis未授权访问)
- 利用
- 绕过黑名单过滤:
- 使用十进制/IPv6编码(如
169.254.169.254→2852039166) - 利用URL解析特性(如
http://example.com@恶意IP)
- 使用十进制/IPv6编码(如
- 云元数据API利用:
- 探测AWS元数据接口:
http://169.254.169.254/latest/meta-data/iam/security-credentials/ - 通过重定向或DNS重绑定绕过IP限制
- 探测AWS元数据接口:
- 协议混淆技术:
-
实战案例分步解析
场景:攻击者通过图片上传功能触发SSRF- 步骤1:发现应用允许通过URL上传头像(参数名为
avatar_url) - 步骤2:尝试基础探测:
POST /upload_avatar HTTP/1.1 avatar_url=http://169.254.169.254/latest/meta-data/ - 步骤3:遇阻后使用绕过技术:
- 方法A:URL编码关键字符
avatar_url=http://%31%36%39%2e%32%35%34%2e%31%36%39%2e%32%35%34/metadata/ - 方法B:利用域名重定向
控制一个域名解析到169.254.169.254,提交avatar_url=http://恶意域名/
- 方法A:URL编码关键字符
- 步骤1:发现应用允许通过URL上传头像(参数名为
-
防护方案分层设计
- 输入验证层:
- 使用白名单协议(仅允许
http://、https://) - 正则表达式校验域名格式(如
/^[a-z0-9.-]+$/)
- 使用白名单协议(仅允许
- 网络隔离层:
- 后端请求器禁用非常用协议(如PHP的
allow_url_fopen=Off) - 配置防火墙规则阻止出站流量到内网IP段
- 后端请求器禁用非常用协议(如PHP的
- 云环境加固:
- 限制元数据API的访问(如AWS IMDSv2需携带Token)
- 使用安全组策略阻断实例的元数据访问
- 动态检测层:
- 部署WAF规则识别异常URL模式(如数字IP编码)
- 日志监控高频元数据API请求行为
- 输入验证层:
-
进阶防护技术
- DNS重绑定防护:
解析用户提交域名的A记录,校验是否指向内网IP - 请求结果过滤:
禁止返回响应内容中的敏感信息(如云元数据密钥) - 沙箱化请求:
使用独立容器发起外部请求,隔离网络权限
- DNS重绑定防护:
总结
进阶SSRF防护需结合输入验证、网络架构安全、运行时检测等多层防御。开发中应遵循"最小权限原则",确保后端请求器仅能访问必要的网络资源,并通过持续渗透测试验证防护有效性。