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.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这种大量使用第三方包的情况下,如何避免因第三方包的漏洞导致自己的应用也受到危害呢?

ref:spring-data-XMLBean XXE复现分析的更多相关文章

  1. spring data jpa 全面解析(实践 + 源码分析)

    前言 本文将从示例.原理.应用3个方面介绍spring data jpa. 以下分析基于spring boot 2.0 + spring 5.0.4版本源码 概述 JPA是什么? JPA (Java ...

  2. 【spring boot 系列】spring data jpa 全面解析(实践 + 源码分析)

    前言 本文将从示例.原理.应用3个方面介绍spring data jpa. 以下分析基于spring boot 2.0 + spring 5.0.4版本源码 概述 JPA是什么? JPA (Java ...

  3. spring security 实践 + 源码分析

    前言 本文将从示例.原理.应用3个方面介绍 spring data jpa. 以下分析基于spring boot 2.0 + spring 5.0.4版本源码 概述 Spring Security 是 ...

  4. Spring Data REST PATCH请求远程代码执行漏洞(CVE-2017-8046) 本地复现方法

      #1背景 Spring Data REST是Spring Data项目的一部分,可以轻松地在Spring Data存储库之上构建超媒体驱动的REST Web服务. 恶意的PATCH请求使用精心构造 ...

  5. CVE-2018-1273 Spring Data Commons 远程命令执行漏洞复现

    一.漏洞描述 Spring Data是一个用于简化数据库访问,并支持云服务的开源框架,Spring Data Commons是Spring Data下所有子项目共享的基础框架.Spring Data ...

  6. Spring Data JPA应用 之查询分析

    在Spring Data JPA应用之常规CRUD操作初体验 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)尾附上了JpaRepository接口继承关系及方法,可以知道JpaRepos ...

  7. 转:使用 Spring Data JPA 简化 JPA 开发

    从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示 ...

  8. 使用 Spring Data JPA 简化 JPA 开发

    从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示 ...

  9. Spring IOC 容器源码分析系列文章导读

    1. 简介 Spring 是一个轻量级的企业级应用开发框架,于 2004 年由 Rod Johnson 发布了 1.0 版本.经过十几年的迭代,现在的 Spring 框架已经非常成熟了.Spring ...

随机推荐

  1. jquery收集页面参数生成xml,用于与server做数据交互

    本博客是自己在学习和工作途中的积累与总结,仅供自己参考,也欢迎大家转载,转载时请注明出处. http://www.cnblogs.com/king-xg/p/6382603.html 通过jquery ...

  2. [DeeplearningAI笔记]序列模型2.1-2.2词嵌入word embedding

    5.2自然语言处理 觉得有用的话,欢迎一起讨论相互学习~Follow Me 2.1词汇表征 Word representation 原先都是使用词汇表来表示词汇,并且使用1-hot编码的方式来表示词汇 ...

  3. [DeeplearningAI笔记]卷积神经网络4.1-4.5 人脸识别/one-shot learning/Siamase网络/Triplet损失/将面部识别转化为二分类问题

    4.4特殊应用:人脸识别和神经网络风格转换 觉得有用的话,欢迎一起讨论相互学习~Follow Me 4.1什么是人脸识别 Face verification人脸验证 VS face recogniti ...

  4. C++字符串使用sizeof时注意

    ] = {"hello,你好"}; char tmp2[] = {"hello,你好"}; ]; sprintf(tmp3,"%s",&qu ...

  5. linux下开放端口

    /sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT 将该设置添加到防火墙的规则中 /etc/rc.d/init.d/iptables save

  6. Codechef Course Selection

    Home » Practice(Hard) » Course Selection Course Selection Problem Code: RINSubmit https://www.codech ...

  7. 782E. Underground Lab DFS 好题

    Link 题意:给出一个图,有n个点,m条边,k个人,每个人至多只能走$\lceil\frac{2n}{k}\rceil$步,输出可行的方案即输出每个人所走的步数和所走点 思路: 由于保证给出的是连通 ...

  8. [Luogu 2486] SDOI2011 染色

    [Luogu 2486] SDOI2011 染色 树剖水题,线段树维护. 详细题解不写了. 我只想说我写的线段树又变漂亮了qwq #include <algorithm> #include ...

  9. IO流-LineNumberReader

    LineNumberReader继承自BufferedReader,比其多了两个方法,用于设置和获取当前行号, setLineNumber(); getLineNumber();

  10. 【洛谷 P2865】 [USACO06NOV]路障Roadblocks(最短路)

    题目链接 次短路模板题. 对每个点记录最短路和严格次短路,然后就是维护次值的方法了. 和这题一样. #include <cstdio> #include <queue> #in ...