Fastjson反序列化漏洞调试分析

0x00 攻击向量

fastjson攻击有2个条件:

  • 版本限制,<=1.2.24。之后禁止了autoType自动类型判断。
  • 写法有限制,具体看代码。

攻击利用了fastjson的@type属性,使用它可以指定实例化对象的类。Payload有几个,这里挑最普遍使用的JNDI方法来分析原理。

payload如下,利用参考marshalsec

关于JNDI,记下我的理解:

  • JNDI的Sink利用点找Context的Lookup方法。在JDK 1.8.0_191之前可以直接引用远程Java字节码进行RCE。JDK 1.8.0_191之后,需要利用Tomcat8的Gadaget环境RCE。
  • RMI和JNDI很类似,基本没区别。RMI连接可以使用JRMP技术绕过一些黑名单限制(参考WebLogic)。

0x01 调试分析

有这么一个问题,能否套用Java反序列化方法,来攻击fastjson?

为了回答这个问题,我写了个Demo来看看fastjson序列化过程会调用哪些方法:

结果我写在代码注释里面了,总结一下就是:

  • JSON.parseObject会调用所有属性get方法、以及JSON里面属性的set方法,构造方法。JSON.parseObject(*,*.class)只调用JSON里面属性的set方法(setAge等),构造方法。
  • 不会调用ReadObject方法。

第二个就是造成和Java Native层面的反序列化漏洞不一样了。我们现在需要找的是set、get方法为入口的利用,而非ReadObject为入口的利用。

明白基本原理后,调试走起。在JdbcRowSetImplconnect方法打断点,Run POC观察调用栈。

调用栈Dump出来,中可以完整利用链:JavaBeanDeserializer.deserialze -> FieldDeserializer.setValue -> 通过反射调用setAutoCommit方法给属性赋值 -> JNDI连接

0X03 参考和代码

代码里面看着比较清晰,请看我的github,欢迎点赞。https://github.com/angelwhu/ysoserial-my

http://www.code2sec.com/javafan-xu-lie-hua-lou-dong-xue-xi-shi-jian-qi-fastjsonfan-xu-lie-hua-pochui-zong.html
https://www.kanxue.com/book-19-89.htm
https://xz.aliyun.com/t/2272