Java - XXE
Java - XXE
XXE在Java 代码中的漏洞示例
JAVA常见XXE漏洞写法案例
spring-data-XMLBean XXE复现分析
搭建环境
【1】下载环境
git clone https://github.com/spring-projects/spring-data-examples.git
【2】下载安装maven并配置好环境变量
因为这里的新版本已经对次做了修复,所以这里的版本改为 2.0.5
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
<version>2.0.5.RELEASE</version>
</dependency>
【3】配置好环境变量后,进入对应的web/projection 打包运行
mvn package
部署运行
进入对应目录搭建运行
java -jar spring-data-web-projection-2.0.0.BUILD-SNAPSHOT.jar
poc复现
构造post请求
比较奇怪的一点是,正常的xxe请求 任意文件读取 都应该是 file:///
这里直接执行也行
注意 这里的content-type 类型,得支持,改为 application/xml
xxe支持的content-type fuzz一下
在位置中application/xhtml+xml 与 application/xml 的效果是一样的
注
Accept代表发送端(客户端)希望接受的数据类型。
比如:Accept:text/xml;
代表客户端希望接受的数据类型是xml类型
Content-Type代表发送端(客户端|服务器)发送的实体数据的数据类型。
比如:Content-Type:text/html;
代表发送端发送的数据格式是html。
漏洞分析
从该位置可以知道漏洞位置是在 firstname和lastname的接收处理,所以跟踪下idea下的该函数。
该maven项目demo中就application和userController 两个函数,从主函数跟踪。
可以看到post请求中的user.getFirstname(),user.getLastname() 方法
跟踪下 会发现,在调用responseEntity的时候就已经读取文件了
参考网上的分析,漏洞的处理函数位是在org.xmlbeam.ProjectionInvocationHandler:invokeReadProjection()处理
顺带在这里看下相对路径处理成功的原因
待补充细分
在提交http/post请求后,跟踪下
protected <T> Object readWithMessageConverters
在对该post参数进行处理时,这里还没进行文件读取转换
漏洞原因是在于XMLBeam漏洞版本中没有限制外部实体
参考
JAVA常见的XXE漏洞写法和防御
spring-data-XMLBean XXE复现分析
XXE with Spring Data’s XMLBeam 分析
框架基础——全面解析Java注解