谈谈微信支付曝出的漏洞

2018 年 7 月 7 日 Linux爱好者

(点击上方公众号,可快速关注)


来源:编程迷思

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




在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元也能买买买”


在很多媒体的报道中,强调该漏洞的风险在于攻击者可以不支付也可以获得商品。确实,攻击者在通过上述漏洞获得微信支付的秘钥以后,有不止一种途径可以做到不支付就获得商品:例如,攻击者首先在系统中下单,获得商户订单号;然后便可以调用微信支付的异步回调,其中的签名参数便可以使用前面获取的秘钥对订单号等信息进行MD5获得;这样攻击者的异步回调就可以通过应用服务器的签名认证,从而获得商品。不过,在很多有一定规模的购物网站(或其他有支付功能的网站),会有对账系统,如定时将系统中的订单状态与微信、支付宝的后台对比,如果出现不一致可以及时报警并处理,因此该漏洞在这方面的影响可能并没有想象的那么大。


然而,除了“0元也能买买买”,攻击者可以做的事情还有很多很多;理论上来说,攻击者可能获得应用服务器上的目录结构、代码、数据、配置文件等,可以根据需要进行进一步破坏。


2.  漏洞不限于微信支付SDK


虽然微信支付曝出该漏洞受到了广泛关注,但该漏洞绝不仅仅存在于微信支付中:由于众多XML解析器默认不会禁用对外部实体的访问,因此应用的接口如果有以下几个特点就很容易掉进XXE漏洞的坑里:


(1)接口使用xml做请求参数


(2)接口对外公开,或容易获得:例如一些接口提供给外部客户调用,或者接口使用http很容易抓包,或者接口比较容易猜到(如微信支付的异步回调接口)


(3)接口中解析xml参数时,没有禁用对外部实体的访问


建议大家最好检查一下自己的应用中是否有类似的漏洞,及时修复。



参考文献


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

  • http://seclists.org/fulldisclosure/2018/Jul/3

  • https://www.cnblogs.com/tongwen/p/5194483.html



【关于投稿】


如果大家有原创好文投稿,请直接给公号发送留言。


① 留言格式:
【投稿】+《 文章标题》+ 文章链接

② 示例:
【投稿】《不要自称是程序员,我十多年的 IT 职场总结》:http://blog.jobbole.com/94148/

③ 最后请附上您的个人简介哈~



看完本文有收获?请分享给更多人

关注「Linux 爱好者」,提升Linux技能

登录查看更多
1

相关内容

XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初 XPath 的提出的初衷是将其作为一个通用的、介于XPointer与XSLT间的语法模型。但是 XPath 很快的被开发者采用来当作小型查询语言。
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
190+阅读 · 2020年6月29日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
115+阅读 · 2020年5月10日
斯坦福2020硬课《分布式算法与优化》
专知会员服务
117+阅读 · 2020年5月6日
【新书】Java企业微服务,Enterprise Java Microservices,272页pdf
49篇ICLR2020高分「图机器学习GML」接受论文及代码
专知会员服务
60+阅读 · 2020年1月18日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
95+阅读 · 2019年12月4日
CALDERA 一款对手自动模拟工具
黑白之道
20+阅读 · 2019年9月17日
AWVS12 V12.0.190530102 windows正式版完美破解版
黑白之道
29+阅读 · 2019年8月24日
渗透某德棋牌游戏
黑白之道
12+阅读 · 2019年5月17日
Kali Linux 渗透测试:密码攻击
计算机与网络安全
16+阅读 · 2019年5月13日
“黑客”入门学习之“windows系统漏洞详解”
安全优佳
8+阅读 · 2019年4月17日
基于Web页面验证码机制漏洞的检测
FreeBuf
7+阅读 · 2019年3月15日
DiscuzX 3.4 Phar反序列化漏洞
黑客工具箱
8+阅读 · 2019年1月4日
浅谈浏览器 http 的缓存机制
前端大全
6+阅读 · 2018年1月21日
Learning to See Through Obstructions
Arxiv
7+阅读 · 2020年4月2日
Graph Analysis and Graph Pooling in the Spatial Domain
Geometric Graph Convolutional Neural Networks
Arxiv
10+阅读 · 2019年9月11日
VrR-VG: Refocusing Visually-Relevant Relationships
Arxiv
6+阅读 · 2019年8月26日
Arxiv
7+阅读 · 2018年11月27日
Relational recurrent neural networks
Arxiv
8+阅读 · 2018年6月28日
Arxiv
6+阅读 · 2018年1月14日
VIP会员
相关VIP内容
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
190+阅读 · 2020年6月29日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
115+阅读 · 2020年5月10日
斯坦福2020硬课《分布式算法与优化》
专知会员服务
117+阅读 · 2020年5月6日
【新书】Java企业微服务,Enterprise Java Microservices,272页pdf
49篇ICLR2020高分「图机器学习GML」接受论文及代码
专知会员服务
60+阅读 · 2020年1月18日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
95+阅读 · 2019年12月4日
相关资讯
CALDERA 一款对手自动模拟工具
黑白之道
20+阅读 · 2019年9月17日
AWVS12 V12.0.190530102 windows正式版完美破解版
黑白之道
29+阅读 · 2019年8月24日
渗透某德棋牌游戏
黑白之道
12+阅读 · 2019年5月17日
Kali Linux 渗透测试:密码攻击
计算机与网络安全
16+阅读 · 2019年5月13日
“黑客”入门学习之“windows系统漏洞详解”
安全优佳
8+阅读 · 2019年4月17日
基于Web页面验证码机制漏洞的检测
FreeBuf
7+阅读 · 2019年3月15日
DiscuzX 3.4 Phar反序列化漏洞
黑客工具箱
8+阅读 · 2019年1月4日
浅谈浏览器 http 的缓存机制
前端大全
6+阅读 · 2018年1月21日
相关论文
Learning to See Through Obstructions
Arxiv
7+阅读 · 2020年4月2日
Graph Analysis and Graph Pooling in the Spatial Domain
Geometric Graph Convolutional Neural Networks
Arxiv
10+阅读 · 2019年9月11日
VrR-VG: Refocusing Visually-Relevant Relationships
Arxiv
6+阅读 · 2019年8月26日
Arxiv
7+阅读 · 2018年11月27日
Relational recurrent neural networks
Arxiv
8+阅读 · 2018年6月28日
Arxiv
6+阅读 · 2018年1月14日
Top
微信扫码咨询专知VIP会员