SSRF攻防指北
字数 2798 2025-09-01 11:26:17
SSRF攻防指北 - 详细教学文档
0x00 前言
SSRF(Server-Side Request Forgery)是一种服务器端请求伪造漏洞,攻击者可以利用服务器作为代理发起内部或外部请求。本文将从攻击和防御两个角度,全面剖析SSRF漏洞的利用技巧和防护措施。
0x01 SSRF常见利用点
1. 文件读取
利用条件:支持file协议且有回显
Linux系统:
- 读取/proc目录下的敏感信息:
- /proc/self/environ - 运行环境
- /proc/self/cmdline - 命令行参数
- /proc/net/tcp - 端口信息
- 读取历史命令:~/.bash_history
- 读取日志文件:各种框架和web日志
PHP环境:
- 利用include特性下载PHP文件
- 读取session文件:/tmp/sess_[id]
Java环境:
- 下载单jar文件或web.xml
- 通过web.xml路由信息下载对应的class文件
- 利用import特性下载其他class文件
- 配置文件fuzz:jdbc、aliyun等配置文件
.NET环境:
- 读取web.config
- 结合machineKey进行反序列化攻击
实战技巧:
- 结合目录遍历漏洞获取物理路径
- 利用FCKeditor等存在列目录漏洞的组件
2. Redis利用
检测Redis服务:
- 检查/etc/passwd是否有redis用户
- 读取redis配置文件获取密码
利用方式:
-
备份数据库写入payload:
- webshell写入
- 计划任务写入(注意不同Linux系统的限制)
- SSH公钥写入
-
主从复制:
- 同步数据写入
- 可写入二进制文件
Redis协议分析:
- RESP协议格式简单,使用CRLF分段
- Redis兼容INLINE格式(不以*开头的命令)
- 只要能控制一行TCP数据即可与Redis通信
有密码情况利用:
- 使用pipeline方式一次发送多个请求
- HTTP协议可构造多行数据
- Gopher协议可直接利用
3. Axis利用
特征识别:
- 检查/axis/service/、/axis、/service、/services、/axis2等目录
- 白盒审计时查找关键字
利用方式:
- 配合SSRF访问adminService接口
- 支持GET和POST请求(GET更常用)
- 注意系统自带的特殊字符过滤
实战案例:
- 配合XXE等漏洞进行组合攻击
- 某些配置下可直接调用adminService(如Nginx配置不当)
4. 云服务器元数据
亚马逊云:
- 获取IAM角色名:
http://169.254.169.254/latest/meta-data/iam/security-credentials - 获取临时凭据:
http://169.254.169.254/latest/meta-data/iam/security-credentials/<role-name>
阿里云:
- 获取RAM角色名:
http://100.100.100.200/latest/meta-data/ram/security-credentials/ - 获取凭据:
仅支持GET请求http://100.100.100.200/latest/meta-data/ram/security-credentials/<role-name>
腾讯云:
http://metadata.tencentyun.com/latest/meta-data/cam/security-credentials/${role-name}
支持GET和POST请求
5. PHP-FPM利用
攻击原理:
- 伪造CGI协议让PHP-FPM解析恶意文件
- 利用PHP环境变量auto_prepend_file和auto_append_file
- 设置auto_prepend_file为php://input可执行POST代码
利用条件:
- 知道服务器上一个已知的PHP文件路径
- 可构造完整二进制数据的SSRF点(如Gopher协议)
- 开启allow_url_include
攻击步骤:
- 构造恶意CGI请求
- 设置SCRIPT_FILENAME指向已知PHP文件
- 设置PHP_VALUE/PHP_ADMIN_VALUE环境变量
- 通过auto_prepend_file执行任意代码
6. Java SSRF的NTLM Relay
利用条件:
- JDK版本低于8u351
- 存在401认证请求
攻击流程:
- 通过SSRF触发NTLM认证
- 使用当前用户凭据进行认证
- Relay到LDAP服务
- 利用RBCD特性修改委派属性
- 申请高权限票据获取目标机器权限
0x02 代码层面分析
PHP实现方式
-
file_get_contents:
- 无回显(需代码写回显)
- 支持协议:http(GET)、file、ftp
-
fsockopen:
- 无回显(需代码写回显)
- 可自定义TCP数据流,发送任意数据
-
curl_exec:
- 无回显(需代码写回显)
- 支持协议:dict、gopher、http、file、ftp
Java实现方式
支持协议:http, https, file, ftp, mailto, jar, netdoc
常用类:
- HttpURLConnection
- URLConnection
- Socket
.NET实现方式
支持协议:File、Http
常用类:
- HttpWebRequest
- HttpClient
- WebClient
- TcpClient
0x03 漏洞利用技巧
1. 利用CRLF注入
- 可用于攻击有密码的Redis
- 构造多行命令绕过认证限制
2. 利用锚点特性
当代码拼接URL如String url = ip + '/aaaaa'时:
127.0.0.1/#/aaaaa
锚点后的内容不会发送到服务端
3. SSRF分类利用
按回显分类:
- 有回显:可直接获取信息
- 无回显:需使用布尔或延时判断
按数据构造能力分类:
- 完整二进制数据(如Gopher):可用于严格协议伪造
- 仅GET请求:限制较大,只能用于支持GET的漏洞点
4. CTF中的特殊技巧
- 配合FTP模式利用
- 参考案例:https://www.anquanke.com/post/id/254387#h3-2
0x04 常见组件漏洞实例
1. Weblogic SSRF
漏洞特征:
- 存在CRLF注入
- 可构造POST请求但data不可控
利用方式:
http://localhost:7001/uddiexplorer/SearchPublicRegistries.jsp?operator=http://test.com/hello&rdoSearch=name&btnSubmit=Search
- 结合Redis特性自定义header完成攻击
2. Ueditor SSRF
漏洞特征:
- GET型可回显SSRF
- 某些版本有内网IP过滤
绕过方式:
- DNS重绑定
- 使用domain@ip格式
.NET版本:存在文件写入漏洞
JSP/PHP版本:存在SSRF漏洞
0x05 防御措施
-
输入验证:
- 严格校验请求的URL和协议
- 禁止file、gopher、dict等危险协议
-
黑白名单:
- 设置允许访问的域名/IP白名单
- 屏蔽内网IP段(注意绕过技巧)
-
协议限制:
- 根据业务需要限制可用协议
- 禁用非常用协议
-
认证加固:
- 对内部服务实施认证机制
- 避免使用默认凭据
-
更新修复:
- 及时更新存在漏洞的组件
- 修复已知的SSRF漏洞
-
网络隔离:
- 实施严格的网络分区
- 限制服务器出站连接
-
日志监控:
- 记录所有外部请求
- 监控异常请求模式
0x06 总结
SSRF漏洞危害严重,可导致内网渗透、敏感信息泄露等风险。防御需要从多个层面入手,包括输入验证、协议限制、网络隔离等。攻击者则需根据目标环境灵活运用各种技巧,如协议伪造、CRLF注入、锚点利用等。