java反序列化漏洞(北大青鸟设计培训:如何防止java编程语言序列化网络攻击)
本文目录
- 北大青鸟设计培训:如何防止java编程语言序列化网络攻击
- 如何修复webphere java反序列化漏洞
- 序列化与反序列化
- Apache Commons Collections1 反序列化命令执行漏洞
- 北大青鸟java培训:如何防止java编程语言序列化网络攻击
北大青鸟设计培训:如何防止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团队通常也不知道系统其他部分(如应用程序服务器)的需求。
如何修复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后就可以随意修改了
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培训:如何防止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团队通常也不知道系统其他部分(如应用程序服务器)的需求。
更多文章:
联想e430(联想thinkpade430 进入bios如何设置从硬盘启动)
2024年6月9日 05:26
免root查看wifi密码神器app(什么WIFI密码查看器不用root)
2024年6月18日 16:42
hp打印机驱动官网怎么下载(HP LaserJet P1108的打印机驱动如何下载安装)
2024年7月19日 13:35
流星蝴蝶剑OL!!久游、完美,你选择哪一个?流星OL和流星蝴蝶剑OL分别是哪个公司的
2023年11月14日 02:20
vivo手机中的吉他怎么用 了解一下?怎么用手机上的吉他调音器把弦调低两个半音
2024年6月30日 12:17
手机乐园java软件下载(天语手机java版的(地心探险))
2024年7月22日 00:30
为什么电脑上下载的阿里云盘没有全网搜索?阿里盘搜500系统异常
2024年4月11日 22:50