日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android WebView 使用漏洞

發(fā)布時間:2023/12/13 Android 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android WebView 使用漏洞 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

  • 一、類型
  • 二、具體分析
    • 2.1、WebView任意代碼執(zhí)行漏洞
      • 2.1.1、addJavascriptInterface 接口引起遠程代碼執(zhí)行漏洞
        • 漏洞產生原因
        • 解決方案
        • 關于該方法的其他細節(jié)
      • 總結
      • 2.1.2、searchBoxJavaBridge_接口引起遠程代碼執(zhí)行漏洞
        • 漏洞產生原因
        • 解決方案
      • 2.1.3、accessibility和 accessibilityTraversal接口引起遠程代碼執(zhí)行漏洞
    • 2.2、密碼明文存儲漏洞
      • 2.2.1 問題分析
      • 2.2.2、解決方案
    • 2.3、域控制不嚴格漏洞
      • 2.3.1、問題分析
        • 1、setAllowFileAccess()
        • 2、setAllowFileAccessFromFileURLs()
        • 3、setAllowUniversalAccessFromFileURLs()
        • 4、setJavaScriptEnabled()
      • 最終解決方案



一、類型

WebView中,主要漏洞有三類:

  • 任意代碼執(zhí)行漏洞;

  • 密碼明文存儲漏洞;

  • 域控制不嚴格漏洞;


二、具體分析

2.1、WebView任意代碼執(zhí)行漏洞

出現(xiàn)該漏洞的原因有三個:

  • WebView 中 addJavascriptInterface() 接口

  • WebView 內置導出的 searchBoxJavaBridge_ 對象

  • WebView 內置導出的 accessibilityaccessibilityTraversalObject 對象

2.1.1、addJavascriptInterface 接口引起遠程代碼執(zhí)行漏洞

漏洞產生原因

JS調用Android的其中一個方式是通過 addJavascriptInterface 接口進行對象映射:

webView.addJavascriptInterface(new JSObject(), "myObj"); // 參數(shù)1:Android的本地對象 // 參數(shù)2:JS的對象 // 通過對象映射將Android中的本地對象和JS中的對象進行關聯(lián),從而實現(xiàn)JS調用Android的對象和方法

所以,漏洞產生原因是:當JS拿到Android這個對象后,就可以調用這個Android對象中所有的方法,包括系統(tǒng)類(java.lang.Runtime 類),從而進行任意代碼執(zhí)行。

如可以執(zhí)行命令獲取本地設備的SD卡中的文件等信息從而造成信息泄露

具體獲取系統(tǒng)類的描述:(結合 Java 反射機制)

  • Android中的對象有一公共的方法:getClass() ;

  • 該方法可以獲取到當前類 類型Class

  • 該類有一關鍵的方法: Class.forName;

  • 該方法可以加載一個類(可加載 java.lang.Runtime 類)

  • 而該類是可以執(zhí)行本地命令的

以下是攻擊的Js核心代碼:

