1. 程式人生 > >SpringMVC中的XXE漏洞測試

SpringMVC中的XXE漏洞測試

SpringMVC框架支援XMLObject的對映,內部是使用兩個全域性介面MarshallerUnmarshaller,一種實現是使用Jaxb2Marshaller類進行實現,該類自然實現了兩個全域性介面,用來對XMLObject進行雙向解析。並且XML檔案可以是DOM文件、輸入輸出流或者SAX handler

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

當在SpringMVC中使用JAXB實現XMLJava 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)是預設支援外部實體引用的,通過官網的解決方案可以解決該漏洞: