ref:spring-data-XMLBean XXE复现分析
ref: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这种大量使用第三方包的情况下,如何避免因第三方包的漏洞导致自己的应用也受到危害呢?
ref:spring-data-XMLBean XXE复现分析的更多相关文章
- spring data jpa 全面解析(实践 + 源码分析)
前言 本文将从示例.原理.应用3个方面介绍spring data jpa. 以下分析基于spring boot 2.0 + spring 5.0.4版本源码 概述 JPA是什么? JPA (Java ...
- 【spring boot 系列】spring data jpa 全面解析(实践 + 源码分析)
前言 本文将从示例.原理.应用3个方面介绍spring data jpa. 以下分析基于spring boot 2.0 + spring 5.0.4版本源码 概述 JPA是什么? JPA (Java ...
- spring security 实践 + 源码分析
前言 本文将从示例.原理.应用3个方面介绍 spring data jpa. 以下分析基于spring boot 2.0 + spring 5.0.4版本源码 概述 Spring Security 是 ...
- Spring Data REST PATCH请求远程代码执行漏洞(CVE-2017-8046) 本地复现方法
#1背景 Spring Data REST是Spring Data项目的一部分,可以轻松地在Spring Data存储库之上构建超媒体驱动的REST Web服务. 恶意的PATCH请求使用精心构造 ...
- CVE-2018-1273 Spring Data Commons 远程命令执行漏洞复现
一.漏洞描述 Spring Data是一个用于简化数据库访问,并支持云服务的开源框架,Spring Data Commons是Spring Data下所有子项目共享的基础框架.Spring Data ...
- Spring Data JPA应用 之查询分析
在Spring Data JPA应用之常规CRUD操作初体验 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)尾附上了JpaRepository接口继承关系及方法,可以知道JpaRepos ...
- 转:使用 Spring Data JPA 简化 JPA 开发
从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示 ...
- 使用 Spring Data JPA 简化 JPA 开发
从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示 ...
- Spring IOC 容器源码分析系列文章导读
1. 简介 Spring 是一个轻量级的企业级应用开发框架,于 2004 年由 Rod Johnson 发布了 1.0 版本.经过十几年的迭代,现在的 Spring 框架已经非常成熟了.Spring ...
随机推荐
- 几何+思维 Samara University ACM ICPC 2016-2017 Quarterfinal Qualification Contest K. Revenge of the Dragon
题目链接:http://codeforces.com/gym/101149/problem/K 题目大意: 给你两个点a,b.一个人在a点,一个人在b点,b点的人要追杀a的点,他的跑步速度是a的两倍. ...
- Python学习笔记(四十五)网络编程(1)TCP编程
摘抄:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014320043745 ...
- JAVA多线程提高三:线程范围内共享变量&ThreadLocal
今天我们学习的是如何在线程自己的范围内达到变量数据的共享,而各个线程之间又是互相独立开来,各自维护的,即我们说的ThreadLocal的作用. 一.概念 可以将每个线程用到的数据与对应的线程号存放到一 ...
- Codeforces 765F Souvenirs
time limit per test 3 seconds memory limit per test 512 megabytes input standard input output standa ...
- jQuery 页面加载初始化
jQuery 页面加载初始化的方法有3种 ,页面在加载的时候都会执行脚本,应该没什么区别,主要看习惯吧,本人觉得第二种方法最好,比较简洁. 第一种: $(document).ready(functio ...
- 【译】DTD - Entities
原文:DTD - Entities 实体用于定义XML文档中特殊字符的快捷方式. 实体主要有四种类型: 内置实体(Built-in entities) 字符实体(Character entities) ...
- 2017 ACM暑期多校联合训练 - Team 5 1008 HDU 6092 Rikka with Subset (找规律)
题目链接 Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, s ...
- 爬虫实战--使用Selenium模拟浏览器抓取淘宝商品美食信息
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.common.exce ...
- vim 颜色主题设置
先看看vim编辑器提供的色彩配置方案: 首先进入vim的color目录(/usr/share/vim/vim74/colors,不同的系统目录不同,建议在-/建立.vim目录,然后在些目录里建立对应的 ...
- imperva配置文件的导入导出
imperva配置文件的导入导出 Full_expimp.sh //进行备份 1导入 2导出 输入密码后 1 全部导出 是否想导出失败的数据 默认密码是system的密码 输入导出的路径 ...