在手機中,我們通常訪問一個網站的做法是打開瀏覽器在地址欄中輸入網站地址,一般來說這樣的方法有些煩人,所以,有些網站訪問對象通常也會生成一個二維碼圖片,方便用戶直接掃碼訪問,只要用戶手機掃碼就能跳轉到目標訪問網站,或是把相應信息顯示在用戶手機中。幾乎我們所有人都會用手機的掃碼功能,但是,你是否想過,如果你信任的應用APP其掃碼功能出現安全錯誤,會發生什么情況?今天,我們就來談談Firefox IOS v10瀏覽器中的掃碼XSS漏洞。
Firefox IOS瀏覽器說明
根據蘋果應用商店的說明,Firefox IOS v10中加入了更多新東西,極簡的用戶界面,可以隱藏多余顯示圖片,增加了一個二維碼掃碼功能,能突出顯示瀏覽記錄和最新資訊。
也就是說,從Firefox IOS v10開始,火狐手機瀏覽器加入了二維碼掃碼功能,其中使用了WebKit web view組件來加載內容,其余的為SWIFT架構,包含在Firefox的漏洞眾測范圍之內。以下為Firefox IOS v10掃碼訪問網站的一個動圖:
用java URI構造XSS
所以,這里如何來發現其掃碼功能的漏洞呢?首先我想到的就是構造一個java URI形式去替代二維碼中的URL,看看掃碼功能如何判斷,是否會把它當成正常的文本,還是會當成java代碼去執行。我們試試看。
在這里,我們用到了一個很好的二維碼生成網站 https://the-qrcode-generator/ ,在其中輸入你的內容就能自動生成一個二維碼。因此,我們輸入以下java URI形式內容看看:
java:fetch(‘/’).then(res=>res.text).then(data=>alert(data));
java:alert(document.body.innerHTML);
java:fetch(‘/’).then(res=>res.text).then(data=>alert(data));
java:alert(document.body.innerHTML);
以上這兩個java URI功能為獲取用戶之前最后在瀏覽器中瀏覽過的網站信息。所以,假設有這么一種情況,當前用戶處于瀏覽google的狀態,但他通過Firefox掃碼想訪問另一網站,那么,如果掃碼的嵌入內容是我們上述的java URI,那么當他一掃碼就會跳出其訪問google的一些相關信息來。試試,確實可以,具體如下:
所以,這樣一來,既然能在這個點上完成java 代碼執行,惡意攻擊者也就能用它竊取用戶cookie或其他相關信息了。這種攻擊范圍不僅只限于網站地址訪問可以用它來實現多種攻擊場景,如瀏覽器的閱讀模式。
瀏覽器閱讀模式下的XSS漏洞觸發
閱讀模式是瀏覽器提供給用戶的一種極簡閱讀體驗,在這種模式的加載過程中,瀏覽器會剔除掉一些不必要的代碼、框架、其它嵌入元素的渲染以及廣告的干擾。同樣,我用之前生成的形式看看是否能在閱讀模式下實現XSS,確實可以:
其中在代碼執行后會跳出,這是java的window.location.href的用法,可以構造成這樣的跳轉鏈接:
在最后加入任意網站URL就能配合其它漏洞進行利用,形成對用戶信息的進一步威脅。
本地文件加載過程的XSS觸發
可以用該漏洞來觸發一些手機本地的文件加載,掃碼后,就有加載本地文件,以file:///test.html為例:
內聯頁面加載過程的XSS觸發
在偽協議internal://頁面加載過程中形成XSS ,如:
CSP繞過
該漏洞同樣可以用來繞過CSP限制,比如某個網站只限于訪問來自它自身的內容,如以下代碼場景:
// test.php
header("Content-Security-Policy: default-src 'self'");
if(isset($_GET['xss'])) {
echo $_GET['xss'];
}
?>
所以即使是這樣的限制,我們構造的二維碼java代碼也可以無限制運行。
其它場景
還可以在頁面選定文本的查找中,如果選定文本是java URI形式,那么Firefox手機瀏覽器就會執行其中的js代碼,但這種利用危害較小,只會顯示一個錯誤加載框,但好在還可以用它來把用戶導向其它惡意網站。
其它瀏覽器的該漏洞情況
除了Firefox,Opera mini for IOS也存在上述XSS漏洞,我們已經及時告知了Opera官方,但他們目前為止還未給出回應。
漏洞原因分析
從v10一直到v19版本,Firefox 都在地址欄中支持 java URI 調用,這樣就存在上述XSS可能。


