本文將分爲三部分進行詳細講解:javascript
JavaScript和WebView通訊的基本使用方法;java
經過反編譯,快速定位攻擊路徑,調用JS接口獲取用戶信息、植入釣魚網站;android
解決辦法; 結果以下: web
本文實例講解的是當前市場上用戶量較大的一款互聯網金融APP,註冊用戶數幾百萬,流水達幾十億。在本文以前已經將漏洞告知對方,這裏爲了保密不說起應用名稱,包名。瀏覽器
優勢以下:緩存
1.開發快捷,維護方便,因爲頁面採用的是H5,因此版本兼容性也比較好;安全
2.有效的減少apk的大小,別小看這點,當項目apk大小達到100M左右,減少apk體積就是一個很重要的KPI了;bash
3.適合數據開放,接入合做方的H5頁面,在APK內調用對外的JS接口獲取apk內的開放數據;微信
4.若是在webview裏面設置好緩存,離線包等加載方式加載速度體驗也挺好的;app
缺點:
雖然講述了需多優勢,可是有一個致命的安全問題須要引發你們的格外注意,那就是對外暴露的JS接口若是沒有嚴格的健全機制很容易被惡意調用,泄漏用戶的隱私數據、或者調用接口植入釣魚網站。
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.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接口,這樣一個攻擊路徑就找到了。
若是您還有更好的解決辦法,歡迎留言。