java反序列化漏洞(如何修复webphere java反序列化漏洞)

:暂无数据 2026-07-04 01:30:02 :0

java反序列化漏洞(如何修复webphere java反序列化漏洞)

“java反序列化漏洞”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看java反序列化漏洞(如何修复webphere java反序列化漏洞)!

本文目录

如何修复webphere java反序列化漏洞

1,装个电脑管家到电脑上
2,然后打开工具箱,找到修复漏洞的功能
3,最后对检测出来的电脑漏洞,一键修复就可以了

序列化与反序列化

把对象转换为字节序列的过程称为对象的序列化 。
   把字节序列恢复为对象的过程称为对象的反序列化 。
  对象的序列化主要有两种用途:
  1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
  2) 在网络上传送对象的字节序列。

在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。

当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。

java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。
  java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。
  只有实现了Serializable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自 Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以 采用默认的序列化方式 。
  对象序列化包括如下步骤:
  1) 创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流;
  2) 通过对象输出流的writeObject()方法写对象。

对象反序列化的步骤如下:
  1) 创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流;
  2) 通过对象输入流的readObject()方法读取对象。

输出如下

输出如下

在序列化时显示指定serialVersionUID作为版本号,凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量,如果不显示指定,jvm会隐式给我们随机生成一个serialVersionUID,这个serialVersionUID是根据对象的信息生成的,如果我们对序列化对象有所改动的话,serialVersionUID也会随之改动,再反序列化就会因serialVersionUID不一致而报错、
示例:

序列化和反序列化跟上面一样

反序列化

此时是正常且成功的,但是,我们如果现在在User对象新增一个属性

上面我说,serialVersionUID是根据对象信息生成的,现在对象多了一个属性,信息已经改变,再次生成的serialVersionUID 已经和刚才的不一样了,这时我们再进行反序列化会报如下错误

我们指定serialVersionUID后就可以随意修改了

北大青鸟设计培训:如何防止java编程语言序列化网络攻击

***隐藏网址***
什么是序列化?自从1997年发布JDK1.1以来,序列化已经存在于Java平台中。
它用于在套接字之间共享对象表示,或者将对象及其状态保存起来以供将来使用(反序列化)。
在JDK10及更低版本中,序列化作为java.base包和java.io.Serializable方法的一部分存在于所有的系统中。
序列化的挑战和局限序列化的局限主要表现在以下两个方面:出现了新的对象传输策略,例如JSON、XML、ApacheAvro、ProtocolBuffers等。
1997年的序列化策略无法预见现代互联网服务的构建和攻击方式。
进行序列化漏洞攻击的基本前提是找到对反序列化的数据执行特权操作的类,然后传给它们恶意的代码。
序列化在哪里?如何知道我的应用程序是否用到了序列化?要移除序列化,需要从java.io包开始,这个包是java.base模块的一部分。
常见的使用场景是:实现Serializable接口和(可选)serialversionuid长整型字段。
使用ObjectInputStream或ObjectOutputStream。
使用严重依赖序列化的库,例如:Xstream、Kryo、BlazeDS和大多数应用程序服务器。
使用这些方法的开发人员应考虑使用其他存储和读回数据的替代方法。
EishaySmith发布了几个不同序列化库的性能指标。
在评估性能时,需要在基准度量指标中包含安全方面的考虑。
默认的Java序列化“更快”一些,但漏洞也会以同样的速度找上门来。
我们该如何降低序列化缺陷的影响?项目Amber包含了一个关于将序列化API隔离出来的讨论。
我们的想法是将序列化从java.base移动到单独的模块,这样应用程序就可以完全移除它。
在确定JDK11功能集时并没有针对该提议得出任何结果,但可能会在未来的Java版本中继续进行讨论。
通过运行时保护来减少序列化暴露一个可以监控风险并自动化可重复安全专业知识的系统对于很多企业来说都是很有用的。
Java应用程序可以将JVMTI工具嵌入到安全监控系统中,通过插桩的方式将传感器植入到应用程序中。
其他有用的安全技术在进行维护时,可以不需要手动列出一长串东西,而是使用像OWASPDependency-Check这样的系统,它可以识别出已知安全漏洞的依赖关系,并提示进行升级。
也可以考虑通过像DependABot这样的系统进行库的自动更新。
虽然用意很好,但默认的Oracle序列化过滤器存在与SecurityManager和相关沙箱漏洞相同的设计缺陷。
因为需要混淆角色权限并要求提前了解不可知的事物,限制了这个功能的大规模采用:系统管理员不知道代码的内容,所以无法列出类文件,而开发人员不了解环境,甚至DevOps团队通常也不知道系统其他部分(如应用程序服务器)的需求。

Apache Commons Collections1 反序列化命令执行漏洞

   当服务器收到序列化对象数据后,会调用对象类的readobject()方法进行反序列化,这里我们构造的恶意序列化对象使用的是AnnotationInvocationHandler类的实例化对象。所以当服务器收到这个对象时会去调用该类的readobject()方法进行反序列化,下面我们跟着上面的触发流程进行一步步触发分析。

结论 :在漏洞触发的第一步中,在反序列化我们向服务器发送的恶意序列化AnnotationInvocationHandler对象时会触发对构造该类对象时传入的Map类型对象的第一个键值对的value进行修改。

   当通过迭代器对象对TransformedMap类型的value值进行修改时会调用AbstractInputCheckedMapDecorator(TransformedMap类的父类并实现了 Map.Entry接口)中的内部类MapEntry的setValue()方法,debug运行可以看到this.parent变量值是TransformedMap对象的第一个键值对。

