Browse Author: xugang

XXE 漏洞攻击流程

视频讲解XXE 漏洞的攻击流程以及这次微信支付的漏洞到底出现在哪个环节

你好,我是好刚,在上一讲,我们了解了XXE 漏洞的原理,这一讲我们来看一看XXE 漏洞的攻击流程以及这次微信支付的漏洞到底出现在哪儿。

1. XXE漏洞攻击流程

这里我们也是看一个例子,看看怎样通过XXE 漏洞读取服务器上的文件信息。

对于一次XXE 漏洞攻击,一般有3 个参入方,首先是攻击者,攻击是他发起;然后是被攻击者,一般是一台web 服务器;再就是攻击者服务器,用来接收被攻击者服务器的文件内容。

1.1 漏洞接口

假设被攻击者的web 服务器中存在一个接口: 127.0.0.1/api/pay,这个接口能够接收xml 格式的参数,并且会对xml 进行解析。

1.2 构造请求

针对这个接口,攻击者会构造xml 格式的请求数据,请求的xml 内容如下:

http://127.0.0.1:9000/xxe.dtd 是攻击者服务器中的dtd 文件,内容如下:

1.3 解析请求

然后是第三部分,被攻击的web 服务器收到xml 参数后,会对xml 进行解析:

第一步:读取 file:///etc/password 的内容,作为 % file 实体的值,这里 % 表示这个实体是参数实体,之所以使用参数实体,是因为只有参数实体才可以在DTD 中使用,另外由于参数实体只能在外部引入的DTD 文件中声明实体时使用,所以我们还需要引入一个外部DTD 文件。

第二步:这里xxe.dtd 是攻击者服务器上的DTD 文件,通过 http://127.0.0.1:9000/xxe.dtd 拿到的是恶意DTD 文件。

第三步:解析恶意DTD 文件 xxe.dtd,这里会请求攻击者服务器上的 http://127.0.0.1:9000/attack/%file; ,并且将 /etc/password 文件的内容作为路径参数,这个请求会在攻击者服务器 http://127.0.0.1:9000 中留下访问记录,这样攻击者就能根据请求日志,拿到了 /etc/password 文件的内容。

这个示例里,窃取的是 /etc/password 文件的内容,实际上只要有文件读权限,攻击者可以拿到服务器中任何文件的内容,像代码里面的秘钥,服务器登录密码等等。

这就是一个典型的XXE 漏洞攻击,我们再来看看这次漏洞对微信支付的影响到底是什么样。

2. 支付漏洞是怎么回事

要了解这个漏洞对支付的影响,首先需要了解支付流程,我们来看一个简略版的支付过程。

153115299354760cd

再一次购物支付中,一般会包含三个参入方:用户,商家和支付服务商,流程一般是这样的:

  1. 正常用户选择好商品,请求商家服务器进行下单,商家计算付款金额后显示支付页面,提示用户支付。
  2. 用户会根据支付金额触发微信支付,注意,这个时候用户会进入微信支付的页面,与微信进行交互,并且完成付款。
  3. 微信会将支付完成的消息回调给商家服务器,通知商家,用户已经支付完成,商家确认订单和支付金额没有问题后会将订单状态改为已付款状态。
  4. 然后提示用户付款完成,并且跳转到购买成功的页面

这就是一次购物支付的简单流程,当然实际的支付流程比这复杂得多,感兴趣的同学可以通过下方我给出的参考资料找到相关文档。

这次产生漏洞的位置是在第3 步,用户支付完成后,微信需要请求商家服务器接口,通知商家,用户已经支付。这个接口的代码一般会使用微信提供的SDK 进行开发,而这个SDK 里面有段代码在解析XML 格式的请求数据时,出现了外部实体注入漏洞,这就是这次支付漏洞的由来。

如果用户通过这个漏洞拿到了商家的支付公秘钥,那就可以跳过第2 步支付的过程,直接第3 步的接口发送模拟的通知请求,从而达到不花钱获取商品的目的。

在很多媒体的报道中,也都强调通过这个漏洞,攻击者不花钱就可以获得商品。但是对于大型购物网站,都会有对账系统,这个系统会定时将网站的用户订单数据与微信后台的数据进行对比,一旦出现不一致时会及时报警;而且这个通知接口的地址,一般也只有内部开发人员才知道,所以这个漏洞在这方面的影响可能并没有想象的那么大。

其实除了不花钱获取商品,攻击者更可能造成的危害是:通过这个漏洞获取到服务器上的代码配置和数据,然后再根据这些信息进行下一步的攻击。

3. 漏洞的解决

最后来看下这个漏洞的解决方案,通过上一讲XXE 漏洞的原理以及这一讲攻击流程的介绍,可以看到XXE 漏洞之所以能够存在,本质上在于解析XML 外部实体的时候,可以读取外部文件,才使攻击成为可能。

那解决这个漏洞的办法也非常简单,就是禁止XML 可以解析外部实体。代码上只需要明确调用禁止解析外部实体的函数就行了。

安全无小事,XXE 漏洞原理和攻击流程就介绍到这,你听懂了吗。最后请帮忙关注和转发,让身边的同事也了解一下这个漏洞吧。我是好刚,好钢用在刀刃上,我们下期见。

参考资料

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 漏洞的攻击流程以及这次微信支付的漏洞到底出现在哪个环节。我是好刚,好钢用在刀刃上,我们下期见。

参考资料

好刚: 视频介绍XXE 漏洞

视频讲解XXE 漏洞,懂点关注XXE 漏洞的攻击原理和流程流程,最后给出XXE 漏洞的防范措施

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

1. 背景

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

2 XXE 漏洞原理

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

