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配置文件获取密码

利用方式

  1. 备份数据库写入payload:

    • webshell写入
    • 计划任务写入(注意不同Linux系统的限制)
    • SSH公钥写入
  2. 主从复制:

    • 同步数据写入
    • 可写入二进制文件

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. 云服务器元数据

亚马逊云

  1. 获取IAM角色名:
    http://169.254.169.254/latest/meta-data/iam/security-credentials
    
  2. 获取临时凭据:
    http://169.254.169.254/latest/meta-data/iam/security-credentials/<role-name>
    

阿里云

  1. 获取RAM角色名:
    http://100.100.100.200/latest/meta-data/ram/security-credentials/
    
  2. 获取凭据:
    http://100.100.100.200/latest/meta-data/ram/security-credentials/<role-name>
    
    仅支持GET请求

腾讯云

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代码

利用条件

  1. 知道服务器上一个已知的PHP文件路径
  2. 可构造完整二进制数据的SSRF点(如Gopher协议)
  3. 开启allow_url_include

攻击步骤

  1. 构造恶意CGI请求
  2. 设置SCRIPT_FILENAME指向已知PHP文件
  3. 设置PHP_VALUE/PHP_ADMIN_VALUE环境变量
  4. 通过auto_prepend_file执行任意代码

6. Java SSRF的NTLM Relay

利用条件

  • JDK版本低于8u351
  • 存在401认证请求

攻击流程

  1. 通过SSRF触发NTLM认证
  2. 使用当前用户凭据进行认证
  3. Relay到LDAP服务
  4. 利用RBCD特性修改委派属性
  5. 申请高权限票据获取目标机器权限

0x02 代码层面分析

PHP实现方式

  1. file_get_contents

    • 无回显(需代码写回显)
    • 支持协议:http(GET)、file、ftp
  2. fsockopen

    • 无回显(需代码写回显)
    • 可自定义TCP数据流,发送任意数据
  3. 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 防御措施

  1. 输入验证

    • 严格校验请求的URL和协议
    • 禁止file、gopher、dict等危险协议
  2. 黑白名单

    • 设置允许访问的域名/IP白名单
    • 屏蔽内网IP段(注意绕过技巧)
  3. 协议限制

    • 根据业务需要限制可用协议
    • 禁用非常用协议
  4. 认证加固

    • 对内部服务实施认证机制
    • 避免使用默认凭据
  5. 更新修复

    • 及时更新存在漏洞的组件
    • 修复已知的SSRF漏洞
  6. 网络隔离

    • 实施严格的网络分区
    • 限制服务器出站连接
  7. 日志监控

    • 记录所有外部请求
    • 监控异常请求模式

0x06 总结

SSRF漏洞危害严重,可导致内网渗透、敏感信息泄露等风险。防御需要从多个层面入手,包括输入验证、协议限制、网络隔离等。攻击者则需根据目标环境灵活运用各种技巧,如协议伪造、CRLF注入、锚点利用等。

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角色名: 获取临时凭据: 阿里云 : 获取RAM角色名: 获取凭据: 仅支持GET请求 腾讯云 : 支持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' 时: 锚点后的内容不会发送到服务端 3. SSRF分类利用 按回显分类 : 有回显:可直接获取信息 无回显:需使用布尔或延时判断 按数据构造能力分类 : 完整二进制数据(如Gopher):可用于严格协议伪造 仅GET请求:限制较大,只能用于支持GET的漏洞点 4. CTF中的特殊技巧 配合FTP模式利用 参考案例:https://www.anquanke.com/post/id/254387#h3-2 0x04 常见组件漏洞实例 1. Weblogic SSRF 漏洞特征 : 存在CRLF注入 可构造POST请求但data不可控 利用方式 : 结合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注入、锚点利用等。