【干货分享】FastJson三条调用链分析

admin 2023年1月30日20:45:44评论38 views字数 3038阅读10分7秒阅读模式


【干货分享】FastJson三条调用链分析

戟星安全实验室


    忆享科技旗下高端的网络安全攻防服务团队.安服内容包括渗透测试、代码审计、应急响应、漏洞研究、威胁情报、安全运维、攻防演练等

本文约2910字,30图,阅读约需8分钟。




【干货分享】FastJson三条调用链分析

前言


上一篇原理分析文章只写了一条链的分析。今天把剩下的两条链也写一下。

fastjson反序列化漏洞原理分析

Me5,公众号:戟星安全实验室【干货】Fastjson反序列化漏洞原理分析

三条常用的链:JdbcRowSetImplTemplatesImplBasicDataSource


JdbcRowSetImpl链,在上文中有写过了,这里就不再写了。本篇文章主要写TemplatesImplBasicDataSource 两条链。



【干货分享】FastJson三条调用链分析

TemplatesImpl


Payload:

【干货分享】FastJson三条调用链分析

注意其中的Payload来自于恶意类,该类应该继承自com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet

【干货分享】FastJson三条调用链分析

类似第一条链,使用两个对象绕过,其中的Payload为恶意类的字节码再Base64编码的结果,给出简易的py脚本

【干货分享】FastJson三条调用链分析

该链需要开启Feature.SupportNonPublicField参数再反射设置属性,查看官方说明,如果某属性不存在set方法,但还想设置值时,需要开启该参数,这里的情况正好符合,而实际项目中很少出现这种情况,导致该链较鸡肋,没有实际的意义(其实TemplateImpl类中有set方法,比如setTransletBytecodes,但是名称和Bytecodes不一致)

在com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.parseField设置属性时会有判断

【干货分享】FastJson三条调用链分析

反序列化时,fastjson中会把”_”开头的属性替换为空。并在outputProperties设置值时调用getOutputProperties

【干货分享】FastJson三条调用链分析

调用到com.sun.org.apache.xalan.internal.xsltc.trax.newTransformer方法

【干货分享】FastJson三条调用链分析

跟入getTransletInstance

【干货分享】FastJson三条调用链分析

再跟入defineTransletClasses,对父类进行了验证,这样解释了为什么Payload恶意类要继承自该类。如果验证没有问题,将在上方的newInstance方法中实例化该类,造成RCE

【干货分享】FastJson三条调用链分析

为什么_bytescode要对字节码进行base64编码?反序列化的过程中会调用很多类,在经过该类com.alibaba.fastjson.serializer.ObjectArrayCodec.deserialze的时候,会对字段进行一次base64的解码

【干货分享】FastJson三条调用链分析

跟入lexer.bytesValue()方法,看到decodeBase64

【干货分享】FastJson三条调用链分析


总结:

•TemplatesImpl类是Java反序列化界比较常用的类,更容易理解和上手

•需要开启Feature.SupportNonPublicField,实战中不适用



【干货分享】FastJson三条调用链分析

BasicDataSource



Payload:

【干货分享】FastJson三条调用链分析

这个Payload适用于1.2.37版本,并且需要导入Tomcat相关的包

【干货分享】FastJson三条调用链分析

生成driverClassName的工具如下

【干货分享】FastJson三条调用链分析

关于com.sun.org.apache.bcel.internal.util.ClassLoader参考P师傅(phith0n)的《Java安全漫谈》

BCEL的全名是Apache Commons BCEL,Apache Commons项目下的一个子项目,包含在JDK的原生库中。我们可以通过BCEL提供的两个类 Repository 和 Utility 来利用:Repository 用于将一个Java Class先转换成原生字节码,当然这里也可以直接使用javac命令来编译java文件生成字节码;Utility 用于将原生的字节码转换成BCEL格式的字节码。


生成的BCEL格式大概如下:

$$BCEL$$$l$8b$I$A$A$A$A$A$A$AmQ$......

将这种格式的字符串,作为“字节码”传入new ClassLoader().loadClass(code).newInstance();将会被实例化,当我们在Fastjson反序列化中构造出这种链,将会造成反序列化漏洞。

回到Payload,开头一部分用于绕Fastjson黑白名单,没有什么特殊的意义,核心部分如下:

【干货分享】FastJson三条调用链分析


这个版本利用的是$ref这个特性:fastjson版本>=1.2.36时,我们可以使用$ref的方式来调用任意的getter,比如这个Payload调用的是x.y.c.connectionx是这个大对象,最终调用的是c对象的connection方法,也就是BasicDataSource.connection

参考代码

com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze:591

【干货分享】FastJson三条调用链分析


漏洞的触发点在com.alibaba.fastjson.JSON.parse:154


【干货分享】FastJson三条调用链分析


跟入com.alibaba.fastjson.parser.DefaultJSONParser.handleResovleTask:1465


【干货分享】FastJson三条调用链分析

跟入JSONPath.eval,这里的segement数组中的是[x,y,c,connection]


【干货分享】FastJson三条调用链分析


到达com.alibaba.fastjson.JSONPath:1350

【干货分享】FastJson三条调用链分析

继续跟入path.getPropertyValue

【干货分享】FastJson三条调用链分析

跟入com.alibaba.fastjson.serializer.JavaBeanSerializer:439

【干货分享】FastJson三条调用链分析

跟入com.alibaba.fastjson.serializer.FieldSerializer:145

【干货分享】FastJson三条调用链分析


到达com.alibaba.fastjson.util.FieldInfo,达到最终触发点:method.invoke


【干货分享】FastJson三条调用链分析


看到这里的javaObject正是BasicDataSouce


【干货分享】FastJson三条调用链分析


回到BasicDataSource本身


【干货分享】FastJson三条调用链分析


【干货分享】FastJson三条调用链分析


【干货分享】FastJson三条调用链分析


最终触发点,其中driverClassName和driverClassLoader都是可控的,由用户输入,指定ClassLoader为com.sun.org.apache.bcel.internal.util.ClassLoader,设置ClassName为BCEL...这种格式后,在newInstance方法执行后被实例化。第二个参数initial为true时,类加载后将会直接执行static{}块中的代码。


【干货分享】FastJson三条调用链分析


总结:

•不需要出网,不需要开启特殊的参数,适用范围较广

•目标需要引入tomcat依赖,虽说比较常见,但也是一种限制


fastjson基础原理篇

Me5,公众号:戟星安全实验室【干货】Fastjson反序列化漏洞原理分析










 声明

    由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,戟星安全实验室及文章作者不为此承担任何责任。

    戟星安全实验室拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经戟星安全实验室允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。


【干货分享】FastJson三条调用链分析

戟星安全实验室

# 长按二维码 关注我们 #



原文始发于微信公众号(戟星安全实验室):【干货分享】FastJson三条调用链分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年1月30日20:45:44
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【干货分享】FastJson三条调用链分析https://cn-sec.com/archives/1349424.html

发表评论

匿名网友 填写信息