Android——反編譯某互聯網金融APP,經過JS漏洞獲取用戶信息、調用分享接口植入釣魚網站(安全篇)

本文將分爲三部分進行詳細講解:javascript

  1. JavaScript和WebView通訊的基本使用方法;java

  2. 經過反編譯,快速定位攻擊路徑,調用JS接口獲取用戶信息、植入釣魚網站;android

  3. 解決辦法; 結果以下: web

    在這裏插入圖片描述

在這裏插入圖片描述
衆所周知,H5+JS接口+Webview這種混合開發模式十分廣泛,市場上面絕大部分應用或多或少都是用了。

本文實例講解的是當前市場上用戶量較大的一款互聯網金融APP,註冊用戶數幾百萬,流水達幾十億。在本文以前已經將漏洞告知對方,這裏爲了保密不說起應用名稱,包名。瀏覽器

優勢以下:緩存

1.開發快捷,維護方便,因爲頁面採用的是H5,因此版本兼容性也比較好;安全

2.有效的減少apk的大小,別小看這點,當項目apk大小達到100M左右,減少apk體積就是一個很重要的KPI了;bash

3.適合數據開放,接入合做方的H5頁面,在APK內調用對外的JS接口獲取apk內的開放數據;微信

4.若是在webview裏面設置好緩存,離線包等加載方式加載速度體驗也挺好的;app

缺點:

雖然講述了需多優勢,可是有一個致命的安全問題須要引發你們的格外注意,那就是對外暴露的JS接口若是沒有嚴格的健全機制很容易被惡意調用,泄漏用戶的隱私數據、或者調用接口植入釣魚網站。

  1. JavaScript和WebView通訊的基本使用方法;

webview的設置

//首先容許webview執行js腳本
 settings.setJavaScriptEnabled(true);
 //給webview注入一個java對象供H5的JS調用其對外的方法
  mWebView.addJavascriptInterface(new JSObject(),"JavascriptInterface");
複製代碼

注入的java對象裏面增長H5調用的方法

public class JSObject {


    @JavascriptInterface
    public void getAppInfo(String param1,String param2){

    }
}
複製代碼

H5調用Native方法示例:

<script type="text/javascript">
	//提供給Native側調用
    function say(text) {
        alert(text)
    }
    function getResult(message) {
        return message;
    }
    //調用Native側的接口
    function getNativeAppInfo(){
       window.JavascriptInterface.getAppInfo()
    }
</script>
複製代碼

Native調用H5的函數進行傳值

方法一:
webView.loadUrl("javascript:say(\"" + "xxxxxxxxxx" + "\")");
方法二:
webView.evaluateJavascript("getResult(\""+"xxxxx'"+"\")", new ValueCallback<String>() {
            @Override
            public void onReceiveValue(String value) {
                Log.i(TAG, "onReceiveValue value=" + value);
            }
        });
複製代碼

以上就是JavaScript和WebView通訊的基本使用方法

  1. 經過反編譯,快速定位攻擊路徑,調用JS接口獲取用戶信息、植入釣魚網站
反編譯步驟:
1.java -jar apktool_2.3.3.jar d -f xxx.apk 
使用apktool這個工具將一個apk反編譯獲得圖片、XML配置、語言資源等文件。

2. sh d2j-dex2jar.sh classes.dex 
獲取classes-dex2jar.jar

3. 使用java -jar jd-gui-1.4.0.jar 查看源碼
複製代碼

咱們經過反編譯查看AndroidManifest文件,查找scheme關鍵字,看下該應用對外暴露了哪些組件同時能夠經過scheme拉起來。 和大部分APP同樣,該金融APP的Splash頁面容許被外部拉起。

<activity android:name="com.xxxxx.SplashScreenActivity" android:screenOrientation="portrait" android:theme="@style/SplashTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
                <data android:host="xxxhost" android:pathPrefix="/openwith" android:scheme="xxxschemeapp"/>
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
                <data android:scheme="xxxscheme"/>
            </intent-filter>
        </activity>
複製代碼

而後咱們反編譯查看代碼,雖然代碼被混淆過了,可是並不阻礙咱們閱讀它的邏輯:

在這裏插入圖片描述
咱們發如今識別出scheme頭以後,進行了url的加載,gotoUrl()函數。 而後咱們再看下加載Url的webview部分代碼是否有注入Java對象,是否有提供數據的JS接口:
在這裏插入圖片描述
果不其然,注入了JsObject類,咱們查看該類:
在這裏插入圖片描述
基本上該類對外提供了一個JS接口,而後經過第一個參數執行不一樣的代碼邏輯,相似命令模式; 而後咱們找到想要的接口第一個參數是什麼

下面這個接口就是文章的第一個截圖,獲取App的用戶數據其中還包括手機號碼

在這裏插入圖片描述
下面這個截圖便是分享彈出分享按鈕,分享url的接口,經過此接口能夠植入一個釣魚網站分享到微信,微博,QQ等,因爲有官方的應用icon,用戶很容易被欺騙到,輸入敏感數據:
在這裏插入圖片描述
最後咱們只須要在在H5代碼中調用這兩個接口便可,這裏參考第一部分的基本原理,不貼示例代碼了。

另外: 因爲scheme是能夠被瀏覽器拉起的,還能夠直接將組裝好的scheme連接加入到一些網頁的超連接,用戶點擊以後直接拉起該應用,具備遠程攻擊的可行性。

其實總體的思路就是找到暴露的組件,反編譯以後如何傳參,而後找到相關的JS接口,這樣一個攻擊路徑就找到了。

  1. 解決辦法 1.對於webview來講,添加url白名單,不在白名單裏面的地址不加載或者不進行注入java對象; 2.對接口的訪問權限進行分級,添加鑑權功能; 3.暴露的組件也能夠對傳入的scheme url進行校驗,增長攻擊者的難度等等

若是您還有更好的解決辦法,歡迎留言。

相關文章
相關標籤/搜索