jackson&fastjson在原生反序列化上的利用
本文最后更新于:1 个月前
主要是自用!!!
fastjson
见前面fastjson原生反序列化部分
jackson
主要漏洞入口点在于POJONode.toString(),与fastjson类似的,当我们对一个能够包含对象的一个东西进行toString()时,为了尽量体现它的属性必然会去获取属性的值,而和fastjson相似的,jackson也是通过调用getter来获取对象值,具体过程在这不详细分析
1 |
|
对pojoNode触发toString()即可
链子很多,不多写了,直接序列化POJONode会报错如下:
跟踪一下调用栈发现是在序列化过程中调用了一下writeReplace()
writeReplace()
更进一步地,抛出了异常
从异常内容
Cannot read the array length because "this.namesArray" is null (through reference chain: org.apache.xalan.xsltc.trax.TemplatesImpl["outputProperties"])
简单调试一下可推断出是我们构造的恶意字节码中的那个类中namesArray属性缺了,我们当时确实没有给这个类进行过除了静态代码块外的其他操作了,后续我调了半天也没成功,被逼无奈想出下下策
直接把com.fasterxml.jackson.databind
的源码下下来,拷到项目目录下,然后注释了这个writeReplace()
然后就不会出现writeObject过程中的报错了
得到序列化后base64字符串后,我们删了那个源码进行反序列化看看反序列化有没有影响,成功执行命令