java反序列化数据过滤

前言:

        反序列化漏洞的危害稍微了解一点的都知道,如果能找到前端某处存在反序列化漏洞,那基本上距离拿下服务器仅一步之遥,这个时候我们可以通过继承ObjectInputFilter添加tFilter实现对所有反序列化类的校验,当然这个需要java的高版本才支持jep290,或者我们可以针对需要进行反序列化的接口对将要反序列化的数据进行过滤,这样可以防止如果我们通过全局设置导致项目代码出现未知问题,并且可以针对暴露点进行比较严格的校验。

        可以通过设置jep290来对一些高危险的类进行过滤,再配合继承ObjectInputStream实现对反序列化数据的精准严格过滤,这样可以最大限度的保证服务器的安全。

代码:

我们可以通过实现继承ObjectInputStream来实现对序列化数据的过滤,代码如下:

package com.example.seriallzpayload.controller;import java.io.*;public class FilteringObjectInputStream extends ObjectInputStream {private String[] forbidClasses;public FilteringObjectInputStream(InputStream in) throws IOException {super(in);String[] stringArray = {"java.net.URL","bsh.XThis","bsh.Interpreter","com.mchange.v2.c3p0.PoolBackedDataSource","com.mchange.v2.c3p0.impl.PoolBackedDataSourceBase","clojure.lang.PersistentArrayMap","clojure.inspector.proxy$javax.swing.table.AbstractTableModel$ff19274a","org.apache.commons.beanutils.BeanComparator","org.apache.commons.collections.Transformer","org.apache.commons.collections.functors.ChainedTransformer","org.apache.commons.collections.functors.ConstantTransformer","org.apache.commons.collections.functors.InstantiateTransformer","org.apache.commons.collections.map.LazyMap","org.apache.commons.collections.functors.InvokerTransformer","org.apache.commons.collections.keyvalue.TiedMapEntry","org.apache.commons.collections4.comparators.TransformingComparator","org.apache.commons.collections4.functors.InvokerTransformer","org.apache.commons.collections4.functors.ChainedTransformer","org.apache.commons.collections4.functors.ConstantTransformer","org.apache.commons.collections4.functors.InstantiateTransformer","org.apache.commons.fileupload.disk.DiskFileItem","org.apache.commons.io.output.DeferredFileOutputStream","org.apache.commons.io.output.ThresholdingOutputStream","org.apache.wicket.util.upload.DiskFileItem","org.apache.wicket.util.io.DeferredFileOutputStream","org.apache.wicket.util.io.ThresholdingOutputStream","org.codehaus.groovy.runtime.ConvertedClosure","org.codehaus.groovy.runtime.MethodClosure","org.hibernate.engine.spi.TypedValue","org.hibernate.tuple.component.AbstractComponentTuplizer","org.hibernate.tuple.component.PojoComponentTuplizer","org.hibernate.type.AbstractType","org.hibernate.type.ComponentType","org.hibernate.type.Type","org.hibernate.EntityMode","com.sun.rowset.JdbcRowSetImpl","org.jboss.interceptor.builder.InterceptionModelBuilder","org.jboss.interceptor.builder.MethodReference","org.jboss.interceptor.proxy.DefaultInvocationContextFactory","org.jboss.interceptor.proxy.InterceptorMethodHandler","org.jboss.interceptor.reader.ClassMetadataInterceptorReference","org.jboss.interceptor.reader.DefaultMethodMetadata","org.jboss.interceptor.reader.ReflectiveClassMetadata","org.jboss.interceptor.reader.SimpleInterceptorMetadata","org.jboss.interceptor.spi.instance.InterceptorInstantiator","org.jboss.interceptor.spi.metadata.InterceptorReference","org.jboss.interceptor.spi.metadata.MethodMetadata","org.jboss.interceptor.spi.model.InterceptionType","org.jboss.interceptor.spi.model.InterceptionModel","sun.rmi.server.UnicastRef","sun.rmi.transport.LiveRef","sun.rmi.transport.tcp.TCPEndpoint","java.rmi.server.RemoteObject","java.rmi.server.RemoteRef","java.rmi.server.UnicastRemoteObject","sun.rmi.server.ActivationGroupImpl","sun.rmi.server.UnicastServerRef","org.springframework.aop.framework.AdvisedSupport","net.sf.json.JSONObject","org.jboss.weld.interceptor.builder.InterceptionModelBuilder","org.jboss.weld.interceptor.builder.MethodReference","org.jboss.weld.interceptor.proxy.DefaultInvocationContextFactory","org.jboss.weld.interceptor.proxy.InterceptorMethodHandler","org.jboss.weld.interceptor.reader.ClassMetadataInterceptorReference","org.jboss.weld.interceptor.reader.DefaultMethodMetadata","org.jboss.weld.interceptor.reader.ReflectiveClassMetadata","org.jboss.weld.interceptor.reader.SimpleInterceptorMetadata","org.jboss.weld.interceptor.spi.instance.InterceptorInstantiator","org.jboss.weld.interceptor.spi.metadata.InterceptorReference","org.jboss.weld.interceptor.spi.metadata.MethodMetadata","org.jboss.weld.interceptor.spi.model.InterceptionModel","org.jboss.weld.interceptor.spi.model.InterceptionType","org.python.core.PyObject","org.python.core.PyBytecode","org.python.core.PyFunction","org.mozilla.javascript.**","org.apache.myfaces.context.servlet.FacesContextImpl","org.apache.myfaces.context.servlet.FacesContextImplBase","org.apache.myfaces.el.CompositeELResolver","org.apache.myfaces.el.unified.FacesELContext","org.apache.myfaces.view.facelets.el.ValueExpressionMethodExpression","com.sun.syndication.feed.impl.ObjectBean","org.springframework.beans.factory.ObjectFactory","org.springframework.aop.framework.AdvisedSupport","org.springframework.aop.target.SingletonTargetSource","com.vaadin.data.util.NestedMethodProperty","com.vaadin.data.util.PropertysetItem"};String[] stringArray1 = {};this.forbidClasses = stringArray;}@Overrideprotected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException {String className = desc.getName();// 检查类名是否在不允许的类列表中for (String forbidClass : forbidClasses) {if (className.equals(forbidClass)) {throw new InvalidClassException("Unauthorized deserialization attempt: " + className);}}// 如果类名被允许,则使用默认的类解析逻辑return super.resolveClass(desc);}
}

其中的黑名单内容是根据ysoserial的调用链提取出来的,来源为如下地址:

https://github.com/mogwailabs/deserialization-filter-blacklists/blob/master/blacklist-filter.properties

由于大部分测试是否存在反序列化问题采用的是URLDNS攻击链,所以添加了对java.net.URL的过滤,代价就是不能调用URL类下的方法,需要注意。

代码原理就是我们通过重写了resolveClass方法,为什么要重写resolveClass,先看看源代码中哪里调用了resolveClass方法:

让数据首先进入我们的函数进行一次校验,这里严格点可以采用白名单校验,我这里采用黑名单校验,如果存在在列表中就抛出异常,否则就执行。

调用:

调用的时候我们只需要将序列化数据传入上述函数即可:

    @RequestMapping(value = "/jep290")public ModelAndView TryJep(HttpServletRequest request, HttpServletResponse response) throws Exception {String filename= request.getParameter("filename");// 进行反序列化操作FileInputStream serializedData = new FileInputStream(filename);FilteringObjectInputStream objIn = new FilteringObjectInputStream(serializedData);Object obj = objIn.readObject();serializedData.close();ModelAndView mv = new ModelAndView();mv.setViewName("index");return mv;}

当我们执行URLDNS序列化数据的时候,检测到存在调用java.net.URL就会报错:

结尾:

代码很简单,最安全的是采用白名单,可以防止被绕过,通过继承 ObjectInputStream可以实现对接口的精准过滤,防止通过jep290过滤太严格影响代码的正常运行,毕竟后端服务器也有很多需要序列化的地方,所以两个配合才能更好的防御反序列化漏洞。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式行业是否会面临中年危机?

今日话题&#xff1a;嵌入式行业是否会面临中年危机&#xff1f;事实上&#xff0c;无论你在哪个行业工作&#xff0c;都可能面临下岗风险。因此&#xff0c;我的建议是选择一个有前景、发展空间大的行业和方向&#xff0c;并不断提升自己的技能价值。为了帮助你在嵌入式领域取…

perl处理json的序列化和反序列化

perl可以使用JSON模块很方便的处理json的序列化和反序列化。先来一段简单的例子&#xff1a; #! /usr/bin/perl use v5.14; use JSON; use IO::File;my $info {id > 1024,desc > hello world,arry > [1, 2, 3, 4, 5],obj > {char > [ A, B, C ]} };say to_jso…

个人介绍以及毕业去向

CSDN陪伴我从大一到大四&#xff0c;后面也会接着用 写一点大学四年的总结 #总结#理工科#留学 211大学 弃保出国 智能科学与技术 均分88.9 EI论文一篇 数学竞赛和数学建模均为省二 大创评为国家级 全国大学生计算机设计大赛国家三等奖 百度Paddle、大疆RoboMaster、Phytium Te…

2 mysql主从复制配置

1、节点以及网络配置 前置条件&#xff1a; 已经在linux上安装好了一主一从或者一主多从的mysql 2、具体配置 主服务器 172.20.0.2 从服务器 172.20.0.3 首先主机mysql配置&#xff1a; 打开mysqld.cnf&#xff1a; 添加如下配置&#xff1a; # 主服务器ID 必须唯一 serve…

硕士论文写的重复率 PaperBERT

大家好&#xff0c;今天来聊聊硕士论文写的重复率&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 硕士论文写的重复率 1. 硕士论文的重要性 硕士论文是硕士阶段最重要的学术成果之一&#xff0c;它不仅…

基于ssm四六级报名与成绩查询系统论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对四六级报名信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性…

UE4 图片环形轮播 蓝图

【需求】 图片环形轮播 任意图片之间相互切换 切换图片所需时间均为1s 两个图片之间切换使用就近原则 播放丝滑无闪跳 【Actor的组成】 每个图片的轴心都在原点 【蓝图节点】

记录 | linux安装Manim

linux 安装 Manim sudo apt update sudo apt install build-essential python3-dev libcairo2-dev libpango1.0-dev ffmpeg sudo apt install xdg-utilsconda create manim_py39 python3.9 conda activate manim_py39pip install manim安装好环境后来测试一个例程&#xff0c;…

ECS省钱指南来啦!万字长文教你如何选择与业务形态最匹配的付费方式

为了更好的帮助用户在使用DevOps缩短开发周期、提升业务效率的同时&#xff0c;也能让业务保持稳定、安全、可靠&#xff0c;且低成本的持续运营&#xff0c;阿里云弹性计算团队独家出品的【弹性计算技术公开课_CloudOps云上运维季】正式启动。阿里云弹性计算内部13位产品&…

接口测试 — 1.接口和接口文档概念

1、接口的概念 接口又叫API&#xff0c;全称application programming interface&#xff1a;应用程序接口&#xff08;规范&#xff09;&#xff0c;也就是我们经常会听说Web接口&#xff0c;APP接口。 详细说明&#xff1a; APP是一种基于C/S架构的应用程序&#xff0c;如抖音…

MYSQL练题笔记-子查询-电影评分

一、题目相关内容 1&#xff09;相关的表 2&#xff09;题目 3&#xff09;帮助理解题目的示例&#xff0c;提供返回结果的格式 二、自己初步的理解 1.字典序是指从前到后比较两个字符串大小的方法。 首先比较第1个字符&#xff0c;如果不同则第1个字符较小的字符串更小&…

Retrofit嵌套请求与适配器

一、前言&#xff1a; 1. retrofit嵌套请求 在实际开发中&#xff0c;可能会存在&#xff1a;需要先请求A接口&#xff0c;在请求B接口的情况&#xff0c;比如进入“玩android”网页请求获取收藏文章列表&#xff0c;但是需要先登录拿到Cookie才能请求搜藏文章几口&am…

day01、什么是数据库系统?

数据库系统介绍 1.实例化与抽象化数据库系统2.从用户角度看数据库管理系统的功能2.1 数据库定义功能2.2 数据库操纵2.3 数据库控制2.4 数据库维护功能2.5 数据库语言与高级语言 3.从系统&#xff1a;数据库管理系统应具有什么功能 来源于战德臣的B站网课 1.实例化与抽象化数据库…

Node.js 事件循环简单介绍

1.简介 Node.js 事件循环是 Node.js 运行时环境中的一个核心机制&#xff0c;用于管理异步操作和回调函数的执行顺序。它基于事件驱动模型&#xff0c;通过事件循环来处理和派发事件&#xff0c;以及执行相应的回调函数。 Node.js 是单进程单线程应用程序&#xff0c;但是因为…

QT QIFW Windows下制作安装包(一)

一、概述 1、QIFW是一款基于QT框架开发的跨平台安装框架。QIFW是QT Installer FrameWork的缩写&#xff0c;支持Windows、Linux和macos等多种平台。QIFW可以帮助开发者创建自己的安装程序&#xff0c;将它们打包到通用的安装包中&#xff0c;并提供可视化的界面进行安装。 2…

mysql:用SHOW CREATE TABLE tbl_name查看创建表的SQL语句

https://dev.mysql.com/doc/refman/8.2/en/show-create-table.html 可以用SHOW CREATE TABLE tbl_name查看创建表的SQL语句。 例如&#xff0c;SHOW CREATE TABLE test_table;表示查询创建test_table表的SQL语句&#xff1a;

刘元昌:期待更多年轻人的第一杯精酿是失眠企鹅

12月7日下午&#xff0c;2023&#xff08;第十八届&#xff09;大河财富中国论坛盛大开启。作为先行论坛&#xff0c;2023新消费峰会火热开场。此次峰会以“提质新消费 释放新活力”为主题&#xff0c;集论坛、演绎、展示、互动为一体&#xff0c;把峰会变身“秀场”&#xff0…

腾讯-轻量应用服务器centos7中宝塔安装MySQL8.0出现内存不足

目录 前言 出现的问题: 解决方法&#xff1a; 编译安装&#xff1a; 极速安装 其他 我的其他博客 前言 说实话&#xff0c;本人也就是个穷学生买不起啥大的服务器啥的&#xff0c;整了个2核 2内存的服务器 用宝塔按mysql5.5是没问题的&#xff0c;一切换8.0就提醒内存不足…

UE5 - ArchvizExplorer与Map Border Collection结合 - 实现电子围栏效果

插件地址&#xff1a; https://www.unrealengine.com/marketplace/zh-CN/product/archviz-explorer https://www.unrealengine.com/marketplace/zh-CN/product/map-border-collection ArchvizExplorer扩展&#xff1a; https://download.csdn.net/download/qq_17523181/8843305…

freemarker+Aspose.word实现模板生成word并转成pdf

需求&#xff1a;动态生成pdf指定模板 实现途径&#xff1a;通过freemarker模板&#xff0c;导出word文档&#xff0c;同时可将word转为pdf。 技术选择思路 思路一&#xff1a;直接导出pdf 使用itext模板导出pdf 适用范围 业务生成的 pdf 是具有固定格式或者模板的文字及其…