微信支付0元购“漏洞”的来龙去脉

微信支付的XXE漏洞是怎么回事?

如何实现0元购?

我的微信支付还安全吗?

本文将回答上面三个问题,最后还针对本次微信支付XXE漏洞进行还原。

一、微信支付的XXE漏洞是怎么回事

XXE漏洞之所以存在,在于当XML文档可以由攻击者任意构造,且服务器对外部实体的访问没有任何限制时,攻击便成为可能。通过XXE漏洞,最常见的利用是读取服务器的数据,包括目录结构、文件内容等。而本次微信支付的XXE漏洞就是属于这一类。

具体来说,用户下单购物,输入支付密码之后,商家会用特定的 URL 来接收微信平台异步支付结果。然而,由于微信支付 JAVA 版本的 SDK (软件开发工具包)中,用于处理这个结果的函数存在 XXE 漏洞,因此攻击者可以向该 URL 发送恶意 Payload ,以根据需要窃取商家服务器上未受保护的信息。因此,简单来说:

微信支付的XXE漏洞将致使商户服务器上的数据泄露。

二、如何实现0元购

微信支付正常的支付流程,简单来说是这样:

用户在商户页面上发起购物流程,经过系列流程之后,用户输入支付密码,授权微信支付商家金额,之后微信支付平台将与商户确认支付结果,商户得到收款结果之后,走发货流程。

值得注意的是,商户使用微信支付时,通过使用关键密钥签名的方式,来保证双方交易的真实可靠性。

如果攻击者利用XXE漏洞从服务器上获得关键密钥,那么攻击者就可以仿冒微信平台实现0元购。攻击思路可以是这样(未实际验证,后续申请到微信商户号后再尝试还原):

攻击者首先商户页面上发起购物流程,获得订单号等信息,然后使用窃取的关键密钥对信息进行签名,再调用微信支付的异步回调,此时将通过商户服务器的签名认证,这时商户就会走正常发货流程,攻击者获得商品。

三、我的微信支付还安全吗

根据微信公告信息,此次漏洞影响的是:在微信支付异步回调接口中,使用微信支付 SDK(JAVA版)进行XML解析的应用。因此,受影响的SDK指服务器端,并不包括用户APP端。也就是说:

1、作为消费者,支付功能完全不受影响

此次漏洞不会影响到咱们的支付安全,该买买买还是继续买买买。另外,商户服务器上存储的消费者信息,可能会被攻击者窃取,所以通过这个漏洞,可能会暴露消费者的部分隐私。

说到微信的支付安全,这里补充一个小知识,平时用微信支付买东西时,只需要点开“收付款”,然后让售货员扫一扫就可以完成付款了。值得注意的是:

页面上有一行“查看付款码数字”按钮,切忌不要把付款码提供给任何人,一旦泄露,别人将直接使用付款码进行收款

2、作为商家,需要自纠自查

目前XXE漏洞已官方修复,使用最新版的SDK将不会再有文中提到的XXE漏洞,如果非得使用之前的版本,那么微信官方也给出了最佳实践方案,详情可见下面链接。

另外,很多商户拥有自己的对账系统,实时核对账单与实际发货信息,当发现异常时马上阻断交易,这样能更稳健地保证资金安全。因此,在现实中想利用这个漏洞做到0元购,其实并没有那么简单。

四、XXE漏洞还原

回过头来,参考网上的资料,尝试还原此次微信支付的XXE漏洞。

实验环境:WXPay-3.0.8(注意:官网现在能下载的是3.0.9)、Eclipse Java Oxygen 4.7.3

1、环境搭建

将下载得到的 WXPay-3.0.8 部署到 Eclipse 上,此次漏洞的位置在于WXPayUtil.java中的xmlToMap函数,引发XXE漏洞的代码如下图红框所示。

程序在生成DocumentBuilderFactory实例后,没有对传入的XML内容进行任何检验或过滤,便直接进行解析,由此引发了XXE漏洞。

2、漏洞验证

为了方便演示,构造含有恶意Payload的XML内容,直接调用含有漏洞代码的函数,然后将窃取的数据打印在Console上(实际应用中需找到调用接口),结果成功获得服务器上的win.ini文件,并打印出来。

3、漏洞修复情况

目前微信官方已修复,官网下载到的最新 SDK 已无 XXE 漏洞问题,具体是 Xml 解析类调用,取代原有的两行漏洞代码,通过设置 documentBuilderFactory 相关参数实现XML解析限制。比如第一行,通过将 disallow-doctype-decl 设为 true ,就将DTD完全禁用。

4、验证修复

由于DTDs已被完全禁用,也就不允许将外部实体包含在传入的 XML 文档中,此时再次传入Payload会直接报错。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180730G1CWS400?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券