從代碼層理解android的重定向漏洞
前言Android App中頁面跳轉主要通過Intent的顯式,隱式傳遞來拉起其他的Activity組件,或是通過在AndroidManifest.xml中配置的android:scheme進行DeepLinks拉起app或跳轉頁面。相應的,跳轉的時候傳入參數未校驗,就可能存在風險。
Deeplinks格式一般Deeplinks格式如下:
Scheme://host:port/path?query=xxxxxxx
被拉起的的App可以在AndroidManifest.xml中配置,向操作系統提前注冊一個URL,開頭的Scheme 用于從瀏覽器或其他App中拉起本App。
解析Scheme,判斷Scheme屬于哪個App,喚起App,傳遞參數給App由操作系統去完成。
Demo寫一個簡單的demo。
在AndroidManifest.xml中注冊并配置兩個活動。其中Main2Activity中定義了對應的url。

編譯后安裝。
可以通過如下adb命令去拉起App。
adb shell am start -a "android.intent.action.VIEW" -d "xxapp://webview"
或者通過瀏覽器去拉起。
<a href="xxapp://webview">run deme</a>

可以看到手機中App已經啟動。

WebView中URL任意跳轉還是用上面額例子,這一次我們在Main2Activity中接收外部傳入參數,進行加載。
默認返回是baidu。

按上面的adb命令執行,可以看到直接跳到baidu。

這里我們并未對傳入的參數url進行校驗,替換成其他的地址,也是可以加載的。
<a href="xxapp://webview?url=https://www.bilibili.com">run deme</a>

稍稍深入在Web中,任意URL跳轉漏洞由于功能限制,一般都是低危。但在移動應用中,往往會在WebView通過js去調用java接口使功能更加豐富。
通過注解@JavascriptInterface,表示方法可以被js調用。
這里我寫了一個Toast,執行會返回對應的信息。

增加兩行代碼,開啟js支持,綁定對象。
webView.getSettings().setJavaScriptEnabled(true);webView.addJavascriptInterface(Main2Activity.this, "main");
測試html:
<html><body> <button type="button" onClick="window.main.jsinterface('hhhhhhhhhh123')" >invoke</button></body></html>
加載后,點擊按鈕會出現彈窗提示,表示調用成功。

前面講到過App中頁面切換主要是通過Intent的傳遞,Webview中也是可以對Intent協議進行解析的,這就可能導致通過一條鏈,導致通過App拉起其他組件或者App,導致其他的問題。

因為這里我沒有去實現Webview支持intent解析,這里就沒有演示了。
總結簡單學習了一下Android中存在的URL跳轉問題及其簡單利用,剩下就是盡可能去收集app,逆向收集對應的Deeplinks,分析業務,擴大危害。