移动支付每年激增到9万亿美元,已经改变了人们的购物方式,但昨日,互联网却爆出微信支付官方SDK 存在严重的 XXE 漏洞,可导致商家服务器被入侵。
文章图片
该漏洞由白帽汇NOSEC安全讯息平台发布报告,但有趣的是,这名白帽子不知如何联系微信安全团队人员,所以在 Twitter 上 @360Netlab,于是 360 代为转达了该漏洞。
一旦商家服务器被入侵,攻击者获得了关键支付的安全密钥(md5-key和商家信息,将可以直接实现0元支付购买任何商品)实现绕过支付的效果。目前,漏洞详细信息以及攻击方式已被公开,影响范围巨大。
下面一起来了解下漏洞详情:
什么是XML外部实体注入?
XML 外部实体注入漏洞(XML ExternalEntity Injection,简称 XXE),是一种容易被忽视,但危害巨大的漏洞。当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。
【wenxi|微信支付 SDK 惊现重大漏洞(黑客可 0 元购买任意商品)】而微信在JAVA版本的SDK中提供callback回调功能,用来帮助商家接收异步付款结果,该接口接受XML格式的数据,攻击者可以构造恶意的回调数据(XML格式)来窃取商家服务器上的任何信息。一旦攻击者获得了关键支付的安全密钥(md5-key和商家信息,将可以直接实现0元支付购买任何商品)
影响范围
该用户在报告中详细披露的漏洞的具体信息以及攻击方式,根据已公开利用细节可以确认,陌陌和VIVO因使用该SDK而存在该漏洞。
文章图片
受影响的版本有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 = "https://www.it610.com/article/....";
MyConfig config = new MyConfig();
WXPay wxpay = new WXPay(config);
//conver to map
Map notifyMap = WXPayUtil.xmlToMap(notifyData);
if (wxpay.isPayResultNotifySignatureValid(notifyMap)) {
//do business logic
}
else {
}
]
WXPayUtil source code
[
public static Map xmlToMap(String strXML) throws
Exception {
try {
Map data = https://www.it610.com/article/new HashMap();
/*** 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 to
map. Error message: {}. XML content: {}", ex.getMessage(), strXML);
throw ex;
}
}
]
修复建议
用户可使用开发语言提供的禁用外部实体的方法。java禁用外部实体的代码如下:
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
此外,据网友猜测披露该漏洞的白帽子可能为中国人,因为在其发布内容中使用了中文标点符号:
文章图片
据悉,大部分商家并没有使用SDK,同时微信官方团队已于第一时间对使用SDK的商家进行了通知,并于昨日中午对该漏洞进行了修复,相关补丁会在之后进行发布,但具体受损细节目前没有对外公布。
不过,截至目前,微信官方尚未发布相关补丁。
推荐阅读
- 极客日报|微信内测朋友圈内容转发功能;快手前副总裁侵占756万余元,一审获刑7年;俄罗斯法院驳回苹果上诉,将继续进行反垄断调查|极客头条
- 监听当点击微信等app的返回按钮或者浏览器的上一页或后退按钮的事件
- 判断客户端是微信端和app端
- 微信商城手机网站和APP三者到底到底,有什么区别()
- 互联网|全面解读微信小程序 你想知道的都有
- 微信开放平台手机APP支付
- ionic程序在安卓的微信x5内核中发现下拉的select不容易被点击到
- 安卓微信自动抢红包插件优化和实现