這篇文章將為大家詳細(xì)講解有關(guān)如何對(duì)瀏覽器解析和XSS的深度探究,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
巴州網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。成都創(chuàng)新互聯(lián)于2013年開始到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。
為什么要進(jìn)行編碼?
主要是因?yàn)槟承?shù)據(jù)不適合傳輸。原因多種多樣,如 Size 過大,包含隱私數(shù)據(jù),另外重要的一點(diǎn)就是有些字符會(huì)引起歧義。
對(duì)于 URL: &用于分割多個(gè)參數(shù),倘若有某個(gè)參數(shù)鍵值為 name=v&lue,就會(huì)因?yàn)?name 參數(shù)的值 v&lue 中攜帶了&而造成歧義。因此需要對(duì)&進(jìn)行 URL 編碼。url編碼后,服務(wù)端會(huì)把緊跟在“%”后的字節(jié)當(dāng)成普通的字節(jié),就是不會(huì)把它當(dāng)成各個(gè)參數(shù)或鍵值對(duì)的分隔符。
對(duì)于 HTML: 當(dāng)瀏覽器遇到<會(huì)識(shí)別為元素定義的開始,>會(huì)識(shí)別為元素的結(jié)束。倘若有<div id="1>" ></div>,由于標(biāo)簽的屬性值攜帶了>,同樣會(huì)造成歧義。因此需要屬性值的>需要 進(jìn)行 HTML 編碼,即使用字符實(shí)體。
字符實(shí)體是一個(gè)預(yù)先定義好的轉(zhuǎn)義序列。 字符實(shí)體兩種表示方法:
1、 字符實(shí)體以&開頭+預(yù)先定義的實(shí)體名稱+;分號(hào)結(jié)束,如“<”的實(shí)體名稱為&lt;
2、 字符實(shí)體還可以以&開頭+#符號(hào)+字符在 ASCII 對(duì)應(yīng)的十進(jìn)制數(shù)字+;分號(hào)結(jié)束,如<的實(shí)體編號(hào)為&#60;
字符都是有實(shí)體編號(hào)的,但有些字符是沒有實(shí)體名稱
顯示結(jié)果 | 描述 | 實(shí)體名稱 | 實(shí)體編號(hào) |
---|---|---|---|
空格 | &nbsp; | &#160; | |
< | 小于號(hào) | &lt; | &#60; |
> | 大于號(hào) | &gt; | &#62; |
& | 和號(hào) | &amp; | &#38; |
" | 引號(hào) | &quot; | &#34; |
' | 撇號(hào) | &apos; (IE不支持) | &#39; |
¢ | 分(cent) | &cent; | &#162; |
£ | 鎊(pound) | &pound; | &#163; |
¥ | 元(yen) | &yen; | &#165; |
€ | 歐元(euro) | &euro; | &#8364; |
§ | 小節(jié) | &sect; | &#167; |
? | 版權(quán)(copyright) | &copy; | &#169; |
? | 注冊(cè)商標(biāo) | &reg; | &#174; |
? | 商標(biāo) | &trade; | &#8482; |
× | 乘號(hào) | &times; | &#215; |
÷ | 除號(hào) | &divide; | &#247; |
最常用的,如\uXXXX 這種寫法的Unicode 轉(zhuǎn)義序列,表示一個(gè)字符,其中 XXXX 表示一個(gè) 16 進(jìn)制數(shù)字,如<的Unicode 編碼為\u003c。
RFC3986 文檔規(guī)定,URL 中只允許包含英文字母(a-zA-Z)、數(shù)字(0-9)、-_.~4 個(gè)特殊字 符以及所有保留字符。 RFC3986 中指定了以下字符為保留字符:! * ' ( ) ; : @ & = + $ , / ? # [ ]
編碼方式 %加字符在 ASCII 碼表中的十六進(jìn)制值。例如,/在 ASCII 碼表中十六進(jìn)制為 0x2f,那么它對(duì)應(yīng)的 URL 編碼為%2f。
JavaScript 中提供了 3 個(gè)函數(shù)用來對(duì) URL 編碼以得到合法的 URL:
1、 escape()
2、 encodeURI()
3、 encodeURIComponent()
瀏覽器無論什么情況都會(huì)遵守一個(gè)這樣的解碼規(guī)則:
1、 HTML 解析器對(duì) HTML 文檔進(jìn)行解析,完成 HTML 解碼并且創(chuàng)建 DOM 樹
2、 JavaScript 或者 CSS 解析器對(duì)內(nèi)聯(lián)腳本進(jìn)行解析,完成 JS、CSS 解碼
3、 URL 解碼會(huì)根據(jù) URL 所在的順序不同而在 JS 解碼前或者解碼后
3.1.1HTML 中有五類元素:
1、 空元素(Voidelements),有 area、base、br、col、command、embed、hr、img、input、 keygen、link、meta、param、source、track、wbr
2、 原始文本元素(Raw textelements),有<script>和<style>
3、 RCDATA 元素(RCDATA elements),有<textarea>和<title>
4、 外部元素(Foreignelements),例如 MathML 命名空間或者 SVG 命名空間的元素
5、 基本元素(Normal elements),即除了以上 4 種元素以外的元素
五類元素的區(qū)別如下:
1、 空元素,不能容納任何內(nèi)容(因?yàn)樗鼈儧]有閉合標(biāo)簽,沒有內(nèi)容能夠放在開始標(biāo)簽和閉合標(biāo)簽中間)。
2、 原始文本元素,可以容納文本。
3、 RCDATA 元素,可以容納文本和字符引用。
4、 外部元素,可以容納文本、字符引用、CDATA 段、其他元素和注釋
5、 基本元素,可以容納文本、字符引用、其他元素和注釋
3.1.2 HTML編解碼
HTML 解析器以狀態(tài)機(jī)的方式運(yùn)行,它從文檔輸入流中消耗字符并根據(jù)其轉(zhuǎn)換規(guī)則轉(zhuǎn)換到不同的狀態(tài)。
示例:
<html><body>Hello world</body></html>
1、 初始狀態(tài)為"DataState",當(dāng)遇到"<"字符,狀態(tài)變?yōu)?quot;Tag open state",讀取一個(gè) a-z 的字符將產(chǎn)生一個(gè)開始標(biāo)簽符號(hào),狀態(tài)相應(yīng)變?yōu)?quot;Tag name state",一直保持這個(gè)狀態(tài)直到讀取到">",每個(gè)字符都附加到這個(gè)符號(hào)名上,例子中創(chuàng)建的是一個(gè) html 符號(hào)。
2、 當(dāng)讀取到">",當(dāng)前的符號(hào)就完成了,此時(shí),狀態(tài)回到"Data state","<body>"重復(fù)這一處理過程。到這里,html 和 body 標(biāo)簽都識(shí)別出來了?,F(xiàn)在,回到"Data state",讀取"Helloworld"中的字符"H"將創(chuàng)建并識(shí)別出一個(gè)字符符號(hào),這里會(huì)為"Hello world"中的每個(gè)字符 生成一個(gè)字符符號(hào)。
3、 這樣直到遇到"</body>"中的"<"。現(xiàn)在,又回到了"Tag openstate",讀取下一個(gè)字符"/" 將創(chuàng)建一個(gè)閉合標(biāo)簽符號(hào),并且狀態(tài)轉(zhuǎn)移到"Tag name state",還是保持這一狀態(tài),直到 遇到">"。然后,產(chǎn)生一個(gè)新的標(biāo)簽符號(hào)并回到"Data state"。后面的"</html>"將和 "</body>"一樣處理。
總結(jié):當(dāng)HTML 解析器處于數(shù)據(jù)狀態(tài)(DataState)、RCDATA 狀態(tài)(RCDATA State)、屬性值狀態(tài)(Attribute Value State)時(shí),字符實(shí)體會(huì)被解碼為對(duì)應(yīng)的字符。
示例:
<div>&#60;img src=x onerror=alert(4)&#62;</div>
<和>被編碼為字符實(shí)體&#60;和&#62;。 當(dāng) HTML 解析器解析完<div>時(shí),會(huì)進(jìn)入數(shù)據(jù)狀態(tài)(Data State)并發(fā)布標(biāo)簽令牌。接著解析到實(shí)體&#60;時(shí)因?yàn)樘幵跀?shù)據(jù)狀態(tài)(Data State)就會(huì)對(duì)實(shí)體進(jìn)行解碼為<,后面 的&#62;同樣道理被解碼為>。
這里會(huì)有個(gè)問題,被解碼后,img是否會(huì)被解析為 HTML 標(biāo)簽而導(dǎo)致 JS 執(zhí)行呢?
答案是否定的。因?yàn)榻馕銎髟谑褂米址煤蟛粫?huì)轉(zhuǎn)換到標(biāo)簽打開狀態(tài)(Tag OpenState),不進(jìn)入標(biāo)簽打開狀態(tài)就不會(huì)被發(fā)布為 HTML 標(biāo)簽。因此,不會(huì)創(chuàng)建新 HTML 標(biāo)簽, 只會(huì)將其作為數(shù)據(jù)來處理。 這也是為什么我們可以使用字符實(shí)體來避免用戶不安全輸入導(dǎo)致 XSS 的原因。
3.1.3 原始文本元素(Raw text elements)
在 HTML 中,屬于 Rawtext elements 的標(biāo)簽有兩個(gè):script、style。在 Raw text elements 類型標(biāo)簽下的所有內(nèi)容塊都屬于該標(biāo)簽。
存在一條特性: Raw text elements 類型標(biāo)簽下的所有字符實(shí)體編碼都不會(huì)被 HTML 解碼。HTML 解析器 解析到 script、style 標(biāo)簽的內(nèi)容塊(數(shù)據(jù))部分時(shí),狀態(tài)會(huì)進(jìn)入 Script Data State,該狀態(tài)并 不在我們前面說的會(huì)解碼字符實(shí)體的三條狀態(tài)之中。
因此,<script>&#97;&#108;&#101;&#114;t&#40;&#57;&#41;&#59;</script>這樣字符實(shí)體并不會(huì)被解碼,也就不會(huì)執(zhí)行 JS。
3.1.4 RCDATA
在 HTML 中,屬于RCDATAElements的標(biāo)簽有兩個(gè):textarea、title。
RCDATA Elements 類型的標(biāo)簽可以包含文本內(nèi)容和字符實(shí)體。
解析器解析到 textarea、title標(biāo)簽的數(shù)據(jù)部分時(shí),狀態(tài)會(huì)進(jìn)入 RCDATA State。
前面我們提到,處于 RCDATA State 狀態(tài)時(shí),字符實(shí)體是會(huì)被解析器解碼的。
示例:
<textarea>&#60;script&#62;alert(5)&#60;/script&#62;</textarea>
<和>被編碼為實(shí)體&#60;和&#62;。 解析器解析到它們時(shí)會(huì)進(jìn)行解碼,最終得到<textarea><script>alert(5)</script></textarea>。但是里面的 JS 同樣還是不會(huì)被執(zhí) 行,原因還是因?yàn)榻獯a字符實(shí)體狀態(tài)機(jī)不會(huì)進(jìn)入標(biāo)簽打開狀態(tài)(TagOpen State),因此里面的<script>并不會(huì)被解析為 HTML 標(biāo)簽。
3.1.5 外部元素(Foreign elements)
來源于 MathML 和 SVG 命名空間
<svg>遵循 XML 和 SVG 的定義
實(shí)例:
<script>alert&#40;1)</script>
不能彈窗,Raw text elements 類型標(biāo)簽下的所有字符實(shí)體編碼都不會(huì)被 HTML 解碼
<svg><script>alert&#40;1)</script>
能彈窗,在 XML 中,&#40;會(huì)被解析成(,在 XML 中實(shí)體會(huì)自動(dòng)轉(zhuǎn)義,除了<![CDATA[和]]> 包含的實(shí)體
形如 \uXXXX 這樣的 Unicode 字符轉(zhuǎn)義序列或 Hex 編碼是否能被解碼需要看情況。 首先,JavaScript 中有三個(gè)地方可以出現(xiàn) Unicode 字符轉(zhuǎn)義序列:
1、字符串中(in String)
Unicode 轉(zhuǎn)義序列出現(xiàn)在字符串中時(shí),它只會(huì)被解釋為普通字符,而不會(huì)破壞字符串的上下文。
例如,<script>alert("\u0031\u0030");</script>
被編碼轉(zhuǎn)義的部分為 10,是字符串,會(huì)被正常解碼,JS 代碼也會(huì)被執(zhí)行。
2、標(biāo)識(shí)符中(in identifier names)
若 Unicode 轉(zhuǎn)義序列存在于標(biāo)識(shí)符中,即變量名(如函數(shù)名等…),它會(huì)被進(jìn)行解碼。
例如,<script>\u0061\u006c\u0065\u0072\u0074(10);</script>
被編碼轉(zhuǎn)義的部分為 alert 字符,是函數(shù)名,屬于在標(biāo)識(shí)符中的情況,因此會(huì)被正常解碼,JS 代碼也會(huì)被執(zhí)行。
3、控制字符中(in control characters)
若 Unicode 轉(zhuǎn)義序列存在于控制字符中,那么它會(huì)被解碼但不會(huì)被解釋為控制字符,而會(huì)被解釋為標(biāo)識(shí)符或字符串字符的一部分。 控制字符即'、"、()等。
例如,<script>alert\u0028"xss"); </script>,(進(jìn)行了 Unicode 編碼,那么解碼后它不再是作為控制字符,而是作為標(biāo)識(shí)符的一部分alert(。
因此函數(shù)的括號(hào)之類的控制字符進(jìn)行Unicode 轉(zhuǎn)義后是不能被正常解釋的。
總結(jié):Unicode 序列不能出現(xiàn)在控制字符中,否則不能被解釋。
示例 1:
<script>\u0061\u006c\u0065\u0072\u0074\u0028\u0031\u0031\u0029</script>
被編碼部分為 alert(11)。
該例子中的 JS 不會(huì)被執(zhí)行,因?yàn)榭刂谱址痪幋a了。
示例 2:
<script>\u0061\u006c\u0065\u0072\u0074(\u0031\u0032)</script>
被編碼部分為 alert 及括號(hào)內(nèi)為12。
該例子中 JS 不會(huì)被執(zhí)行,原因在于括號(hào)內(nèi)被編碼的部分不能被正常解釋,即使反編碼之后為數(shù)字,但是仍然按照字符串來處理(這里的12為字符串12,并不是int整數(shù))。要么使用 ASCII 數(shù)字,要么加""或''使其變?yōu)樽址?,作為字符串也只能作為普通字符?/p>
示例 3:
<script>alert('13\u0027)</script>
被編碼處為'。
該例的 JS 不會(huì)執(zhí)行,因?yàn)榭刂谱址痪幋a了,解碼后的'將變?yōu)樽址囊徊糠?,而不再解釋為控制字符。因此該例中字符串是不完整的,因?yàn)闆]有'來結(jié)束字符串。
示例 4:
<script>alert('14\u000a')</script>
該例的 JS 會(huì)被執(zhí)行,因?yàn)楸痪幋a的部分處于字符串內(nèi),只會(huì)被解釋為普通字符,不會(huì)突破字符串上下文。
示例 5:
<img src="1" onerror=\u0061\u006c\u0065\u0072\u0074\u0028\u0031\u0029>
此例無法執(zhí)行。我們以瀏覽器的視角來看:首先讀到<開始讀取標(biāo)簽,然后讀到 onerror 調(diào)用 JS 解析器。 在JS中,單引號(hào),雙引號(hào)和圓括號(hào)等屬于控制字符,編碼后將無法識(shí)別。所以對(duì)于防御來說,應(yīng)該編碼這些控制字符。
下面這種方式可以解析:
<img src="1" onerror=\u0061\u006c\u0065\u0072\u0074('\u0031')>
可以結(jié)合上面的 HTML 編碼 按照解析順序反過去,先 JS 編碼然后 HTML 解碼:
<img src="1" onerror=&#92;&#117;&#48;&#48;&#54;&#49;&#92;&#117;&#48;&#48;&#54;&#99;&#92;&#117;&#48;&#48;&#54;&#53;&#92;&#117;&#48;&#48;&#55;&#50;&#92;&#117;&#48;&#48;&#55;&#52;&#40;&#39;&#92;&#117;&#48;&#48;&#51;&#49;&#39;&#41;>
瀏覽器讀到了<標(biāo)簽開始構(gòu)造語法樹,然后 HTML 解碼,解碼之后發(fā)現(xiàn) onerror 于是進(jìn)行 一個(gè) JS 解碼,成功彈窗
延伸:
開發(fā)人員單純的設(shè)置 HTML 實(shí)體編碼為防御 xss 的手段,但是用戶輸入點(diǎn)在 alert 中 <img src = "https://text.com" onclick = 'alert("輸入點(diǎn)")'>
如果用戶正常輸入的話凡是存在< ," 等都能被轉(zhuǎn)碼
攻擊者可以通過語句 ");alert("test,在服務(wù)端被轉(zhuǎn)碼:
<img src ="https://gss1.bdstatic.com" onclick = 'alert("FIRSTXSS&#34;&#41;&#59;&#97;&#108;&#101;&#114;&#116;&#40;&#34;&#116;&#101;&#115;&#116;")'>
彈窗兩次,是因?yàn)闉g覽器進(jìn)行 HTML 解碼發(fā)現(xiàn)存在兩個(gè) alert()
所以對(duì)于這種情況,正確防御 XSS 的方法:
應(yīng)該是先 JavaScript 編碼然后再進(jìn)行 HTML 編碼用戶輸入 ");alert("test 后在服務(wù)端先 JavaScript 編碼然后再進(jìn)行 HTML 編碼到瀏覽器端:首先經(jīng)過第一步 HTML 解碼后變?yōu)閈u0022\u0029\u003B\u0061\u006C\u0065\u0072\u0074\u0028\u0022\u0074\u0065\u0073\u0074。JavaScript 解析器工作,變?yōu)?quot;);alert("test ,剛才已經(jīng)講過 JavaScript 解析時(shí)只有標(biāo)識(shí)符名稱不會(huì)被當(dāng)做字符串,控制字符僅會(huì)被解析為標(biāo)示符名稱或者字符串,因此 \u0022 被解釋成雙引號(hào)文本,\u0028 和\u0029 被解釋成為圓括號(hào)文本,不會(huì)變?yōu)榭刂?字符被解析執(zhí)行。
在這里采用的先 JS 編碼后 HTML 編碼中只彈窗了一次。
通用 URI 的格式如下:
[協(xié)議名]://[用戶名]:[密碼]@[主機(jī)名]:[端口]/[路徑]?[查詢參數(shù)]#[片段 ID]
URL 解析器也被建模為狀態(tài)機(jī),文檔輸入流中的字符可以將其導(dǎo)向不同的狀態(tài)。
首先,要注意的是 URL 的 Scheme 部分(協(xié)議部分)必須為 ASCII 字符,即不能被任何編碼,否則 URL 解析器的狀態(tài)機(jī)將進(jìn)入 No Scheme 狀態(tài)。
示例1:
<ahref="%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29"></a>
URL 編碼部分的是javascript:alert(1)。
JS 不會(huì)被執(zhí)行,因?yàn)樽鳛镾cheme 部分的"javascript"這個(gè)字符串被編碼(其中javascript是一種偽協(xié)議),導(dǎo)致 URL 解析 器狀態(tài)機(jī)進(jìn)入 No Scheme 狀態(tài)。
URL 中的:也不能被以任何方式編碼,否則 URL 解析器的狀態(tài)機(jī)也將進(jìn)入 No Scheme 狀態(tài)。
<ahref="javascript%3aalert(3)"></a>
由于:被 URL 編碼為%3a,導(dǎo)致 URL 狀態(tài)機(jī)進(jìn)入 NoScheme 狀態(tài),JS 代碼不能執(zhí)行。
示例2:
<ahref="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:%61%6c%65%72%74%28%32%29">
"javascript"這個(gè)字符串被實(shí)體化編碼,:沒有被編碼,alert(2)被 URL編碼。 成功執(zhí)行 首先,在 HTML 解析器中我們談到過,HTML狀態(tài)機(jī)處于屬性值狀態(tài)(Attribute Value State)時(shí),字符實(shí)體時(shí)會(huì)被解碼的,此處在 href 屬性中,所以被實(shí)體化編碼的 "javascript"字符串會(huì)被解碼。其次,HTML 解析是在URL解析之前的,所以在進(jìn)行 URL 解析之前,Scheme 部分的"javascript"字符串已被解碼,而并不再是被實(shí)體編碼的狀態(tài)。
首先瀏覽器接收到一個(gè) HTML 文檔時(shí),會(huì)觸發(fā) HTML 解析器對(duì) HTML 文檔進(jìn)行詞法解析,這一過程完成 HTML 解碼并創(chuàng)建 DOM 樹。
接下來 JavaScript 解析器會(huì)介入對(duì)內(nèi)聯(lián)腳本進(jìn)行解析,這一過程完成 JS 的解碼工作。
如果瀏覽器遇到需要 URL 的上下文環(huán)境,這時(shí) URL 解析器也會(huì)介入完成 URL 的解碼工 作,URL 解析器的解碼順序會(huì)根據(jù) URL 所在位置不同,可能在 JavaScript 解析器之前或之后解析。
總之HTML 解析總是第一步。URL 解析和 JavaScript 解析,它們的解析順序要根據(jù)情況而定。
示例 1:
<a href="UserInput"></a>
該例子中,首先由 HTML 解析器對(duì)UserInput 部分進(jìn)行字符實(shí)體解碼;
接著 URL 解析器對(duì)UserInput 進(jìn)行 URL decode;
如果 URL 的 Scheme 部分為 javascript 的話,JavaScript 解析器會(huì)再對(duì) UserInput 進(jìn)行解 碼。
所以解析順序是:HTML 解析->URL解析->JavaScript 解析。
示例 2:
<a href=# onclick="window.open('UserInput')"></a>
該例子中,首先由 HTML 解析器對(duì)UserInput 部分進(jìn)行字符實(shí)體解碼;
接著由 JavaScript 解析器會(huì)再對(duì) onclick 部分的 JS 進(jìn)行解析并執(zhí)行 JS;
執(zhí)行 JS 后window.open('UserInput')函數(shù)的參數(shù)會(huì)傳入 URL,所以再由 URL 解析器對(duì) UserInput 部分進(jìn)行解碼。
因此解析順序?yàn)椋篐TML 解析->JavaScript解析->URL 解析。
示例 3:
<a href="javascript:window.open('UserInput')">
該例子中,首先還是由 HTML 解析器對(duì) UserInput 部分進(jìn)行字符實(shí)體解碼;
接著由 URL 解析器解析 href 的屬性值;
然后由于Scheme為javascript,所以由 JavaScript 解析;
解析執(zhí)行 JS 后window.open('UserInput')函數(shù)傳入 URL,所以再由 URL 解析器解析。
所以解析順序?yàn)椋篐TML 解析->URL解析->JavaScript 解析->URL 解析。
綜合實(shí)例:
<a href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x33;&#x31;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x36;&#x33;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x33;&#x35;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x37;&#x25;&#x33;&#x32;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x37;&#x25;&#x33;&#x34;&#x28;&#x31;&#x35;&#x29;"></a>
首先 HTML 解析器進(jìn)行解析,解析到href 屬性的值時(shí),狀態(tài)機(jī)進(jìn)入屬性值狀態(tài)(Attribute Value State),該狀態(tài)會(huì)解碼字符實(shí)體;
接著由 URL 解析器進(jìn)行解析并解碼;
再接著由于 Scheme 為javascript,因此由 JavaScript 解析器解析并解碼,加上編碼部分是函 數(shù)名,屬于標(biāo)識(shí)符,因此可以正常解碼解釋;
經(jīng)過三輪解析解碼后得到結(jié)果:<a href="javascript:alert(15)"></a>
關(guān)于如何對(duì)瀏覽器解析和XSS的深度探究就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
分享題目:如何對(duì)瀏覽器解析和XSS的深度探究
文章位置:http://aaarwkj.com/article40/igioho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、Google、、網(wǎng)頁設(shè)計(jì)公司、網(wǎng)站收錄、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)