原始paylaod
javascript:alert(15)
unicode編碼函數(shù)名alert
javascript:\u0061\u006c\u0065\u0072\u0074(15)
url編碼unicode編碼部分
javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(15)
最后在html編碼全部
<a href="javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(15)"></a>
回顧編碼過(guò)程
payload->unicode編碼處理->url編碼處理->html編碼處理
payload的效果
隨便個(gè)html文檔
<html>
<head>
<title>
測(cè)試用
</title>
</head>
<body>
<h1>what a fuck shit!</h1>
<hr>
<a href="javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(15)"></a>
<br/>
</body>
</html>
點(diǎn)我后的效果
圖片
分析下瀏覽器解碼過(guò)程
<a href="javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(15)"></a>
解碼過(guò)程
-
首先HTML解析器來(lái)對(duì)這段html文檔進(jìn)行詞法解析懂傀。字符引用(&#x..實(shí)體編號(hào))被解碼伸辟。
解碼后:<a href="javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(15)">點(diǎn)我</a>
-
在html詞法解析完成后,然后URL解析器開(kāi)始對(duì)href值進(jìn)行URL解碼
解碼后:<a href="javascript:\u0061\u006c\u0065\u0072\u0074(15)">點(diǎn)我</a>
-
由于是javascript協(xié)議資源仰迁,javascript引擎對(duì)unicode編碼的字符串進(jìn)行解碼览效,最終變成原始payload形式沥潭,js語(yǔ)句執(zhí)行
解碼后:<a href="javascript:alert(15)">點(diǎn)我</a>
知識(shí)來(lái)源
http://bobao.#/learning/detail/292.html
html解析的幾個(gè)點(diǎn):
- 解析器在解析字符引用(實(shí)體名稱(chēng)慎式、實(shí)體編號(hào):“&開(kāi)頭的編碼”)后不會(huì)轉(zhuǎn)換到“標(biāo)簽開(kāi)始狀態(tài)”终佛。正因?yàn)槿绱耍筒粫?huì)建立新標(biāo)簽翔忽。因此,xss能夠利用字符實(shí)體編碼來(lái)轉(zhuǎn)義用戶輸入的數(shù)據(jù)盏檐,從而確保用戶輸入的數(shù)據(jù)只能被解析成“數(shù)據(jù)”歇式,而不轉(zhuǎn)成html標(biāo)簽。
URL解析的幾個(gè)點(diǎn):
- URL資源類(lèi)型必須是ASCII字母(U+0041-U+005A || U+0061-U+007A)胡野,不然就會(huì)進(jìn)入“無(wú)類(lèi)型”狀態(tài)材失。例如,不能對(duì)協(xié)議類(lèi)型進(jìn)行任何的編碼操作硫豆,不然URL解析器會(huì)認(rèn)為它無(wú)類(lèi)型龙巨。該原則對(duì)協(xié)議后面的“:”(冒號(hào))同樣適用。(不能對(duì)“javascript:”進(jìn)行編碼)
- URL編碼過(guò)程使用UTF-8編碼類(lèi)型來(lái)編碼每一個(gè)字符熊响。
JS解析的幾個(gè)點(diǎn)可以記下:
- JavaScript解析器會(huì)對(duì)Unicode轉(zhuǎn)義序列和Hex轉(zhuǎn)義序列的解碼
- 轉(zhuǎn)義序列放在JS的3個(gè)部分:字符串中旨别,標(biāo)識(shí)符名稱(chēng)中和控制字符中
- Unicode轉(zhuǎn)義序列出現(xiàn)在JS字符串中:當(dāng)Unicode轉(zhuǎn)義序列存在于字符串中時(shí),它只會(huì)被解釋為正規(guī)字符汗茄,而不是單引號(hào)秸弛,雙引號(hào)或者換行符這些能夠打破字符串上下文的字符。因此洪碳,Unicode轉(zhuǎn)義序列將永遠(yuǎn)不會(huì)破環(huán)字符串上下文递览,因?yàn)樗鼈冎荒鼙唤忉尦勺址A俊M沓霈F(xiàn)在控制字符中
- Unicode轉(zhuǎn)義序列出現(xiàn)在JS標(biāo)識(shí)符名稱(chēng)中(函數(shù)名瞳腌,屬性名)時(shí)绞铃,它會(huì)被解碼并解釋為標(biāo)識(shí)符名稱(chēng)的一部分。
- Unicode轉(zhuǎn)義序列只有在JS標(biāo)識(shí)符名稱(chēng)里不被當(dāng)作字符串嫂侍,也只有在標(biāo)識(shí)符名稱(chēng)里的編碼字符能夠被正常的解析儿捧。