XXE 漏洞原理

视频讲解XXE 漏洞原理,我们来看看XXE 漏洞是基于什么特性导致的

你好,我是好刚,这一讲我们来了解XXE 漏洞 (XML External Entity Injection)。

前几天微信提供给商家的java SDK 被发现存在XXE漏洞,通过这个漏洞,攻击者可以获取商家服务器上的代码文件,包括各种公秘钥等等。那获取这些信息以后,攻击者就可以做很多事情了,其中就可能包括媒体报道的“不花钱也能买买买”。今天我就带你来了解一下这个漏洞。

1. XXE 漏洞原理

这次的漏洞是XXE漏洞,全称叫:XML 外部实体注入(XML External Entity Injection)。我们来看看这个名称。

首先是XML,XML 是一种标记语言,可以用来定义数据类型,定义好的数据可以方便的在系统间传输和使用。

这是一个XML文档,它的结构可以分为XML声明、文档类型定义(DTD)、文档元素,其中DTD 是可选的,这次漏洞就是在解析DTD 时产生的。

2. DTD 与实体

这里DTD(文档类型定义)的作用是定义XML文件中有哪些模块,这些模块能包含什么样的内容。常见的模块有元素,属性,实体等等。

其中一种模块是实体。实体就像编程语言中的常量,我们可以将一串普通文本定义为一个实体,这样就可以在XML 通过这个实体引用这段文本。实体有两种,直接在DTD 中声明的实体称为内部实体,通过SYSTEM 从外部引入内容的是外部实体。

这样解释比较抽象,我们先来看一个内部实体的示例,看看实体到底是什么。

定义好实体后,在XML 中使用实体时,有固定的格式:以 & 开头,中间是实体名,再以 ; 结尾。经过解析后,实体将会被替换成定义的内容,这里XML 会变成这样:

这就是实体,通过将一串文本定义为一个实体,就可以在XML 通过这个实体来引用这段文本。

3. 外部实体

在来看一下外部实体,这是一个外部实体的示例,外部实体的标志是使用SYSTEM 将外部文件的内容定义到实体上,然后可以在XML 中通过这个实体,引用外部文件的内容。

这里实体将会被替换成定义的内容,也就是/etc/password,正常使用中 nickname 的内容可能被返回给用户,也就会将服务器password 的内容暴露给了攻击者,导致服务器被攻击。

XXE 漏洞,正是利用了XML 外部实体可以解析外部文件的特性,才使得攻击成为可能。

这就是XXE 漏洞的原理,这一讲先介绍到这,下一讲我将介绍基于XXE 漏洞的攻击流程以及这次微信支付的漏洞到底出现在哪个环节。我是好刚,好钢用在刀刃上,我们下期见。

参考资料

发表评论