FastjsonScan4Burp 一款基于burp被动扫描的fastjson漏洞探测插件,可针对数据包中的存在json的参数或请求体进行payload测试。旨在帮助安全人员更加便捷的发现、探测、深入利用fastjson漏洞,目前以实现fastjson探测、版本探测、依赖探测以及出网及不出网利用和简易的bypass waf功能。
参考代码及检测思路:
https://github.com/pmiaowu/BurpFastJsonScan
https://github.com/lemono0/FastJsonParty
https://github.com/safe6Sec/Fastjson
0228:1.修复加载插件后导致列表插件后的其他插件不可用情况 2.修复了yml文件生成时可能出现报错的情况,添加utf-8标准读取文件
目前插件具有的功能模块:
- 低感知探测扫描
- 出网扫描
- 不出网扫描
- fastjson版本探测
- fastjson依赖探测
- bypass waf模块
- dns平台实时切换
插件会自动发现数据包GET/POST请求中包含有json的value或请求体是否为Content-Type:application/json。判断依据为是否包含有{}或[]
GET中value存在json
POST中value存在json
Content-Type为json(以下案例均是,不多赘述)
检测出json后,默认会调用fastjson探测、远程命令执行探测及不出网探测,各模块扫描原理详见下文。
初次加载会在当前目录下创建resources/config.yml文件。
基本设置如下,默认情况下不开启bypass waf模块,可根据实际勾选
插件会被动式地对数据包进行扫描,只需要启动插件后正常浏览数据包即可。插件扫描队列界面会对扫描结果进行展示。
- extensionMethod:调用的扫描模块名称
- issue:扫描结果

部分情况下想对单一某个数据包进行漏洞验证或其他原因,可以在repeater右键选择对应插件选择扫描或探测
或者使用doPassive再次进行被动扫描

当出现dnslog error时,不需要更改config.yml,可直接在设置中切换dnslog平台,并进行下一轮扫描。其中ceye平台和eyes.sh平台需要在config.yml中配置对应token和Identify

除了在burp中的issue中以及插件界面外,还会在插件部署目录下的resources文件夹中生成result.txt文件

被动扫描默认会调用低感知扫描、出网及不出网扫描,探测模块则存在于repeater右键中。
敏感环境下可开启bypass waf选项,并关闭命令回显拓展和远程命令拓展,仅保留低感知fastjson扫描。
主要作用类似于xiasql插件,去探测是否使用了fastjson。尽量以相对较少、较低敏的payload对目标进行扫描。
判断方式如下:
-
使用出网探测payload,查看dns url是否有解析记录 注:使用如下payload且dnslog有数据不代表有漏洞,仅能证明使用了fastjson
{"@type":"java.net.Inet4Address","val":"dnslog-url"}
{{"@type":"java.net.URL","val":"http://dnslog-url"}:"x"}
{"@type":"java.net.InetSocketAddress"{"address":,"val":"dnslog-url"}}
对应config.yml扫描模块如下:dnslogPayloads
可自定义

对应config.yml扫描模块如下:payloads
可自定义

对应config.yml扫描模块如下:payloads
和commandInputPointField
可自定义。commandInputPointField
为插入的header头,通过java回显来判断是否存在漏洞

添加了c3p0和Bcel下的java回现利用payload。其中c3p0二次反序列化调用的是fastjson1.x原生利用链

对应config.yml扫描模块如下:regexPayloads
和dnsLogPayloads
可自定义。

探测模块使用仅在右键repeater中


探测原理:
- 优先使用
{"@type":"java.lang.AutoCloseable"
,通过左侧的正则去匹配响应包报错版本号(版本1.2.76之后,其报错显示也是1.2.76,不会发生改变) - 通过对应dnslog去匹配版本
在自定义dnsLogPayloads时,可编辑 ;左侧内容为任意版本。例如当发现了fastjon2.2版本对应的出网poc为{"anything":"xaga.dnslog.cn"}
。则添加payload为
- "version=2.2; payload={\"anything\":\"dnslog-url\"}"
对应config.yml扫描模块如下:libraries
依赖可自定义。



原理则是通过Character转换报错,通过接口回显结果来进行判断
{
"x": {
"@type": "java.lang.Character"{
"@type": "java.lang.Class",
"val": ""
}}
判断条件一:页面有对应类报错回显,则代表存在依赖

判断条件二:无报错回显则基于响应包进行布尔判断 先发送一个不存在的依赖,记录下响应包结果

再对依赖进行fuzz,通过响应包文本相似度(Levenshtein 距离算法)进行比较判断,来得出是否包含该依赖


通过gson解析json格式,对key、value添加下划线后进行unicode、hex混合编码,在原有json基础上添加注释换行符。针对无法解析的json payload则对@type进行同上编码,在原有json基础上添加注释换行符。
ps:因为一些bypass姿势可能会影响payload的正确率,因此只使用了部分bypass方式。
以https://github.com/lemono0/FastJsonParty/blob/main/1247-jndi-waf/write-up.md环境为例

