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.hqwc.cn/news/268312.html

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

相关文章

mysql——数据库基础

目录 一.什么是数据库 二.主流的数据库 三.服务器&#xff0c;数据库&#xff0c;表关系 四.数据逻辑存储 五.MySQL架构 六.SQL语句分类 七.存储引擎 一.什么是数据库 存储数据用文件就可以了&#xff0c;为什么还要弄个数据库? 文件保存数据有以下几个缺点&#xff1…

java--Collection的常用方法

1.集合体系结构 ①Collection代表单列集合&#xff0c;每个元素(数据)只包含一个值 ②Map代表双列集合&#xff0c;每个元素包含两个值(键值对) 2.Collection集合体系 3.Collection集合特点 1.List系列集合&#xff1a;添加的元素是有序、可重复、有索引 ①ArrayList、Line…

聊聊国内的汽车改装现状以及SUV车型中的CAN数据改装应用

随着汽车个性化、文旅需求旺盛以及运动赛事的兴起及线下活动的参与&#xff0c;改装人群在不断扩大&#xff0c;国内改装行业也在不断发展&#xff0c;出现很多不同风格的&#xff0c;包括成文化、成体系的汽车改装。并且&#xff0c;在这里面孵化出很多优秀的公司&#xff0c;…

银行数据分析进阶篇:银行外呼业务数据分析与客户精准营销优化研究

上次和大家分享了“信用卡全生命周期分析”的案例&#xff0c;不少朋友都有正向的反馈&#xff0c;今天继续和大家分享我之前看到的银行数据分析的案例&#xff0c;这个案例结构清晰&#xff0c;内容详细&#xff0c;相信朋友们能很快掌握&#xff01; 01 需求痛点 我们先来了…

algorithm graphics

绘制地图坐标路线_哔哩哔哩_bilibili neo4j test-CSDN博客

第二证券:结构性行情或将延续 泛科技有望继续走强

展望未来&#xff0c;当时已进入重要的方针窗口期&#xff0c;能否有超预期的新方针推出是改变商场的要害。但复盘2023年的行情来看&#xff0c;过早买卖方针预期的成功率并不高&#xff0c;因而主张该方位以防御性资产为主&#xff0c;高股息资产从本年9月份至今现已调整了2个…

vue编辑页面提示 this file does not belong to the project

背景 打开vue项目工程 文件夹被锁定&#xff08;有黄色背景&#xff09;&#xff0c;编辑页面时&#xff0c;报错。 报错提示&#xff1a; vue编辑页面提示 this file does not belong to the project 原因 一不下心打开了错误的文件包 解决方案 1、删除.idea文件夹 2、…

RK3568驱动指南|第八篇 设备树插件-第74章 虚拟文件系统ConfigFS介绍

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

机器学习-KL散度的直观理解+代码

KL散度 直观理解&#xff1a;KL散度是一种衡量两个分布之间匹配程度的方法。通常在概率和统计中&#xff0c;我们会用更简单的近似分布来代替观察到的数据或复杂的分布&#xff0c;KL散度帮我们衡量在选择近似值时损失了多少信息。 在信息论或概率论中&#xff0c;KL散度&#…

AIGC专题报告:ChatGPT纪要分享

今天分享的AIGC系列深度研究报告&#xff1a;《AIGC专题报告&#xff1a;ChatGPT纪要分享》。 &#xff08;报告出品方&#xff1a;久谦中台&#xff09; 报告共计&#xff1a;135页 OpenAI 高管解密 ChatGPT GPT-3 是一种大型语言模型&#xff0c;被训练用来在给定上下文中…

东芝携手罗姆共同投资191亿元,共同生产功率芯片 | 百能云芯

日本东芝&#xff08;Toshiba&#xff09;集团与芯片制造商罗姆半导体集团&#xff08;Rohm&#xff09;近日宣布将共同生产功率芯片&#xff0c;总投资额达3883亿日元&#xff08;约人民币191亿元&#xff09;&#xff0c;这一举措旨在通过扩大生产规模&#xff0c;提高成本竞…

IntelliJ IDEA 2023.3 最新版如何试用?IntelliJ IDEA 2023.3 最新版试用方法

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…