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

浅析Java序列化和反序列化

来源:本站整理 作者:佚名 时间:2019-01-15 TAG: 我要投稿
Hibernate2
命令执行载体:com.sun.rowset.JdbcRowSetImpl
反序列化载体:HashMap
执行过程与Hibernate1一致,但Hibernate2并不是传入TemplatesImpl执行系统命令,而是利用JdbcRowSetImpl.getDatabaseMetaData()调用connect()连接到远程RMI
JBossInterceptors1
命令执行载体:org.apache.xalan.xsltc.trax.TemplatesImpl
反序列化载体:org.jboss.interceptor.proxy.InterceptorMethodHandler
InterceptorMethodHandler.readObject()在executeInterception()时,会根据SimpleInterceptorMetadata拿到TemplatesImpl放进ArrayList中,并传入SimpleInterceptionChain进行初始化,它在调用invokeNextInterceptor()时会导致命令执行
JSON1
命令执行载体:org.apache.xalan.xsltc.trax.TemplatesImpl
反序列化载体:HashMap
HashMap.readObject()将各元素放进HashMap时,会调用TabularDataSupport.equals()进行比较,它的JSONObject.containsValue()获取对象后在PropertyUtils.getProperty()内动态调用getOutputProperties方法,它被代理给CompositeInvocationHandlerImpl,其中转交给JdkDynamicAopProxy.invoke(),在AopUtils.invokeJoinpointUsingReflection()时会传入从AdvisedSupport.target字段中取出来的TemplatesImpl,最终导致命令执行
JavassistWeld1
命令执行载体:org.apache.xalan.xsltc.trax.TemplatesImpl
反序列化载体:org.jboss.weld.interceptor.proxy.InterceptorMethodHandler
除JBoss部分包名存在差异外,与JBossInterceptors1基本一致
Jdk7u21
命令执行载体:org.apache.xalan.xsltc.trax.TemplatesImpl
反序列化载体:LinkedHashSet
LinkedHashSet.readObject()将各元素放进HashMap时,第二个元素会调用equals()与第一个元素进行比较,它被代理给AnnotationInvocationHandler进入equalsImpl(),在getMemberMethods()遍历TemplatesImpl的方法遇到getOutputProperties进行调用时,导致命令执行
MozillaRhino1
命令执行载体:org.apache.xalan.xsltc.trax.TemplatesImpl
反序列化载体:BadAttributeValueExpException
BadAttributeValueExpException.readObject()调用NativeError.toString()时,会在ScriptableObject.getProperty()中进入getImpl(),ScriptableObject$Slot根据name获取到封装了Context.enter方法的MemberBox,并通过它的invoke()完成调用,而之后根据message调用TemplatesImpl.newTransformer()则会导致命令执行
Myfaces1
命令执行载体:org.apache.myfaces.view.facelets.el.ValueExpressionMethodExpression
反序列化载体:HashMap
HashMap.readObject()通过ValueExpressionMethodExpression.hashCode()计算hash时,会由getMethodExpression()调用ValueExpression.getValue(),最终导致EL表达式执行
Myfaces2
命令执行载体:org.apache.myfaces.view.facelets.el.ValueExpressionMethodExpression
反序列化载体:HashMap
执行过程与Myfaces1一致,但Myfaces2的EL表达式并不是由使用者传入的,而是预制了一串加载远程恶意对象的表达式
ROME
命令执行载体:org.apache.xalan.xsltc.trax.TemplatesImpl
反序列化载体:HashMap
HashMap.readObject()通过ObjectBean.hashCode()计算hash时,会在ToStringBean.toString()阶段遍历TemplatesImpl所有字段的Setter和Getter并调用,当调用到getOutputProperties()时将导致命令执行
Spring1
命令执行载体:org.apache.xalan.xsltc.trax.TemplatesImpl
反序列化载体:org.springframework.core.SerializableTypeWrapper$MethodInvokeTypeProvider
SerializableTypeWrapper$MethodInvokeTypeProvider.readObject()在调用TypeProvider.getType()时被代理给AnnotationInvocationHandler得到另一个Handler为AutowireUtils$ObjectFactoryDelegatingInvocationHandler的代理,之后传给ReflectionUtils.invokeMethod()动态调用newTransformer方法时被第二个代理拦截,它的objectFactory字段是第三个代理,因此objectFactory.getObject()会获得TemplatesImpl,最终导致命令执行
Spring2
命令执行载体:org.apache.xalan.xsltc.trax.TemplatesImpl
反序列化载体:org.springframework.core.SerializableTypeWrapper$MethodInvokeTypeProvider
SerializableTypeWrapper$MethodInvokeTypeProvider.readObject()在动态调用newTransformer方法时,被第二个代理拦截交给JdkDynamicAopProxy,它在AopUtils.invokeJoinpointUsingReflection()时会传入从AdvisedSupport.targetSource字段中取出来的TemplatesImpl,最终导致命令执行
根据上面这些内容,我们可以得到几条简单的POP构造法则:
当依赖中不存在可以执行命令的方法时,可以选择使用TemplatesImpl作为命令执行载体,并想办法去触发它的newTransformer或getOutputProperties方法
可以作为入口的通用反序列化载体是HashMap、AnnotationInvocationHandler、BadAttributeValueExpException和PriorityQueue,它们都是依赖较少的JDK底层对象,区别如下:
HashMap,可以主动触发元素的hashCode和equals方法
AnnotationInvocationHandler,可以主动触发memberValues字段的entrySet方法,本身也可以作为动态代理的Handler进入自己的invoke方法
BadAttributeValueExpException,可以主动触发val字段的toString方法
PriorityQueue,可以主动触发comparator字段的compare方法
 
总结
历年来,很多流行的Java组件框架都被爆出过反序列化漏洞,这已经有好多大牛们都进行过分析总结了,本文的主要目的也不在此,而是为了去深挖反序列化漏洞底层一些可能还没有被唤醒的地方。
不过有一点要切记,反序列化不止RCE。
 

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

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