首先是XML,XML 是一种标记语言,可以用来定义数据类型,定义好的数据可以方便的在系统间传输和使用。XML文档结构可以分为XML声明、文档类型定义(DTD)、文档元素,其中DTD 是可选的,漏洞就是在解析DTD 时产生的。

2.1 DTD 与实体

这里DTD(文档类型定义)的作用是定义XML文件中有哪些元素、元素的属性、以及元素包含的内容等等,DTD 可以在 XML 文档内声明,也可以从外部引用,从外部应用时需要使用 SYSTEM 标识。

DTD 中可以定义实体,在内部DTD 中声明的实体称为内部实体,外部DTD 中声明的称为外部实体。实体就像一个常量,可以将一串普通文本定义为一个实体,就可以在XML 通过实体快捷的引用这段描述。

对实体的定义可能比较抽象,我们先来看下内部实体示例,来看下实体到底是什么。

在解析XML时,实体将会被替换成相应的引用内容,经过解析后,XML 编程这样:

2.2 外部实体

在DTD中,还可以使用 SYSTEM 标识,从外部url 和本地file 文件中引入外部实体。

这里实体将会被替换成相应的引用内容,也就是/etc/password。正是因为外部实体可以解析url 和本地文件,这才使得XXE 攻击成为可能。我们继续往下看攻击者是怎么样基于这一点实现攻击的。

3 XXE漏洞攻击流程

这里以利用XML 解析外部实体的特性读取服务器文件信息为例,介绍下整个攻击流程。

  1. 假设受攻击者的web 服务器中存在POST接口: 127.0.0.1/wxpay/callback,这个接口中接收xml 字符串做参数,并且会对xml 参数进行解析。

  2. 构造请求数据,请求的xml 内容如下:

/etc/password 是要窃取的对象,password 保存了用户列表,这个文件太重要。

http://127.0.0.1:9000/xxe.dtd 是攻击者服务器中的dtd 文件,内容如下:

  1. 受攻击者的web 服务器解析收到的xml 参数时,会按如下步骤进行解析

第一步,读取 file:///etc/password 的内容,作为 % file 实体的值
第二步:请求攻击者的外部DTD,通过 http://127.0.0.1:9000/xxe.dtd 会拿到恶意的DTD 文件。
第三步:解析恶意DTD 文件 xxe.dtd,这时会请求 http://127.0.0.1:9000/attack/%file; ,并且带上 /etc/password 文件里面的内容作为路径参数,这个请求会在攻击者服务器 http://127.0.0.1:9000 中留下请求记录,这样攻击者就拿到了 /etc/password 文件的内容。

这个示例中,窃取的是 /etc/password 文件的内容,实际上只要有文件读权限,就可以获取服务器中任何文件的内容,比如代码里面的秘钥。

3.2 支付漏洞是怎么回事

了解xxe 漏洞原来,我们来看下这次漏洞对微信的影响到底是什么样。

首先来看一个简略版的支付流程:

  1. 正常用户选择好商品,请求商家服务器进行下单,商家计算付款金额后显示支付页面,提示用户支付
  2. 用户根据支付金额触发微信支付,注意,这个时候用户会进入微信支付的页面,与微信进行交互,并且完成支付。
  3. 微信用户将完成支付的消息回调给商家服务器,通知商家用户已经支付,商家确认订单和支付金额后也将订单状态改为已付款。
  4. 然后提示用户付款完成,跳转到购买成功的页面

当然实际的支付流程比这复杂得多,感兴趣的同学可以给出下方参考资料找到详细文档。

这里产生支付漏洞的位置是在第3 步,微信通过请求商家服务器,通知商家用户已经支付,这个接口的代码一般会使用微信的SDK 进行开发,这个SDK 里面有段代码在解析XML 请求数据时,产生了漏洞,这就是这次攻击的由来。

4. 漏洞的解决

通过介绍,我们知道XXE 漏洞之所以能够存在,本质上在于在解析XML的时候,可以与外部进行通信,使攻击便成为可能。那解决该漏洞的办法也非常简单,就是禁止XML 解析时可以访问外部实体,代码上需要明确调用禁用解析外部实体的函数。

java 语言

php 语言,需要注意PHP 5.3 以后的版本默认是不会解析外部实体的,这就极大降低了受影响的可能性,当然也有函数明确禁止。

5. 总结反思

5.1 危害不只是不花钱

最后总结下,在很多媒体的报道中,都强调通过这个漏洞,攻击者不花钱就可以获得商品。不过很多大型购物网站,都会有对账系统,会定时将网站的用户订单数据与微信后台的数据进行对比,出现不一致时会及时报警,所以这个漏洞在这方面的影响可能并没有想象的那么大。

另外除了不花钱获取商品,攻击者更可能造成的危害是,通过漏洞获取到了应用服务器上的代码、数据和配置登录信息,然后再根据这些信息进行进一步的攻击,这个危害更严重。

5.2 检查提供XML 支持的接口

XXE 漏洞是由于XML 解析器默认不会禁用对外部实体的访问,因此只要我们的系统对外的接口有使用xml做请求参数,并且在解析xml参数时,没有禁用对外部实体的访问,那也容易掉进XXE漏洞的坑里。建议大家最好检查一下自己的应用中是否有类似的漏洞,及时修复。

5.3 使用JSON

最后,用于数据传输的格式还有JSON,相比XML,JSON 更加轻量和现代化,不像XML 有那么复杂的数据格式,所以JSON 更适合于系统间的数据交换,所以如果可以,建议考虑多使用JSON。

安全无小事,XXE 漏洞就介绍到这,你听懂了吗,听懂了就来关注转发下,让身边的同事也了解下。我是好刚,好钢用在刀刃上,我们下期见。

参考资料