Fastjson 1.2.45 到 1.2.47 版本的漏洞复现实验,我把整个实操过程和遇到的问题整理了一下,分享给同样在研究 Fastjson 漏洞的朋友,也当作自己的学习笔记。
一、Fastjson1.2.45版本
1.FastJson全版本Docker漏洞环境:https://github.com/lemono0/FastJsonParty
2.进入该版本的目录后docker compose up -d启动docker环境
3.打开后如图,我们登录并抓包,右键发送到重放器,发现是json格式


4.我们构造报错看看(删除最后一个花括号),确认是fastjson

**syntax error, position at X, name Y是最典型的fastjson特征**
5.fastjson版本探测,我们拼接payload(同样不加花括号),发现是1.2.45版本

6.接着我们探测java版本(不同版本的Java其内置的类库和可利用的链版本是完全不同的)
构造函数
{
"@type": "java.lang.Class",
"val": "一个不存在的类名,例如com.example.nonexistent"
}
| Java 版本 | 响应特征 |
|
| HTTP 状态码 200,无异常或错误信息包含 |
|
| HTTP 状态码 500,错误信息包含 |
|
| HTTP 状态码 500,错误信息不包含 |

7.确定了是高版本JDK,所以我们使用JNDIBypass.jar 工具。

我们先打开kali开始监听9001端口

发现反弹不到shell

8.换个方式,我们把JNDIBypass.jar工具放到公网上,执行命令,在请求包中构造请求,连接JNDIBypass.jar给的链接

9.成功连接

二、Fastjson1.2.47版本
1.启docker环境,进入页面

2.抓包分析,确认使用了fastjson

3.确定版本

4.判断出网
{
"@type":"java.net.Inet4Address",
"val":"yomiom.dnslog.cn"
}

5.尝试注入冰蟹马

6.连接成功

三、Fastjson1.2.47版本存在WAF
1.启docker环境,进入页面

2.抓包分析,确认使用了fastjson

3.确定版本,发现hacker!这个字眼,说明存在WAF

4.我们编码尝试一下(尝试使用unicode或者hex编码来处理payload,因为fastjson默认解析这两种编码。)使用unicode编码发现绕过成功

5.判断出网,还是编码绕过


6.那么我们还是注入冰蟹码,这里拼接payload的时候我们使用yakit(编码方便)


7.我们使用冰蝎连接,连接成功

这次实验下来,发现 Fastjson 1.2.45 和 1.2.47 版本的漏洞利用思路大体一致,遇到 WAF 时,利用 Fastjson 对编码的原生支持做关键字绕过,是很直接有效的方法。
大家有问题可以在评论区交流,欢迎大家点赞收藏~
(提示:测试一定要在合法授权的环境下进行,禁止未经允许测试他人网站,遵守法律和道德底线!)
1049

被折叠的 条评论
为什么被折叠?



