SpringMVC中的XXE漏洞測試

SpringMVC框架支持XML到Object的映射,內部是使用兩個全局接口Marshaller和Unmarshaller,一種實現是使用Jaxb2Marshaller類進行實現,該類自然實現了兩個全局接口,用來對XML和Object進行雙向解析。並且XML文件可以是DOM文檔、輸入輸出流或者SAX handler。

SpringMVC流行使用註解來快速開發,其中JAXB註解可以對JavaBean中需要與XML進行轉化的地方進行標註。比如,實現XML文件到User對象的映射,User對象中使用JAXB註解:

 

當在SpringMVC中使用JAXB實現XML與Java Bean映射的時候,可能會導致XXE漏洞,因爲SpringMVC中也可以解析request body中的XML,其原理是在註解模式下,使用註解@RequestBody後,可以將HTTP請求的請求體引入到我們的Controller的方法中,一般是作爲方法的參數來使用。在開啓annotation-driven的時候,HttpMessageConverter會給AnnotationMethodHandlerAdapter初始化7個轉換器。至於Spring是如何選擇合適的轉換器的,這裏沒有讀源碼,猜測應該是通過Accept或者Content-type頭來進行判斷的。

如果應用程序沒有做有效的處理,那麼通過構造request body,我們可以實現外部實體的注入。比如,Web應用中使用XML傳遞數據時,沒有對外部實體的引用做限制,就可能導入外部實體,導致任意文件讀取。

在測試漏洞中,只需要在配置文件中對註解驅動與ViewResolver進行配置即可,

正常請求時:

 

 

在請求中標明提交一個application/xml類型的內容,並在request body中提交一個XML,內容爲name=exploit。提交請求,轉向頁面index.jsp,當然,在controller中我們做了一些處理,將轉換的user傳給了jsp來呈現,代碼爲:

可以看到,控制檯上打印了toString方法的內容:

index.jsp結果如下:

下面引入外部實體,提交:

 

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY[
<!ENTITY shit SYSTEM  "file:///c:/1.txt">]>
<user><name>&shit;</name></user>

 

這裏與上面不同,引入了一個惡意的外部實體shit,並且在回顯的位置<name>中使用這個實體,效果是讀取c盤下面的1.txt,內容爲一串”2”,結果如下:

可以看到,外部實體成功引入並且解析,造成了XXE漏洞。

所以,SpringMVC中處理XML類型的請求體時,所用的轉換器(Converter)是默認支持外部實體引用的,通過官網的解決方案可以解決該漏洞:

https://jira.spring.io/browse/SPR-10806

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章