Jackson的原生反序列化利用

Fastjson回眸

在Fastjson中,JSONArrayJSONObject都实现了Serializable接口,这两个类的toString方法都能触发toJSONString的调用,要把一个JSON对象转字符串,必然涉及到对象属性的获取,会调用到对象的getter方法

从1.2.49开始,JSONArrayJSONObject都实现了自己的readObject方法,自定义了一个SecureObjectInputStream并重写了resolveClass方法,里面调用了checkAutoType来对反序列化的类进行黑白名单检查。需要通过原生反序列化的引用机制来绕过。

利用链:toString(e.g. BadAttributeValueExpException#readObject) -> toJSONString -> evil getter(e.g. TemplatesImpl#getOutputProperties)

Jackson审视

Jackson的使用和Fastjson类似

FastJson
Jackson

JSONObject

ObjectNode

JSONArray

ArrayNode

JSON.parseObject静态调用

ObjectMapper.readTree对象调用

继承关系:POJONode->ValueNode->BaseJsonNode -> JsonNode

利用点在BaseJsonNode#toString,跟到后面 ,对于自定义的类使用BeanSerializer进行反序列化,调用serializeFields对属性进行还原时,BeanPropertyWriter调用getter

还是用TemplatesImpl#getOutputProperties去打,但是这里直接反序列化会出现问题

Failed to JDK serialize POJONode value: (was java.lang.NullPointerException) (through reference chain: com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl["outputProperties"])

查看报错StackTrace

image-20230727162629130

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

image-20230727162824036

简单粗暴,把这个类的writeReplaceMethod删掉即可

完整代码

稳定版本:https://xz.aliyun.com/t/12846

巅峰极客2023 BabyURL

附件👉Click Me

主要的两个路由

一个用于反序列化、一个用于读/tmp/file

MyObjectInputStream重写了resolveClass

URLVisiterURLHelper禁了,二次反序列化绕过

URLHelperreadObject调用了URLVisiter#visitUrl,获取的结果写入/tmp/file

目的就很明确了,利用URLVisiter去读flag,再写入/tmp/file

visitUrl限制了URL不能以file开头,用大写绕过FILE:///

没错,file协议可以列目录

获取flag的名字F14gIsHereY0UGOTIT

Last updated

Was this helpful?