2023年7月13日发(作者:)
反序列化漏洞_ApacheCommonsCollections反序列化漏洞分析 点击蓝字关注我们吧!环境搭建本⽂由“壹伴编辑器”提供技术JDK版本为为1.6,引⼊包,具体引⼊⽅法为:File -> Project Settings -> Modules -> Dependencies点击加号选择导⼊JARs包,再选择包的地址,点击apply成功引⼊。Poc():本⽂由“壹伴编辑器”提供技术分析:本⽂由“壹伴编辑器”提供技术前⾯提到过要实现序列化与反序列化⽬标对象要实现Serializable接⼝。Apache Commons Collections中有⼀个特殊的接⼝,其中有⼀个实现该接⼝的类可以通过调⽤Java的反射机制来调⽤任意函数,叫做InvokerTransformer。InvokerTransformer部分源码,可以看到其实现了Transformer和Serializable接⼝。本⽂由“壹伴编辑器”提供技术InvokerTranformer类中的transform⽅法,该⽅法使⽤反射进⾏函数调⽤input参数是要反射的对象,iMethodName、iParamTypes分别是调⽤的⽅法名称和参数类型,iArgs是要调⽤的⽅法的参数。这三个参数都是可控的。本⽂由“壹伴编辑器”提供技术ConstantTransformer类的transform()⽅法是返回iConstant属性,并且该属性也是可控的。ChainedTransformer类很关键,这是它的构造函数:从其构造函数可以看出它是传⼊⼀个Transform数组,在看⼀下它的transform()⽅法。本⽂由“壹伴编辑器”提供技术这⾥使⽤循环来调⽤Transformer数组的transform()⽅法,并且使⽤object作为后⼀个调⽤transform()⽅法的参数,这⾥我们结合前⾯的poc代码看:本⽂由“壹伴编辑器”提供技术这⾥代码有些绕,要结合前⾯对各个类的分析,⼤概意思是创建⼀个transformers数组:第⼀个参数是ConstantTransformer对象, 后⾯参数都是InvokerTransformer对象(备注:InvokerTransformer类和ConstantTransformer类前⾯都有提到)最后创建ChainedTransformer对象并将transformers数组传⼊。Debug截图:本⽂由“壹伴编辑器”提供技术本⽂由“壹伴编辑器”提供技术这个checkSetValue()会触发transform⽅法。然后我们思路清晰起来了,⾸先,构造⼀个Map和⼀个代码执⾏的ChainedTransforme⽣成⼀个TransformedMap。Poc中的代码如下:本⽂由“壹伴编辑器”提供技术Outmap就是已经构造好的TransformedMap,下⼀步需要能让服务器反序列化对象时,触发outmap的checkSetValue()⽅法。这时就要⽤到AnnotationInvocationHandler类,这个类中有⼀个变量memberValues是Map类型,如下图所⽰:本⽂由“壹伴编辑器”提供技术AnnotationInvocationHandler的readObject()⽅法中,对memberValues的每⼀项都调⽤了setValue()函数,代码如下:本⽂由“壹伴编辑器”提供技术这⾥的setValue()函数就会触发checkValue()函数,代码如图:本⽂由“壹伴编辑器”提供技术所以我们要使⽤outmap来构造AnnotationInvocationHandler,进⾏序列化,后⾯触发readerObject()反序列化时就能实现命令执⾏:本⽂由“壹伴编辑器”提供技术下⾯分别是序列化与反序列化的简单本地模拟代码:本⽂由“壹伴编辑器”提供技术⼀般情况是服务器有⼀个反序列化接⼝,我们将⾃⼰构造的恶意代码序列化后通过接⼝远程调⽤,或者传输到服务器上,服务器进⾏反序列化调⽤readObject()函数;然后成功命令执⾏。本⽂由“壹伴编辑器”提供技术⽀服务器端反序列化执⾏⼤概步骤:漏洞影响: Framework <= 3.0.5,<= 2.0.6; < 2.4.4; Commons Collections <= 3.2.1,<= 4.0.0;附POC代码:package y;import ;import putStream;import tputStream;import InputStream;import
发布者:admin,转转请注明出处:http://www.yc00.com/web/1689193215a219080.html
评论列表(0条)