专栏名称: GitChat技术杂谈
GitChat是新时代的学习工具。
目录
相关文章推荐
程序员的那些事  ·  国企也中招!官网被挂上“码农的钱你也敢吞,* ... ·  昨天  
程序员小灰  ·  DeepSeek + IDEA!辅助编程太强了! ·  2 天前  
程序员的那些事  ·  突发!o3-mini ... ·  4 天前  
OSC开源社区  ·  2024年中国开源模型:崛起与变革 ·  4 天前  
51好读  ›  专栏  ›  GitChat技术杂谈

谈谈微信支付曝出的漏洞

GitChat技术杂谈  · 公众号  · 程序员  · 2018-07-10 07:45

正文


来源:编程迷思

www.cnblogs.com/kismetv/p/9266224.html


一.背景

最近(2018-07-04)微信支付的 SDK 曝出重大漏洞( XXE 漏洞),通过该漏洞,攻击者可以获取服务器中目录结构、文件内容,如代码、各种私钥等。获取这些信息以后,攻击者便可以为所欲为,其中就包括众多媒体所宣传的“ 0 元也能买买买”。

漏洞报告地址:

Http: seclists.org/fulldisclosure/2018/jul/3

二. 漏洞原理


1. XXE漏洞

此次曝出的漏洞属于XXE漏洞,即 XML 外部实体注入( XML External Entity Injection )。

XML文档处理可以包含声明和元素以外,还可以包含文档类型定义(即 DTD ; 如下图所示。


在DTD中,可以引进实体,在解析XML时,实体将会被替换成相应的引用内容。该实体可以由外部引入(支持http、ftp等协议,后文以http为例说明),如果通过该外部实体进行攻击,就是XXE攻击。


可以说,XXE漏洞之所以能够存在,本质上在于在解析XML的时候,可以与外部进行通信;当XML文档可以由攻击者任意构造时,攻击便成为可能。在利用XXE漏洞可以做的事情当中,最常见最容易实现的,便是读取服务器的信息,包括目录结构、文件内容等;本次微信支付爆出的漏洞便属于这一种。


2.  微信支付漏洞


本次漏洞影响的范围是:在微信支付异步回调接口中,使用微信支付SDK进行XML解析的应用。注意这里的SDK是服务器端的SDK,APP端使用SDK并不受影响。


SDK下载地址如下(目前微信官方宣传漏洞已修复):

https://pay.weixin.qq.com/wiki/doc/api/download/WxPayAPI_JAVA_v3.zip


SDK中导致漏洞的代码是WXPayUtil工具类中的xmlToMap()方法:



如上图所示,由于在解析XML时没有对外部实体的访问做任何限制,如果攻击者恶意构造xml请求,便可以对服务器进行攻击。下面通过实例介绍攻击的方法。


3.  攻击复现


下面在本机环境下进行复现。

假设本地的web服务器127.0.0.1:8080中存在POST接口:/wxpay/callback,该接口中接收xml字符串做参数,并调用前述的WXPayUtil.xmlToMap(strXml)对xml参数进行解析。此外,/etc/password中存储了重要的密码数据(如password1234)。


攻击时构造的请求如下:


其中xml内容如下:


通过xml+dtd文件,攻击者便可以在服务器http://127.0.0.1:9000中收到如下请求:

http://127.0.0.1:9000/evil/password1234


这样,攻击者便得到了/etc/password文件的内容。


在本例中,攻击者窃取了/etc/password文件中的内容,实际上攻击者还可以获取服务器中的目录结构以及其他文件,只要启动web应用的用户具有相应的读权限。如果获取的信息比较复杂,如包含特殊符号,无法直接通过http的URL发送,则可以采用对文件内容进行Base64编码等方法解决。


三、漏洞的解决


解决该漏洞的原理非常简单,只要禁止解析XML时访问外部实体即可。


漏洞曝出以后,微信进行了紧急修复,一方面是更新了SDK,并提醒开发者使用最新的SDK;SDK中修复代码如下:


加入了如下两行代码:

documentBuilderFactory.setExpandEntityReferences( false );

documentBuilderFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true );


更新:微信表示上述2条语句无法禁止该漏洞,又双叒叕更新了官方SDK,加了以下语句(对于微信的这波操作,不知如何评价):


此外,微信官方也给出了关于XXE漏洞的最佳安全实践,可以参考:

https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=23_5


笔者本人使用上述方案中建议的如下代码修复了该漏洞:

DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory . newInstance ();

documentBuilderFactory . setFeature ( "http://apache.org/xml/features/disallow-doctype-decl" , true );

DocumentBuilder documentBuilder = documentBuilderFactory . newDocumentBuilder ();

……


四、扩展与反思


1.  危害不只是“0元也能买买买”


在很多媒体的报道中,强调该漏洞的风险在于攻击者可以不支付也可以获得商品。确实,攻击者在通过上述漏洞获得微信支付的秘钥以后,有不止一种途径可以做到不支付就获得商品:







请到「今天看啥」查看全文