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對映的時候,可能會導致
如果應用程式沒有做有效的處理,那麼通過構造request body
在測試漏洞中,只需要在配置檔案中對註解驅動與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)是預設支援外部實體引用的,通過官網的解決方案可以解決該漏洞: