欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

浅析Java序列化和反序列化

来源:本站整理 作者:佚名 时间:2019-01-15 TAG: 我要投稿
    return (T)ois.readObject();
}
ClassFilter.DEFAULT长这样:
public static final ClassFilter DEFAULT = new ClassFilter() {
    protected boolean isBlacklisted(String name) {
        if (name.startsWith("org.codehaus.groovy.runtime.")) {
            return true;
        } else if (name.startsWith("org.apache.commons.collections.functors.")) {
            return true;
        } else {
            return name.contains("org.apache.xalan");
        }
    }
};
还是一个简简单单的黑名单。
 
POP的艺术
既然反序列化漏洞常见的修复方案是黑名单,就存在被绕过的风险,一旦出现新的POP链,原来的防御也就直接宣告无效了。
所以在反序列化漏洞的对抗史中,除了有大佬不断的挖掘新的反序列化漏洞点,更有大牛不断的探寻新的POP链。
POP已经成为反序列化区别于其他常规Web安全漏洞的一门特殊艺术。
既然如此,我们就用ysoserial这个项目,来好好探究一下现在常用的这些RCE类POP中到底有什么乾坤:
BeanShell1
命令执行载体:bsh.Interpreter
反序列化载体:PriorityQueue
PriorityQueue.readObject()反序列化所有元素后,通过comparator.compare()进行排序,该comparator被代理给XThis.Handler处理,其invoke()会调用This.invokeMethod()从Interpreter解释器中解析包含恶意代码的compare方法并执行
C3P0
命令执行载体:bsh.Interpreter
反序列化载体:com.mchange.v2.c3p0.PoolBackedDataSource
PoolBackedDataSource.readObject()进行到父类PoolBackedDataSourceBase.readObject()阶段,会调用ReferenceIndirector$ReferenceSerialized.getObject()获取对象,其中InitialContext.lookup()会去加载远程恶意对象并初始化,导致命令执行,有些同学可能不太清楚远程恶意对象的长相,举个简单的例子:
public class Malicious {
    public Malicious() {
        java.lang.Runtime.getRuntime().exec("calc.exe");
    }
}
Clojure
命令执行载体:clojure.core$comp$fn__4727
反序列化载体:HashMap
HashMap.readObject()反序列化各元素时,通过它的hashCode()得到hash值,而AbstractTableModel$ff19274a.hashCode()会从IPersistentMap中取hashCode键的值对象调用其invoke(),最终导致Clojure Shell命令字符串执行
CommonsBeanutils1
命令执行载体:org.apache.xalan.xsltc.trax.TemplatesImpl
反序列化载体:PriorityQueue
PriorityQueue.readObject()执行排序时,BeanComparator.compare()会根据BeanComparator.property (值为outputProperties) 调用TemplatesImpl.getOutputProperties(),它在newTransformer()时会创建AbstractTranslet实例,导致精心构造的Java字节码被执行
CommonsCollections1
命令执行载体:org.apache.commons.collections.functors.ChainedTransformer
反序列化载体:AnnotationInvocationHandler
见前文
CommonsCollections2
命令执行载体:org.apache.xalan.xsltc.trax.TemplatesImpl
反序列化载体:PriorityQueue
PriorityQueue.readObject()执行排序时,TransformingComparator.compare()会调用InvokerTransformer.transform()转换元素,进而获取第一个元素TemplatesImpl的newTransformer()并调用,最终导致命令执行
CommonsCollections3
命令执行载体:org.apache.commons.collections.functors.ChainedTransformer
反序列化载体:AnnotationInvocationHandler
除Transformer数组元素组成不同外,与CommonsCollections1基本一致
CommonsCollections4
命令执行载体:org.apache.commons.collections.functors.ChainedTransformer
反序列化载体:PriorityQueue
PriorityQueue.readObject()执行排序时,TransformingComparator.compare()会调用ChainedTransformer.transform()转换元素,进而遍历执行Transformer数组中的每个元素,最终导致命令执行
CommonsCollections5
命令执行载体:org.apache.commons.collections.functors.ChainedTransformer
反序列化载体:BadAttributeValueExpException
BadAttributeValueExpException.readObject()当System.getSecurityManager()为null时,会调用TiedMapEntry.toString(),它在getValue()时会通过LazyMap.get()取值,最终导致命令执行
CommonsCollections6
命令执行载体:org.apache.commons.collections.functors.ChainedTransformer
反序列化载体:HashSet
HashSet.readObject()反序列化各元素后,会调用HashMap.put()将结果放进去,而它通过TiedMapEntry.hashCode()计算hash时,会调用getValue()触发LazyMap.get()导致命令执行
Groovy1
命令执行载体:org.codehaus.groovy.runtime.MethodClosure
反序列化载体:AnnotationInvocationHandler
AnnotationInvocationHandler.readObject()在通过memberValues.entrySet()获取Entry集合,该memberValues被代理给ConvertedClosure拦截entrySet方法,根据MethodClosure的构造最终会由ProcessGroovyMethods.execute()执行系统命令
Hibernate1
命令执行载体:org.apache.xalan.xsltc.trax.TemplatesImpl
反序列化载体:HashMap
HashMap.readObject()通过TypedValue.hashCode()计算hash时,ComponentType.getPropertyValue()会调用PojoComponentTuplizer.getPropertyValue()获取到TemplatesImpl.getOutputProperties方法并调用导致命令执行

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载