微信支付的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会直接报错。
领取专属 10元无门槛券
私享最新 技术干货