徐少培,來(lái)自于騰訊玄武實(shí)驗(yàn)室的研究員,主要是從事Web安全研究以及瀏覽器安全研究(前端)。曾經(jīng)和余弦合寫了《Web前端黑客技術(shù)揭秘》。
本文通過(guò)徐少培三個(gè)Chrome地址欄漏洞,來(lái)總結(jié)一下地址欄上漏洞挖掘的思路和技巧,徐少培并提出如何深刻的理解地址欄之困,才能更好的挖掘地址欄上的漏洞的理論。
地址欄到底有多重要?
在現(xiàn)代瀏覽器當(dāng)中,地址欄是唯一可靠的指示器。就是通俗的說(shuō),如果地址欄上出現(xiàn)了問(wèn)題,后續(xù)我們所見(jiàn)到的Web頁(yè)面,可信任的這些體系將全部崩塌。對(duì)于瀏覽器廠商,他們的主要任務(wù)是消除軟件當(dāng)中的緩沖區(qū)溢出漏洞。其次,如何幫助人們?cè)谏暇W(wǎng)的時(shí)候做出安全的決策。這個(gè)安全指示符(地址欄)就是他們?cè)谶@上面所做的工作之一。
安全指示符
安全指示符,它的目的就在于如何表示當(dāng)前網(wǎng)站的安全狀態(tài),比如說(shuō)一個(gè)盾牌,一個(gè)小鎖或者說(shuō)一個(gè)其他的圖標(biāo)。常見(jiàn)的瀏覽器廠商是怎么設(shè)計(jì)它們的標(biāo)識(shí)符的?Chrome就是一個(gè)綠色的小圖標(biāo),這是一個(gè)灰色的大圖標(biāo),F(xiàn)irefox也是綠色的,但是它的綠色的顏色跟Chrome還不太一樣,Safari是一個(gè)小圖標(biāo),還有一個(gè)盾牌,國(guó)內(nèi)的瀏覽器可能是一個(gè)運(yùn)行的地球。
這么多對(duì)同一個(gè)技術(shù)狀態(tài)的描述,用了不同的指示符。谷歌2015年的時(shí)候做了一個(gè)調(diào)查,大家對(duì)地址欄上的指示符到底是不是真正的了解,在谷歌匿名調(diào)查的1329人當(dāng)中,其中提出了兩個(gè)問(wèn)題。一,你對(duì)HTTPS網(wǎng)址,對(duì)左邊的這個(gè)符號(hào)是否了解,如果是HTTP的話,你對(duì)HTTP左邊的白色符號(hào)是否了解。最后的結(jié)果其實(shí)很尷尬,在訪問(wèn)的1329人當(dāng)中,大部分人對(duì)于HTTPS這個(gè)指示符還知道。對(duì)于HTTP這個(gè)標(biāo)識(shí)符,大部分人不知道答案。
URL
1994年的時(shí)候發(fā)布了第一個(gè)標(biāo)準(zhǔn)URL,在1998年的時(shí)候發(fā)布了擴(kuò)充版RRI。2005年的時(shí)候發(fā)布了IRI,就是國(guó)際統(tǒng)一指示符。
網(wǎng)址到底是什么呢?是URL?是URI?是IRI?公認(rèn)網(wǎng)址就是URL,而且URL目前維護(hù)的這一套標(biāo)準(zhǔn),而且這個(gè)標(biāo)準(zhǔn)還提出,URL的解析,應(yīng)該像HTML的解析一樣堅(jiān)固,不要有太多的歧義。
漏洞挖掘過(guò)程當(dāng)中對(duì)URL有什么意義?
地址欄漏洞的關(guān)鍵因素就是URL。又分為協(xié)議、主機(jī)、端口、參數(shù)、目錄幾部分
協(xié)議分為本地協(xié)議,網(wǎng)絡(luò)協(xié)議,注冊(cè)的協(xié)議,比如說(shuō)HTTP、HTPPS,這些協(xié)議容易出現(xiàn)安全問(wèn)題。
主機(jī),當(dāng)瀏覽器地址很小,可以把主機(jī)的覆蓋掉而顯示前面?zhèn)窝b的多級(jí)域名主機(jī)。
對(duì)于端口,目前默認(rèn)的端口是空,或者是無(wú)符號(hào)16位的一個(gè)整形。端口過(guò)多可以出現(xiàn)問(wèn)題。
地址欄漏洞
什么是地址欄上的漏洞,這里所說(shuō)的地址欄上的偽裝漏洞就是URL Spoof,本質(zhì)是Web最基本的安全邊界。
Web當(dāng)中最扎實(shí),最有根基的就是同源策略,如果這個(gè)源被偽造,后續(xù)所有的安全體系將會(huì)全部崩塌。這個(gè)起源指的是什么呢?起源指的是協(xié)議加上主機(jī),加上端口。
對(duì)于瀏覽器廠商,普通用戶報(bào)貨開發(fā)者都不關(guān)注源是什么,而傾向于主機(jī)是什么,所以在地址欄當(dāng)中,只要偽造主機(jī)就可以了。你只要偽造了主機(jī)這一個(gè)字符串,你就可以說(shuō)這是一個(gè)URL Spoof漏洞。
地址欄漏洞如何挖掘
此處用三個(gè)Chrome地址欄漏洞來(lái)分析地址欄上的漏洞應(yīng)該如何挖掘
第一個(gè)漏洞。當(dāng)用戶點(diǎn)擊了一個(gè)跳轉(zhuǎn)到Gmail,由于Gmail的頁(yè)面是攻擊者偽裝的。當(dāng)你登錄Gmail,輸入用戶名和密碼,你的信息就被攻擊者獲取。
這個(gè)漏洞是如何實(shí)現(xiàn)的。
當(dāng)用戶點(diǎn)擊這個(gè)按鈕的時(shí)候,打開了一個(gè)頁(yè)面,寫下了一堆關(guān)鍵代碼。這個(gè)代碼是在當(dāng)前頁(yè)面用A標(biāo)簽自身又打開了一個(gè)窗口,導(dǎo)航到了一個(gè)地址這是一個(gè)畸形的URL,最后有兩個(gè)冒號(hào),就是瀏覽器基本上默認(rèn)是無(wú)法去解析的,于是漏洞就觸發(fā)了。這個(gè)畸形的URL會(huì)使瀏覽器發(fā)生了什么呢?
當(dāng)Chrome瀏覽器運(yùn)行到畸形的URL時(shí),它允許去加載,這就是錯(cuò)誤的開始。當(dāng)加載了這個(gè)畸形的URL的時(shí)候,因?yàn)榧虞d的是無(wú)效的地址,根本沒(méi)有辦法去訪問(wèn)。地址欄處于掛載的狀態(tài)。加載反饋數(shù)據(jù),就是瀏覽器加載的流程開始返回。因?yàn)槟慵虞d的是一個(gè)無(wú)效地址,只能返回一個(gè)空的頁(yè)面,也就是說(shuō)返回了一個(gè)空域。此時(shí)Chrome還處于掛起狀態(tài),于是會(huì)冒號(hào)完全隱藏掉并顯示最后的地址。
第二個(gè)漏洞。這個(gè)協(xié)議是發(fā)生在Blog協(xié)議上,我簡(jiǎn)單說(shuō)一下,Blog協(xié)議其實(shí)是一個(gè)二進(jìn)制文件的容器,Blog URL允許外部應(yīng)用程序安全的訪問(wèn)內(nèi)存中二進(jìn)制的文件,也就是說(shuō),對(duì)于內(nèi)存中二進(jìn)制文件的一個(gè)Blog引用。按理說(shuō)安全同源策略來(lái)說(shuō),你不可能直接打開一個(gè)你不能控制域的Blog的URL,通過(guò)這個(gè)頁(yè)面,從視覺(jué)感官上是成功打開了谷歌域的Blog的URL,其實(shí)是偽造的。
如何做到的?當(dāng)你點(diǎn)擊了這個(gè)按鈕之后,其實(shí)首先打開了一個(gè)攻擊者可控制域的Blog的URL,就是下面這個(gè)黃色的關(guān)鍵核心的。過(guò)了500毫秒之后,在這個(gè)頁(yè)面上寫入偽造內(nèi)容。大家可以看到黃色的關(guān)鍵代碼,@后面的域才是攻擊者的域,就是我可控制的,而前面的那些都是偽造的。首先偽造了一個(gè)谷歌的字符串,后面進(jìn)了大量的空白字符。瀏覽器遇到這樣的字符串,這樣的URL。10前來(lái)說(shuō)這個(gè)是正常的URL,但是現(xiàn)在已經(jīng)不允許了,我一會(huì)兒會(huì)說(shuō)一下為什么。Chrome會(huì)怎么處理呢?Chrome其實(shí)犯了一個(gè)邏輯上非常嚴(yán)重的錯(cuò)誤,他一直在對(duì)HTTP、HTTP做了很多限制,可能邊緣化的協(xié)議沒(méi)有太注意。其實(shí)它渲染了用戶名和密碼的部分,就是@符號(hào)前面的部分,按理說(shuō)應(yīng)該不會(huì)去渲染。就是你可以去解析,但是你在UI上顯示的時(shí)候不能顯示出來(lái)。因?yàn)橐粋€(gè)URL的用戶名和密碼一旦被渲染,極有可能被用戶認(rèn)為是這個(gè)URL的主機(jī)。比如下面我列舉的這個(gè)鏈接,如果直接全被渲染的話,@前面的字符串就有可能被認(rèn)為是這個(gè)主機(jī),也就是偽造了這個(gè)域名。
第三個(gè)漏洞。這個(gè)漏洞其實(shí)觸發(fā)起來(lái)核心代碼就是右鍵點(diǎn)擊,出來(lái)了一個(gè)UI,當(dāng)中會(huì)有一個(gè)你是不是從新窗口打開,。
抓包以后可以看到,其實(shí)在左邊抓的,兩個(gè)鏈接,其實(shí)都已經(jīng)訪問(wèn)了,但是最終Chrome瀏覽器是停留在谷歌的網(wǎng)址上,但是頁(yè)面內(nèi)容是我的頁(yè)面內(nèi)容,可控制的,就造成了一個(gè)URL欺騙。這個(gè)Payload發(fā)生了什么?我們通過(guò)URL加載的過(guò)程來(lái)說(shuō)一下,當(dāng)你通過(guò)右鍵在新窗口打開,Chrome又允許加載一個(gè)無(wú)效的地址。當(dāng)時(shí)在53版本的時(shí)候其實(shí)Chrome已經(jīng)補(bǔ)了,當(dāng)時(shí)不允許加載無(wú)效的網(wǎng)址,而且專門把這兩個(gè)冒號(hào)標(biāo)識(shí)出來(lái)了。但是沒(méi)有補(bǔ)的時(shí)候,說(shuō)通過(guò)不同的網(wǎng)站,不同的方式打開,通過(guò)右鍵去打開,可能導(dǎo)航又是另一套程序,這一塊就沒(méi)有考慮,還是可以加載google.com:的這樣一個(gè)無(wú)效網(wǎng)址。加載以后,剛才我說(shuō)的那一套流程又返回頁(yè)面,把google.com:作為一個(gè)提交地址。其實(shí)到這里應(yīng)該結(jié)束了,如果你在當(dāng)前重定向到另外一個(gè)網(wǎng)上,不會(huì)更新當(dāng)前的URL,URL還會(huì)停留在谷歌,其實(shí)你的內(nèi)容已經(jīng)重定向到了另一個(gè)網(wǎng)站的內(nèi)容,于是又產(chǎn)生了一個(gè)URL的欺騙。
用戶在一個(gè)網(wǎng)站頁(yè)面,你不管是點(diǎn)擊、拖放還是右鍵,去導(dǎo)航到另一個(gè)網(wǎng)站的時(shí)候。在這個(gè)過(guò)程當(dāng)中,攻擊者偽造了你的目的地的URL,其實(shí)相當(dāng)于你就沒(méi)有到達(dá)目的網(wǎng)站,你是困在了你在哪兒和你要去哪兒的這個(gè)中間。
瀏覽器地址欄其實(shí)是一個(gè)挺矛盾的個(gè)體,它提供兩個(gè)相互競(jìng)爭(zhēng)的角色,這兩個(gè)角色就是你在哪兒和你要去哪兒,但是只能顯示出其中的一個(gè)。而地址欄恰恰就困在這兩個(gè)角色的轉(zhuǎn)換之中,其實(shí)你沒(méi)有真正的轉(zhuǎn)換到你要去哪兒,就已經(jīng)被攻擊者偽造了你要去哪兒的那個(gè)網(wǎng)站了,就停留在那兒了。從視覺(jué)感官上來(lái)說(shuō),你也被困在里面了
對(duì)于地址欄上的指示符還需要進(jìn)一步的優(yōu)化,盡快的幫助人們上網(wǎng)的時(shí)候做出安全的決策。地址欄在處理常網(wǎng)址、多網(wǎng)址、畸形網(wǎng)址的時(shí)候,不是程序的問(wèn)題,是自身的地址欄顯示的邏輯問(wèn)題。比如說(shuō)只顯示最左邊或者是只顯示最右邊,少一些邏輯上明顯的漏洞。現(xiàn)在瀏覽器屏幕會(huì)越來(lái)越小,大家用到的手機(jī),地址欄上的UI可以說(shuō)是寸像素必爭(zhēng)了。又要提供安全性,又要顯示你是HTTPS是加密的,還要顯示出來(lái)正確的源是什么等等,估計(jì)空間也不夠。所以在如何處理安全性和用戶體驗(yàn)上,我覺(jué)得可能會(huì)是一個(gè)非常重要的挑戰(zhàn)。最關(guān)鍵的就是大家能記住我這一頁(yè),如果挖漏洞的話,記住如何深刻的理解地址欄之困,在地址欄上能夠如何有效的開展漏洞挖掘工作,也是我們進(jìn)一步思考的問(wèn)題。