结论 :在漏洞触发的第二步中,触发了TransformedMap的checkSetValue()方法

   可以看到ChainedTransformer对象的transform()方法的功能是将传入的对象交给对象中的this.iTransformers变量引用的对象的transform()方法进行处理。this.iTransformers变量引用的对象从53行可知是对象实例化时传入的,从poc的25行可知我们实例化时传入一个Transformer的数组。

结论 :在漏洞触发的第三步中,TransformedMap.checkSetValue()触发ChainedTransformer.transform()方法。ChainedTransformer.transform()方法将传入的对象经过ChainedTransformer对象中的各个Transformer类型的实例对象调用实例化对象的transform()方法处理。

   由poc 20-25行可知ChainedTransformer对象中的Transformer类型的实例对象分别是ConstantTransformer、InvokerTransformer,首先触发ConstantTransformer对象的transform()方法,可以看出ConstantTransformer对象的transform()方法的功能是将传入的对象转换成实例化ConstantTransformer对象时传入的对象,由poc的21行可知实例化ConstantTransformer对象时传入的对象为java.lang.Runtime.class,因此经过ConstantTransformer.transform()后传入的参数变成了类对象 java.lang.Runtime.class ,再经过InvokerTransformer.transform()处理。

   从59-61行可以看出InvokerTransformer.transform()功能是通过反射得到传入对象中方法名为this.iMethodName参数类型为this.iParamTypes的方法,并执行该方法传入的方法参数为this.iArgs。而this.iMethodName、this.iParamTypes、this.iArgs三个参数都是我们在实例化InvokerTransformer对象时自定义的,这导致可以进行任意命令执行。

第一次执行InvokerTransformer.transform()方法后

第二次执行InvokerTransformer.transform()方法后

第三次执行InvokerTransformer.transform()方法

结论 :在漏洞触发的第四步中,传入的对象经过1次ConstantTransformer.transform()与3次InvokerTransformer.transform()转换触发exec()任意命令执行。

ps:jdk版本需要1.7

关于java反序列化漏洞,如何修复webphere java反序列化漏洞的介绍到此结束,希望对大家有所帮助。

java反序列化漏洞(如何修复webphere java反序列化漏洞)

本文编辑:admin

更多文章:


withdrawal(withdrawal是什么意思)

withdrawal(withdrawal是什么意思)

今天给各位分享withdrawal是什么意思的知识,其中也会对withdrawal是什么意思进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

2026年10月11日 07:00

根据流程图怎么编写程序(用c语言根据流程图写程序)

根据流程图怎么编写程序(用c语言根据流程图写程序)

大家好,今天小编来为大家解答以下的问题,关于根据流程图怎么编写程序,用c语言根据流程图写程序这个很多人还不知道,现在让我们一起来看看吧!

2026年10月11日 06:00

在from子句中可以出现(如何在from 子句中嵌套查询下面的语句在access中出错!)

在from子句中可以出现(如何在from 子句中嵌套查询下面的语句在access中出错!)

大家好,关于在from子句中可以出现很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于如何在from 子句中嵌套查询下面的语句在access中出错!的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望

2026年10月11日 05:20

countif函数统计个数怎么用(countif函数怎么用 详解Excel中countif函数的使用方法)

countif函数统计个数怎么用(countif函数怎么用 详解Excel中countif函数的使用方法)

其实countif函数统计个数怎么用的问题并不复杂,但是又很多的朋友都不太了解countif函数怎么用 详解Excel中countif函数的使用方法,因此呢,今天小编就来为大家分享countif函数统计个数怎么用的一些知识,希望可以帮助到大

2026年10月11日 03:30

正则匹配数字之前的字符(正则表达式如何匹配前面是数字、中间是“/”、后面也是数字,就像2/3专业的模式)

正则匹配数字之前的字符(正则表达式如何匹配前面是数字、中间是“/”、后面也是数字,就像2/3专业的模式)

本篇文章给大家谈谈正则匹配数字之前的字符,以及正则表达式如何匹配前面是数字、中间是“/”、后面也是数字,就像2/3专业的模式对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问

2026年10月11日 03:00

register语言学(register语言学)

register语言学(register语言学)

“register语言学”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看register语言学(register语言学)!

2026年10月11日 01:40

系统架构设计师可以直接考吗(学生可以报名系统架构设计师吗)

系统架构设计师可以直接考吗(学生可以报名系统架构设计师吗)

“系统架构设计师可以直接考吗”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看系统架构设计师可以直接考吗(学生可以报名系统架构设计师吗)!

2026年10月11日 01:00

orlnsertbootmediinselected(我电脑开机显示这个是什么意思or insert boot media in select)

orlnsertbootmediinselected(我电脑开机显示这个是什么意思or insert boot media in select)

大家好,如果您还对orlnsertbootmediinselected不太了解,没有关系,今天就由本站为大家分享orlnsertbootmediinselected的知识,包括我电脑开机显示这个是什么意思or insert boot med

2026年10月10日 23:00

display的用法(display是什么意思 详解display的含义和用法)

display的用法(display是什么意思 详解display的含义和用法)

大家好,如果您还对display的用法不太了解,没有关系,今天就由本站为大家分享display的用法的知识,包括display是什么意思 详解display的含义和用法的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

2026年10月10日 22:00

html全部居中代码(怎么让网页居中显示,html如何让网页居中)

html全部居中代码(怎么让网页居中显示,html如何让网页居中)

大家好,今天小编来为大家解答以下的问题,关于html全部居中代码,怎么让网页居中显示,html如何让网页居中这个很多人还不知道,现在让我们一起来看看吧!

2026年10月10日 21:10

最近更新

withdrawal(withdrawal是什么意思)
2026-10-11 07:00:01 浏览:0
热门文章

标签列表