function execute(cmdArgs) { // 步驟1:遍歷 window 對象// 目的是為了找到包含 getClass ()的對象// 因為Android映射的JS對象也在window中,所以肯定會遍歷到for (var obj in window) { if ("getClass" in window[obj]) { //步驟2:利用反射調用forName()得到Runtime類對象alert(obj); return window[obj].getClass().forName("java.lang.Runtime") // 步驟3:以后,就可以調用靜態(tài)方法來執(zhí)行一些命令,比如訪問文件的命令getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs); // 從執(zhí)行命令后返回的輸入流中得到字符串,有很嚴重暴露隱私的危險。// 如執(zhí)行完訪問文件的命令之后,就可以得到文件名的信息了。} } }
  • 當一些 APP 通過掃描二維碼打開一個外部網頁時,攻擊者就可以執(zhí)行這段 js 代碼進行漏洞攻擊。

  • 在微信盛行、掃一掃行為普及的情況下,該漏洞的危險性非常大

解決方案

Android 4.2版本之后

Google 在Android 4.2 版本中規(guī)定對被調用的函數(shù)以 @JavascriptInterface 進行注解從而避免漏洞攻擊

Android 4.2版本之前

在Android 4.2版本之前采用攔截prompt()進行漏洞修復。

具體步驟如下:

  • 繼承 WebView ,重寫 addJavascriptInterface 方法,然后在內部自己維護一個對象映射關系的 Map;

將需要添加的 JS 接口放入該Map中

  • 每次當 WebView 加載頁面前加載一段本地的 JS 代碼,原理是:
    • 讓JS調用一Javascript方法:該方法是通過調用 prompt() 把JS中的信息(含特定標識,方法名稱等)傳遞到Android端;
    • 在Android的 onJsPrompt() 中 ,解析傳遞過來的信息,再通過反射機制調用Java對象的方法,這樣實現(xiàn)安全的JS調用Android代碼。

關于Android返回給JS的值:可通過prompt()把Java中方法的處理結果返回到Js中

具體需要加載的JS代碼如下:

javascript:(function JsAddJavascriptInterface_(){ // window.jsInterface 表示在window上聲明了一個Js對象// jsInterface = 注冊的對象名// 它注冊了兩個方法,onButtonClick(arg0)和onImageClick(arg0, arg1, arg2)// 如果有返回值,就添加上returnif (typeof(window.jsInterface)!='undefined') { console.log('window.jsInterface_js_interface_name is exist!!');} else { window.jsInterface = { // 聲明方法形式:方法名: function(參數(shù))onButtonClick:function(arg0) { // prompt()返回約定的字符串// 該字符串可自己定義// 包含特定的標識符MyApp和 JSON 字符串(方法名,參數(shù),對象名等) return prompt('MyApp:'+JSON.stringify({obj:'jsInterface',func:'onButtonClick',args:[arg0]})); }, onImageClick:function(arg0,arg1,arg2) { return prompt('MyApp:'+JSON.stringify({obj:'jsInterface',func:'onImageClick',args:[arg0,arg1,arg2]})); }, }; } }) // 當JS調用 onButtonClick() 或 onImageClick() 時,就會回調到Android中的 onJsPrompt () // 我們解析出方法名,參數(shù),對象名 // 再通過反射機制調用Java對象的方法

關于該方法的其他細節(jié)

細節(jié)1:加載上述JS代碼的時機

  • 由于當 WebView 跳轉到下一個頁面時,之前加載的 JS 可能已經失效

  • 所以,通常需要在以下方法中加載 JS:

onLoadResource(); doUpdateVisitedHistory(); onPageStarted(); onPageFinished(); onReceivedTitle(); onProgressChanged();

細節(jié)2:需要過濾掉 Object 類的方法

  • 由于最終是通過反射得到Android指定對象的方法,所以同時也會得到基類的其他方法(最頂層的基類是 Object類)

  • 為了不把 getClass() 等方法注入到 JS 中,我們需要把 Object 的共有方法過濾掉,需要過濾的方法列表如下:

getClass() hashCode() notify() notifyAl() equals() toString() wait()

總結

  • 對于Android 4.2以前,需要采用攔截 prompt() 的方式進行漏洞修復

  • 對于Android 4.2以后,則只需要對被調用的函數(shù)以 @JavascriptInterface 進行注解

  • 關于 Android 系統(tǒng)占比,Google公布的數(shù)據(jù):截止 2017 .1 .8 ,Android4.4 之下占有約15%,所以需要重視。


2.1.2、searchBoxJavaBridge_接口引起遠程代碼執(zhí)行漏洞

漏洞產生原因

  • 在Android 3.0以下,Android系統(tǒng)會默認通過 searchBoxJavaBridge_ 的Js接口給 WebView 添加一個JS映射對象: searchBoxJavaBridge_對象

  • 該接口可能被利用,實現(xiàn)遠程任意代碼。


解決方案

刪除 searchBoxJavaBridge_ 接口

// 通過調用該方法刪除接口 removeJavascriptInterface();

2.1.3、accessibility和 accessibilityTraversal接口引起遠程代碼執(zhí)行漏洞

問題分析與解決方案同上,這里不作過多闡述。


2.2、密碼明文存儲漏洞

2.2.1 問題分析

WebView默認開啟密碼保存功能 :

mWebView.setSavePassword(true)
  • 開啟后,在用戶輸入密碼時,會彈出提示框:詢問用戶是否保存密碼;

  • 如果選擇”是”,密碼會被明文保到 /data/data/com.package.name/databases/webview.db 中,這樣就有被盜取密碼的危險


2.2.2、解決方案

關閉密碼保存提醒

WebSettings.setSavePassword(false)

2.3、域控制不嚴格漏洞

2.3.1、問題分析

先看Android里的 WebViewActivity.java:

public class WebViewActivity extends Activity {private WebView webView;public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_webview);webView = (WebView) findViewById(R.id.webView);//webView.getSettings().setAllowFileAccess(false); (1)//webView.getSettings().setAllowFileAccessFromFileURLs(true); (2)//webView.getSettings().setAllowUniversalAccessFromFileURLs(true); (3)Intent i = getIntent();String url = i.getData().toString(); //url = file:///data/local/tmp/attack.html webView.loadUrl(url);}}/**Mainifest.xml**/ // 將該 WebViewActivity 在Mainifest.xml設置exported屬性 // 表示:當前Activity是否可以被另一個Application的組件啟動 android:exported="true"

即 A 應用可以通過 B 應用導出的 Activity 讓 B 應用加載一個惡意的 file 協(xié)議的 url,從而可以獲取 B 應用的內部私有文件,從而帶來數(shù)據(jù)泄露威脅

具體:當其他應用啟動此 Activity 時, intent 中的 data 直接被當作 url 來加載(假定傳進來的 url 為 file:///data/local/tmp/attack.html ),其他 APP 通過使用顯式 ComponentName 或者其他類似方式就可以很輕松的啟動該 WebViewActivity 并加載惡意url。

下面我們著重分析WebView中getSettings類的方法對 WebView 安全性的影響:

  • setAllowFileAccess()

  • setAllowFileAccessFromFileURLs()

  • setAllowUniversalAccessFromFileURLs()

1、setAllowFileAccess()

// 設置是否允許 WebView 使用 File 協(xié)議 webView.getSettings().setAllowFileAccess(true); // 默認設置為true,即允許在 File 域下執(zhí)行任意 JavaScript 代碼

使用 file 域加載的 js代碼能夠使用進行同源策略跨域訪問,從而導致隱私信息泄露

  • 同源策略跨域訪問:對私有目錄文件進行訪問

  • 針對 IM 類產品,泄露的是聊天信息、聯(lián)系人等等

  • 針對瀏覽器類軟件,泄露的是cookie 信息泄露。

如果不允許使用 file 協(xié)議,則不會存在上述的威脅;

webView.getSettings().setAllowFileAccess(true);

但同時也限制了 WebView 的功能,使其不能加載本地的 html 文件,如下圖:

移動版的 Chrome 默認禁止加載 file 協(xié)議的文件


解決方案:

  • 對于不需要使用 file 協(xié)議的應用,禁用 file 協(xié)議;
setAllowFileAccess(false);
  • 對于需要使用 file 協(xié)議的應用,禁止 file 協(xié)議加載 JavaScript。
setAllowFileAccess(true); // 禁止 file 協(xié)議加載 JavaScript if (url.startsWith("file://") {setJavaScriptEnabled(false); } else {setJavaScriptEnabled(true); }

2、setAllowFileAccessFromFileURLs()

// 設置是否允許通過 file url 加載的 Js代碼讀取其他的本地文件 webView.getSettings().setAllowFileAccessFromFileURLs(true); // 在Android 4.1前默認允許 // 在Android 4.1后默認禁止

當 AllowFileAccessFromFileURLs() 設置為 true 時,攻擊者的JS代碼為:

<script> function loadXMLDoc() {var arm = "file:///etc/hosts";var xmlhttp;if (window.XMLHttpRequest){xmlhttp=new XMLHttpRequest();}xmlhttp.onreadystatechange=function(){//alert("status is"+xmlhttp.status);if (xmlhttp.readyState==4){console.log(xmlhttp.responseText);}}xmlhttp.open("GET",arm);xmlhttp.send(null); } loadXMLDoc(); </script>// 通過該代碼可成功讀取 /etc/hosts 的內容數(shù)據(jù)

解決方案:

設置 setAllowFileAccessFromFileURLs(false);

當設置成為 false 時,上述JS的攻擊代碼執(zhí)行會導致錯誤,表示瀏覽器禁止從 file url 中的 javascript 讀取其它本地文件。

3、setAllowUniversalAccessFromFileURLs()

// 設置是否允許通過 file url 加載的 Javascript 可以訪問其他的源(包括http、https等源) webView.getSettings().setAllowUniversalAccessFromFileURLs(true);// 在Android 4.1前默認允許(setAllowFileAccessFromFileURLs()不起作用) // 在Android 4.1后默認禁止

當 AllowFileAccessFromFileURLs() 被設置成true時,攻擊者的JS代碼是:

// 通過該代碼可成功讀取 http://www.so.com 的內容 <script> function loadXMLDoc() {var arm = "http://www.so.com";var xmlhttp;if (window.XMLHttpRequest){xmlhttp=new XMLHttpRequest();}xmlhttp.onreadystatechange=function(){//alert("status is"+xmlhttp.status);if (xmlhttp.readyState==4){console.log(xmlhttp.responseText);}}xmlhttp.open("GET",arm);xmlhttp.send(null); } loadXMLDoc(); </script>

解決方案:

設置 setAllowUniversalAccessFromFileURLs(false);

4、setJavaScriptEnabled()

// 設置是否允許 WebView 使用 JavaScript(默認是不允許) webView.getSettings().setJavaScriptEnabled(true); // 但很多應用(包括移動瀏覽器)為了讓 WebView 執(zhí)行 http 協(xié)議中的 JavaScript,都會主動設置為true,不區(qū)別對待是非常危險的。

即使把 setAllowFileAccessFromFileURLs()setAllowUniversalAccessFromFileURLs() 都設置為 false,通過 file URL 加載的 javascript 仍然有方法訪問其他的本地文件:符號鏈接跨源攻擊

前提是允許 file URL 執(zhí)行 javascript,即 webView.getSettings().setJavaScriptEnabled(true);

這一攻擊能奏效的原因是:通過 javascript 的延時執(zhí)行和將當前文件替換成指向其它文件的軟鏈接就可以讀取到被符號鏈接所指的文件。

具體攻擊步驟:

  • 把惡意的 js 代碼輸出到攻擊應用的目錄下,隨機命名為 xx.html,修改該目錄的權限;

  • 修改后休眠 1s,讓文件操作完成;

  • 完成后通過系統(tǒng)的 Chrome 應用去打開該 xx.html 文件

  • 等待 4s 讓 Chrome 加載完成該 html,最后將該 html 刪除,并且使用 ln -s 命令為 Chrome 的 Cookie 文件創(chuàng)建軟連接

注:在該命令執(zhí)行前 xx.html 是不存在的;執(zhí)行完這條命令之后,就生成了這個文件,并且將 Cookie 文件鏈接到了 xx.html 上。

于是就可通過鏈接來訪問 Chrome 的 Cookie

1、Google 沒有進行修復,只是讓Chrome 最新版本默認禁用 file 協(xié)議,所以這一漏洞在最新版的 Chrome 中并不存在
2、但是,在日常大量使用 WebView 的App和瀏覽器,都有可能受到此漏洞的影響。通過利用此漏洞,容易出現(xiàn)數(shù)據(jù)泄露的危險

如果是 file 協(xié)議,禁用 javascript 可以很大程度上減小跨源漏洞對 WebView 的威脅。

1、但并不能完全杜絕跨源文件泄露。
2、例:應用實現(xiàn)了下載功能,對于無法加載的頁面,會自動下載到 sd 卡中;由于 sd 卡中的文件所有應用都可以訪問,于是可以通過構造一個 file URL 指向被攻擊應用的私有文件,然后用此 URL 啟動被攻擊應用的 WebActivity,這樣由于該 WebActivity 無法加載該文件,就會將該文件下載到 sd 卡下面,然后就可以從 sd 卡上讀取這個文件了

最終解決方案

對于不需要使用 file 協(xié)議的應用,禁用 file 協(xié)議;

// 禁用 file 協(xié)議; setAllowFileAccess(false); setAllowFileAccessFromFileURLs(false); setAllowUniversalAccessFromFileURLs(false);

對于需要使用 file 協(xié)議的應用,禁止 file 協(xié)議加載 JavaScript。

// 需要使用 file 協(xié)議 setAllowFileAccess(true); setAllowFileAccessFromFileURLs(false); setAllowUniversalAccessFromFileURLs(false);// 禁止 file 協(xié)議加載 JavaScript if (url.startsWith("file://") {setJavaScriptEnabled(false); } else {setJavaScriptEnabled(true); } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結

以上是生活随笔為你收集整理的Android WebView 使用漏洞的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 一区二区亚洲 | 国产精品久久久久久久免费 | 麻豆自拍视频 | 九九热九九热 | 自拍偷拍亚洲欧洲 | 欧美精品国产一区二区 | 大奶在线观看 | 国产一区二区三区免费观看 | 欧类av怡春院 | 韩国三级bd高清中字2021 | 草莓巧克力香氛动漫的观看方法 | 国产欧美三区 | 国产精品免费一区 | 又黄又爽网站 | 色婷婷av一区二区三 | 精品久久在线观看 | 美女屁股眼视频网站 | 自拍偷拍日韩精品 | 黄网站免费观看 | 女人高潮特级毛片 | 国内黄色一级片 | 伊人网狼人 | 97在线观看免费视频 | 日韩一级片在线 | 久久国产精品-国产精品 | 黄色观看网站 | 九一av| 久久国产精品久久国产精品 | 国产91精品高潮白浆喷水 | 人妖干美女 | а√在线中文网新版地址在线 | 污污动态图 | 日韩黄色短视频 | 五月天色综合 | 日日拍夜夜拍 | 18禁裸男晨勃露j毛免费观看 | 乖女从小调教h尿便器小说 欧美韩一区二区 | 在线观看日韩 | 亚洲四区在线 | 狠狠操在线 | 欧美一级色 | 一级黄色大片免费 | 日韩麻豆 | 中日韩av在线 | 亚洲国产精品成人久久蜜臀 | 黄色片久久久 | 91国产网站| 日韩伦理av| 中文字幕一区不卡 | 在线观看黄av | 色偷偷噜噜噜亚洲男人的天堂 | 国内视频一区二区 | 久久成年网 | 免费在线观看a视频 | 亚洲成人国产精品 | 嫩草视频在线免费观看 | 国产精品一区二区黑人巨大 | 精品人妻人人做人人爽 | 国产成人精品一区二区三区网站观看 | 日批免费观看视频 | 在线观看一级片 | 精品无码国产一区二区三区av | 韩国女同性做爰三级 | 国产99久久久国产精品成人免费 | 新红楼梦2005锦江版高清在线观看 | 懂色av蜜臀av粉嫩av分享吧最新章节 | av网站观看 | 一本色道久久综合亚洲精品图片 | 午夜精品久久久久久久四虎美女版 | 91成人福利| 爱爱免费视频 | zzjizzji亚洲日本少妇 | 国产黄视频在线观看 | 91最新地址永久入口 | 嫩草网站在线观看 | 伊人久久国产 | 国产精品久久久久久久久久东京 | 午夜毛片 | xxxx国产| 亚洲视频综合 | 日韩高清二区 | 久久精品a亚洲国产v高清不卡 | 国产网站av| 激情视频一区二区三区 | 精品成人免费一区二区在线播放 | 青娱乐国产视频 | 少妇精品无码一区二区三区 | 日本热久久 | 国产三级91| 中文在线а√天堂官网 | 久久高清无码电影 | 久久久久看片 | 色就色综合 | 日韩福利在线视频 | 日本裸体网站 | 啊v视频在线观看 | 久久久久久久黄色片 | 日本不卡一区二区三区视频 | 午夜影院体验区 |