天天看點

Android應用安全開發之淺談網頁打開APP

第一種使用者自定義的uri scheme形式如下:

Android應用安全開發之淺談網頁打開APP

第二種的intent-based uri的文法形式如下:

Android應用安全開發之淺談網頁打開APP

因為第二種形式大體是第一種形式的特例,是以很多文章又将第二種形式叫intent scheme url,但是在google的官方文檔并沒有這樣的說法。

注意:使用custom uri scheme給app傳遞資料,隻能使用相關參數來傳遞資料,不能想當然的使用scheme://host#intent;參數;end的形式來構造傳給app的intent資料。詳見3.1節的說明。

此外,還必須在app的androidmanifest檔案中配置相關的選項才能産生網頁打開app的效果,具體在下面講。

需求:使用網頁打開一個app,并通過url的參數給app傳遞一些資料。 

如自定義的scheme為:

Android應用安全開發之淺談網頁打開APP

注意: uri要用utf-8編碼和uri編碼。

網頁端的寫法如下:

Android應用安全開發之淺談網頁打開APP

app端接收來自網頁資訊的activity,要在androidmanifest.xml檔案中activity的intent-filter中聲明相應action、category和data的scheme等。 

如在mainactivity中接收從網頁來的資訊,其在androidmanifest.xml中的内容如下:

Android應用安全開發之淺談網頁打開APP

在mainactivity中接收intent并且擷取相應參數的代碼:

Android應用安全開發之淺談網頁打開APP

另外還有以下幾個api來擷取相關資訊: 

getintent().getscheme(); //獲得scheme名稱 

getintent().getdatastring(); //獲得uri全部路徑 

getintent().gethost(); //獲得host

如果在app中,沒有檢查擷取到的load_url的值,攻擊者可以構造釣魚網站,誘導使用者點選加載,就可以盜取使用者資訊。

接2.1的示例,建立一個webviewactivity元件,從intent裡面擷取load_url,然後使用webview加載url:

Android應用安全開發之淺談網頁打開APP

修改mainactivity元件,從網頁端的url中擷取load_url參數的值,生成新的intent,并傳給webviewactivity:

Android應用安全開發之淺談網頁打開APP

網頁端:

Android應用安全開發之淺談網頁打開APP

釣魚頁面:

Android應用安全開發之淺談網頁打開APP

點選“打開釣魚網站”,進入app,并且app加載了釣魚網站:

Android應用安全開發之淺談網頁打開APP

本例建議: 

在webview加載load_url時,結合app的自身業務采用白名單機制過濾網頁端傳過來的資料,黑名單容易被繞過。

1、app中任何接收外部輸入資料的地方都是潛在的攻擊點,過濾檢查來自網頁的參數。

2、不要通過網頁傳輸敏感資訊,有的網站為了引導已經登入的使用者到app上使用,會使用腳本動态的生成url scheme的參數,其中包括了使用者名、密碼或者登入态token等敏感資訊,讓使用者打開app直接就登入了。惡意應用也可以注冊相同的url sechme來截取這些敏感資訊。android系統會讓使用者選擇使用哪個應用打開連結,但是如果使用者不注意,就會使用惡意應用打開,導緻敏感資訊洩露或者其他風險。

intent-based uri文法:

Android應用安全開發之淺談網頁打開APP

注意:第二個intent的第一個字母一定要大寫,不然不會成功調用app。

如何正确快速的構造網頁端的intent? 

可以先建個android demo app,按正常的方法構造自己想打開某個元件的intent對象,然後使用intent的touri()方法,會得到intent對象的uri字元串表示,并且已經用utf-8和uri編碼好,直接複制放到網頁端即可,切記前面要加上“intent:”。 

如:

Android應用安全開發之淺談網頁打開APP

結果:

Android應用安全開發之淺談網頁打開APP

s.load_url是跟的是intent對象的putextra()方法中的資料。其他類型的資料可以一個個試。如果在demo中的intent對象不能傳遞給目标app的activity或其他元件,則其uri形式放在網頁端也不可能打開app的,這樣寫個demo容易排查錯誤。

app端中的androidmanifest.xml的聲明寫法同2.1節中的app端寫法完全一樣。對于接收到的uri形式的intent,一般使用intent的parseuri()方法來解析産生新的intent對象,如果處理不當會産生intent scheme url攻擊。

為何不能用scheme://host#intent;參數;end的形式來構造傳給app的intent資料? 

這種形式的intent不會直接被android正确解析為intent,整個scheme字元串資料可以使用intent的getdatasting()方法擷取到。 

如對于:

Android應用安全開發之淺談網頁打開APP

在app中擷取資料:

Android應用安全開發之淺談網頁打開APP

結果是:

Android應用安全開發之淺談網頁打開APP

由上圖可知android系統自動為custom uri scheme添加了預設的intent。 

要想正确的解析,還需使用intent的parseuri()方法對getdatastring()擷取到的資料進行解析,如:

Android應用安全開發之淺談網頁打開APP

上面兩篇文章中都給出了安全使用intent scheme url的方法:

Android應用安全開發之淺談網頁打開APP

除了以上的做法,還是不要信任來自網頁端的任何intent,為了安全起見,使用網頁傳過來的intent時,還是要進行過濾和檢查。

繼續閱讀