本文首发于先知社区:
作为一名安全研究人员(java安全菜鸡),知道拿到exp怎么打还不够,还得进一步分析exp构造原理与漏洞原理才行。本篇文章主要分析FastJson1.2.24中针对TemplatesImpl链的构造原理以及ysoserial中针对jdk7u21基于TemplatesImpl加动态代理链的构造原理。内容可能巨详细,希望没接触过这部分的同学可以耐心看下去。
1.TemplatesImpl初相识
FastJson1.2.24中基于com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl这条链的入口点在TemplatesImpl的getOutputperties函数。当然本篇文章不再描述具体如何到这一步,有兴趣的可以参考我之前的一篇文章。一步一步学习某Json1.2.47远程命令执行漏洞
因此在下图所示下断点在此,这里环境为jdk7u21。
并且经过以上分析最终的payload可以缩减为以下形式:
整个调用过程挺短的,实际上就是
TemplatesImpl -> getOutputProperties()
TemplatesImpl -> newTransformer()
TemplatesImpl -> getTransletInstance()
此时在getTransletInstance()函数中将调用恶意类的构造函数,即
_class[_transletIndex].newInstance()导致RCE
2.AnnotationInvocationHandler完美链接
这一部分的分析主要就是通过最外层的readObject反序列化直达getOutputProperties()的调用,即newTransformer()的调用。而ysoserial中已经包含了该链的构造过程,其getobject函数就能拿到该链最外层的对象,而调试ysoserial也很容易,不传命令的话会默认传calc.exe
3.从jdk7u25和jdk7u21的对比中分析修复
jdk7u25是jdk7u21的后一个版本,运行后结果如下图所示
所以反序列化将会继续执行,并且能够恢复我们的动态代理Templates,感觉是个逻辑错误,开发人员可能一不注意就会犯错,要发现这些点对于安全研究人员来说开发技能也是必备的。
总结
前前后后分析下来也花了几个晚上,真是学到了不少。整个漏洞利用中包含了很多java中的技术点,最大的感受就是Java的反射特性真的是太重要了,可以说是无处不在2333。挖掘漏洞需要大量调试和分析,补漏洞在这里抛出一个错误就可以让漏洞消失,当然调试的过程中也更加熟悉了java这门语言。
补充:
hashset用来存储对象(内部还是基于hashmap存储)
hashmap存储键值对,hashmap速率高于hashset
在hashset的readobejct时map.put放入获取的临时内部proxy类来表示被代理的接口为Templates,代理类为一个hashmap,里面存的键为f5...值为templatesImpl的对象