作者: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.usersUserControllerClientTests.javaUserControllerIntegrationTests.java中的代碼(主要是測試代碼,對漏洞環境無影響)。

漏洞復現

使用IDEA啟動程序。采用POST方法發送XML的數據:

成功地讀取了文件。

漏洞分析

通過漏洞修復commit發現,對DefaultXMLFactoriesConfig.java進行了修改,如下:

  1. 配置了默認的feature

  2. 禁止實體引用、禁止合并多個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這種大量使用第三方包的情況下,如何避免因第三方包的漏洞導致自己的應用也受到危害呢?


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/600/