Jackson的原生反序列化利用
Fastjson回眸
在Fastjson中,JSONArray和JSONObject都实现了Serializable接口,这两个类的toString方法都能触发toJSONString的调用,要把一个JSON对象转字符串,必然涉及到对象属性的获取,会调用到对象的getter方法
从1.2.49开始,JSONArray和JSONObject都实现了自己的readObject方法,自定义了一个SecureObjectInputStream并重写了resolveClass方法,里面调用了checkAutoType来对反序列化的类进行黑白名单检查。需要通过原生反序列化的引用机制来绕过。
利用链:toString(e.g. BadAttributeValueExpException#readObject) -> toJSONString -> evil getter(e.g. TemplatesImpl#getOutputProperties)
Jackson审视
Jackson的使用和Fastjson类似
JSONObject
ObjectNode
JSONArray
ArrayNode
JSON.parseObject静态调用
ObjectMapper.readTree对象调用
继承关系:POJONode->ValueNode->BaseJsonNode -> JsonNode
利用点在BaseJsonNode#toString,跟到后面 ,对于自定义的类使用BeanSerializer进行反序列化,调用serializeFields对属性进行还原时,BeanPropertyWriter调用getter
还是用TemplatesImpl#getOutputProperties去打,但是这里直接反序列化会出现问题
Failed to JDK serialize
POJONodevalue: (was java.lang.NullPointerException) (through reference chain: com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl["outputProperties"])
查看报错StackTrace

invokeWriteReplace判断writeReplaceMethod是否存在,存在则调用

简单粗暴,把这个类的writeReplaceMethod删掉即可
完整代码
稳定版本:https://xz.aliyun.com/t/12846
巅峰极客2023 BabyURL
附件👉Click Me
主要的两个路由
一个用于反序列化、一个用于读/tmp/file
MyObjectInputStream重写了resolveClass
把URLVisiter、URLHelper禁了,二次反序列化绕过
URLHelper的readObject调用了URLVisiter#visitUrl,获取的结果写入/tmp/file
目的就很明确了,利用URLVisiter去读flag,再写入/tmp/file
visitUrl限制了URL不能以file开头,用大写绕过FILE:///
没错,file协议可以列目录
获取flag的名字F14gIsHereY0UGOTIT
Last updated
Was this helpful?