获得这些信息后,攻击者就可以为所欲为,包括很多媒体宣传的“0元就能买到”。
漏洞报告地址:
漏洞原理
XXE漏洞
本次暴露的漏洞是XXE漏洞,即XML外部实体注入(XML)。
除了声明和元素之外,XML 文档还可以包含文档类型定义 (DTD);如下图所示:
在DTD中,可以引入实体,在解析XML时,会将实体替换为相应的引用内容。
这个实体可以从外部引入(支持http、ftp等协议,下面的文章将以http为例)。如果攻击是通过这个外部实体进行的,那么就是XXE攻击。
可以说,XXE漏洞之所以能够存在,是因为它在解析XML时可以与外界进行通信;当攻击者可以任意构造XML文档时,攻击就成为可能。
利用XXE漏洞可以做的事情中,最常见、最容易实现的就是读取服务器信息,包括目录结构、文件内容等;此次微信支付暴露的漏洞就属于此类。
微信支付漏洞
该漏洞影响范围为:微信支付异步回调接口中,使用微信支付SDK进行XML解析的应用程序。
注意,这里的SDK是服务端SDK,App端使用该SDK不会受到影响。
SDK下载地址如下(目前官方微信公示漏洞已修复):
SDK中导致该漏洞的代码为工具类中的()方法:
如上图所示,由于解析XML时对外部实体的访问没有限制,因此如果攻击者恶意构造XML请求,就可以攻击服务器。下面通过例子介绍该攻击方法。
发作复发
以下是在本地环境下转载的。
假设本地Web服务器127.0.0.1:8080中有一个POST接口://。该接口接收 XML 字符串作为参数,并调用前面提到的 .() 来解析 XML 参数。
此外,重要的密码数据(例如 )存储在 /etc/ 中。
攻击时构造的请求如下:
XML内容如下:
%xxe;
]>
其中/etc/是要被盗取的对象,:9000/xxe.dtd是攻击者服务器中的dtd文件。内容如下:
”>
%;
%;
通过xml+dtd文件,攻击者可以在:9000::9000/evil/中收到如下请求。
这样,攻击者就获取了/etc/文件的内容。
在这种情况下,攻击者窃取了/etc/文件的内容。事实上,攻击者还可以获取服务器中的目录结构和其他文件,只要启动Web应用程序的用户具有相应的读取权限即可。
如果获取的信息比较复杂,比如含有特殊符号,无法直接通过http URL发送,可以使用对文件内容进行编码等方法来解决。
漏洞修复
该漏洞的解决方案很简单,只需在解析 XML 时禁用对外部实体的访问即可。
漏洞曝光后,微信进行了紧急修复。一方面,更新了SDK,提醒开发者使用最新的SDK。
SDK中的修复代码如下:
添加了以下两行代码:
ry.( );
ry.( ., true);
此外,微信官方还给出了关于XXE漏洞的最佳安全实践。您可以参考:
作者自己使用上述解决方案中建议的以下代码修复了该漏洞:
ry ry = ry.();
ry.("", true);
= ry.();
……
扩展和反映
危害不只是“0元就能买到”
许多媒体报道中都强调,该漏洞的风险在于攻击者无需付款即可获得商品。
攻击者通过上述漏洞获取微信支付秘钥后,无需支付即可获得商品的方式不止一种。
例如,攻击者首先在系统中下单,获取商家的订单号;然后就可以调用微信支付的异步回调了。
签名参数可以利用之前得到的秘钥通过MD5得到订单号等信息;这样攻击者的异步回调就可以通过应用服务器的签名认证并获取产品。
但在很多具有一定规模的购物网站(或者其他具有支付功能的网站),都会有对账系统,比如定期与微信、支付宝后台对比系统中的订单状态。
如果出现不一致的情况,可以报警并及时处理,所以这个漏洞的影响可能没有想象的那么大。
然而,除了“0元就能买买买”之外,攻击者还能做的事情还有很多;理论上,攻击者可以获取应用服务器上的目录结构、代码、数据、配置文件等,并可以根据需要进行进一步的破坏。
漏洞不仅限于微信支付SDK
尽管微信支付暴露的漏洞受到了广泛关注,但该漏洞不仅仅存在于微信支付中。
由于许多 XML 解析器默认情况下不会禁用对外部实体的访问,因此如果应用程序接口具有以下特征,则很容易陷入 XXE 漏洞的陷阱:
XML 与 JSON
XML 和 JSON 是系统间交互常用的两种数据格式。虽然两者在很多情况下是可以互换的,但笔者认为JSON作为一种更轻量级、更纯粹的数据格式,更适合系统之间的交互。
至于XML,作为一种更重量级、更复杂的数据格式,其DTD支持自定义文档类型,在更复杂的配置场景下有更好的效果。典型场景包括相关配置。
题外话:微信支付的签名认证
如前所述,一旦应用程序中存储的密钥泄露,攻击者就可以完全绕过签名认证。这是因为微信支付采用对称签名认证。
微信侧和应用侧使用相同的密钥对同一份明文进行MD5签名。只要应用方的密钥被泄露,签名认证就成为一个完整的数字。
对此,支付宝的做法更加规范、安全:支付宝为应用生成公私钥对,公钥由应用保存,私钥由支付宝保存;回调时,支付宝使用私钥进行签名,应用程序使用公钥进行签名。核实。
这样,只要支付宝保存的私钥不泄露,攻击者仅拥有公钥就很难通过签名认证。
参考:
对于微信此次出现的支付漏洞,您有何看法?欢迎在底部留言分享你的看法。