作者:spoock
作者博客:https://blog.spoock.com/2018/05/16/cve-2018-1259/
漏洞信息
看pivotal發布的漏洞信息如下:

通過發布的漏洞信息可以知道,漏洞組件是在XMLBeam1.4.14或者是更早的版本,主要原因是沒有限制XML文件外部實體引用。而Spring Data Commons的某些版本中使用了存在漏洞的XMLBeam組件。
環境搭建
下載demo環境
git clone https://github.com/spring-projects/spring-data-examples.git
cd spring-data-examples
git checkout ad2b77e
使用IDEA打開其中的web/projection項目,修改其中的pom.xml文件:
修改spring-data-commons的版本
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
<version>2.0.5.RELEASE</version>
</dependency>
添加spring-boot的依賴
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
漏洞組件版本如下:

注釋example.users中UserControllerClientTests.java、UserControllerIntegrationTests.java中的代碼(主要是測試代碼,對漏洞環境無影響)。
漏洞復現
使用IDEA啟動程序。采用POST方法發送XML的數據:

成功地讀取了文件。
漏洞分析
通過漏洞修復commit發現,對DefaultXMLFactoriesConfig.java進行了修改,如下:
-
配置了默認的feature

-
禁止實體引用、禁止合并多個XML文檔。關于XInclude的用法可以參考XML包含機制

通過補丁分析,漏洞原因是在于XMLBeam漏洞版本中沒有限制外部實體。
當我們發送Payload時,是由example.users.UserController中的@PostMapping(value = "/")來處理請求:

其中user.getFirstname()已經完成了參數解析并讀取c:/windows/win.ini中的內容,所以我們發送的Payload在發送到Web應用之前已經由Spring Data Commons對發送的參數進行了解析并綁定到user對象上。而Spring Data Commons是利用XMLBeam解析XML文件,這樣就導致了在Web應用響應請求時已經完成了XML的解析從而造成了XXE漏洞。
通過層層追蹤,XML的解析最終是由org.xmlbeam.ProjectionInvocationHandler:invokeReadProjection()處理,

XML的解析是由Node dataNode = (Node)expression.evaluate(node, XPathConstants.NODE);完成,其中expression就有xpath表達式,node表示當前的document。最終解析完畢之后,data返回的就是win.ini的內容。

當我們更新XMLBeam的版本至1.4.15時,即設置了instance.setXIncludeAware(this.isXIncludeAware);instance.setExpandEntityReferences(this.isExpandEntityReferences);。分析invokeReadProjection()函數

可以看到expression中的xpath表達式保持不變,但是data此時的結果已經為空,說明通過設置禁止實體引用就導致了XXE漏洞失效。
其實整個XML的解析與參數整個請求參數的傳遞并沒有關系只和DefaultXMLFactoriesConfig的配置有關,所以漏洞分析并不需要跟蹤XML文件的解析過程,也不需要通過Spring Data Commons去追蹤數據流,只需要了解這個漏洞的本質原因即可。
總結
這個XXE漏洞本質是因DefaultXMLFactoriesConfig.java配置不當而導致的,Spring Data Commons的某些版本中恰好使用了含有漏洞的XMLBeam組件。這也就引出了一個問題,在Java這種大量使用第三方包的情況下,如何避免因第三方包的漏洞導致自己的應用也受到危害呢?
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/600/
暫無評論