近來在學習XSS绰疤,感覺有一些感悟,卻又好像缺少一點什么柑肴。寫這篇博客霞揉,既是一種總結(jié),也希望能夠通過這種寫博客的方式整理一下自己的思路晰骑,當然如果有前輩能夠不吝賜教的話就更好了适秩。
0X01 理解瀏覽器對于編碼的解析過程
關(guān)于這一點,segmentfault上面有一個回答解釋的非常好:
當用戶點擊鏈接時硕舆,服務(wù)端首先通過URL解碼秽荞,將input解析成了"<\u4e00>"。
然后瀏覽器在渲染的時候抚官,首先進行HTML解碼扬跋,得到"<\u4e00>"。
然后"javascript:"出發(fā)了javascript解釋器進行javascript解碼凌节,這個過程中\(zhòng)u4e00被按照unicode編碼解釋成了"一"钦听。
綜合上面的例子,我們可以看到解碼的過程是按照先URL解碼倍奢,再HTML解碼朴上,然后JS解碼的過程進行的。在HTML解碼的過程中卒煞,是先生成DOM樹痪宰,然后再對樹上的每一個節(jié)點進行HTML的解析,因此構(gòu)造編碼的時候,不能導致破壞DOM樹結(jié)構(gòu)的情況酵镜,否則HTML解析就會出錯碉碉。
0X02 XSS的類型
反射型
反射型XSS也叫做”非持久性XSS”,在XSS攻擊的過程中柴钻,數(shù)據(jù)的流向是:
前端--->后端--->前端
因為不能存儲到后臺數(shù)據(jù)庫淮韭,因此其也是“一次性的”,一般的利用方法是構(gòu)造鏈接贴届,誘騙目標點擊靠粪。
存儲型
存儲型的XSS顧名思義就是會把輸入的數(shù)據(jù)存放到服務(wù)端,數(shù)據(jù)可以長時間保存毫蚓。其數(shù)據(jù)流向是:
瀏覽器--->后端--->數(shù)據(jù)庫--->后端--->瀏覽器
因為其可以存儲的特性占键,存儲型XSS是最優(yōu)的選擇。
DOM型
DOM型的XSS其實也算是反射型XSS的一種元潘,只不過它是通過修改頁面的DOM節(jié)點形成的XSS,稱之為DOM based XSS畔乙。其數(shù)據(jù)流向是:
URL--->瀏覽器
0X03 常見的XSS攻(qi)擊(ji)方(yin)法(qiao)
(1)比如XSS-challenge stage10中,用戶的輸入被屏蔽了domain翩概,因此無法正常的輸入alert(document.domain)牲距。這時可以考慮通過alert(document.domdomainain)來繞過,原理是中間的domain被過濾掉之后钥庇,兩邊的dom和ain被拼接到了一起牍鞠,又是一個domain。
(2)<评姨、>难述、\、"吐句、'胁后、script被過濾。這幾個關(guān)鍵的字符都是XSS攻擊中非常常見而且使用頻率最高的一些字符嗦枢,很多網(wǎng)站針對XSS的防御也是通過各種規(guī)則過濾這些特殊字符來實現(xiàn)的择同。需要具體情況具體分析,來設(shè)計繞過的字符串净宵。
(3)通過編碼的方式敲才。javascript中常用函數(shù)String.fromCharCode( )可以接受unicode編碼然后轉(zhuǎn)成ASCII碼輸出,而eval()函數(shù)接受javascript代碼的字符串择葡,并執(zhí)行這段代碼紧武。因此在XSS利用過程中,常常會通過eval(String.fromCharCode(unicodenum1,unicodenum2...))然后在進行URL編碼敏储。
PS:后續(xù)還會追加更新
0X04 參考資料
詳細的講述了瀏覽器解碼的過程。
2、瀏覽器的解碼順序(html解碼妥箕、url解碼以及js解碼)
本文中參考的例子就來自這個問題滥酥。
作者由淺入深用很多實際例子講解了各種XSS問題
4畦幢、Web安全 — XSS漏洞
作者用簡單的小例子講解了三種XSS的概念
特別詳細的講了編碼解碼的過程