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]
舉個例子: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
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動作所需的url
和title
引數,對應的值分別為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 請求,這就導致了可以被劫持。
結尾
還有很多思路等著我們去探尋,此文僅做思路啟發。