web安全---浏览器解析提交数据的过程
解碼規(guī)則
解碼順序
html解析第一步執(zhí)行,而JS解析和URL解析則要根據(jù)情況而定
HTML解析器
1、html解析器以狀態(tài)機的方式運行
狀態(tài)流程圖為:
即:Data—》Tag open----》Tag name —》Data
注意:如果我們的標(biāo)簽是在Data狀態(tài)下被解析出來的,那么標(biāo)簽將作為一種文本輸出來,
舉例:<p>Hello<p>
初始狀態(tài)為Data state ,當(dāng)遇到<時,狀態(tài)轉(zhuǎn)為 Tag open,讀取a-z某個字符創(chuàng)建開始標(biāo)簽,然后狀態(tài)變?yōu)門ag name ,知道讀取到>,狀態(tài)變?yōu)镈ata,接著讀取到H會識別并生成一個字符,相應(yīng)得會為Hello中的每個字符生成一個字符符號,之后遇到<,又變?yōu)門ag open,讀取到/則會創(chuàng)建一個閉合標(biāo)簽,并將狀態(tài)改為Tag name,直到遇到>,后回到Data state。
注意:HTML解析器處于Data State、RCDATA State 、Attribute Value State(屬性值),字符實體會被解碼為對應(yīng)的字符
2、原始文本元素
特性:該元素標(biāo)簽中的實體不會被HTML解碼
標(biāo)簽:script,style
舉例:標(biāo)簽中的實體字符不會被html解碼,因此不會執(zhí)行js
3、RCDATA 元素
特性:html解析器遇到該元素標(biāo)簽時,會進入RCDATA狀態(tài),實體字符會被解析器解碼
標(biāo)簽:textarea、title
舉例:字符實體會被解碼,但是不會執(zhí)行JS,因為沒有進入Tag open狀態(tài),其中<script>不會被解釋為HTML標(biāo)簽
JavaScript解析器
JavaScript中有三個地方可以出現(xiàn)JS編碼
1、字符串
2、標(biāo)識符
<script>\u0061\u006c\u0065\u0072\u0074(1);</script> 被編碼的部分為alert字符,是函數(shù)名,屬于在標(biāo)識符中的情況,因此會被正常解碼并執(zhí)行JS3、控制符
包含:單引號、雙引號、括號等
特性:能被解碼但不會解釋為控制字符,即失去特殊意義,只會被當(dāng)做標(biāo)識符或字符串的一部分
URL解析器
1、URL的協(xié)議部分必須為ASCII字符、否則URL解析器的狀態(tài)機將進入No Scheme狀態(tài)
<a href="%6a%61%76%61%73%63%72%69%70%74:alert(1)"></a> url編碼部分為javascript,因為作為協(xié)議部分的"javascript"被編碼,故不會觸發(fā)JS2、url中的:符號不能被以任何形式編碼
<a href="javascript%3aalert(1)"></a> :被url編碼為%3a,導(dǎo)致url狀態(tài)機進入No Scheme狀態(tài),故不會觸發(fā)JS3、當(dāng)javascript沒有被編碼時
<a href = "javascript:alert(3)">hhhhh<a>JS編碼:
<a href="javascript:\u0061\u006c\u0065\u0072\u0074(3)">hhhhhh</a>再對JS編碼來一個URL編碼
<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(3)">hhhhhh</a>這個是可以成功執(zhí)行的,當(dāng)HTML解析到href時,交給URL處理,URL發(fā)現(xiàn)了javascript:,把后面的數(shù)字解碼后交由JavaScript處理,所以會彈出
例子
<a href="%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29">hhhh</a> URL encoded "javascript:alert(1)" //冒號(:)沒有被編碼 Answer: The javascript will NOT execute.HTML沒有編碼,不用考慮,根據(jù)href,URL模塊處理,但是協(xié)議沒辦法識別(即編碼的JavaScript:),URL會解碼出來,但JS不會被執(zhí)行,所以url編碼的XSS,javascript:一定不能被url編碼,編碼后無法識別,js還是不能執(zhí)行
<a href="javascript:%61%6c%65%72%74%28%32%29"> Character entity encoded "javascript" and URL encoded "alert(2)" Answer: The javascript will executeHTML先解碼得到:
<a href="javascript:%61%6c%65%72%74%28%32%29">href中為URL,URL模塊可識別為javascript協(xié)議,進行URL解碼,得到
<a href="javascript:alert(2)">由于是javascript協(xié)議,解碼完給JS模塊處理,于是被執(zhí)行
<div><img src=x οnerrοr=alert(4)></div> Character entity encoded < and > Answer: The javascript will NOT execute.當(dāng)HTML解析到<;時,此時的狀態(tài)為Data,會被解碼,但是不能創(chuàng)建img標(biāo)簽,因為不是Tag open狀態(tài),所以解碼后被當(dāng)做文本,不會執(zhí)行
<button onclick="confirm('7');">Button</button> Character entity encoded ' Answer: The javascript will execute.這里onclick中為標(biāo)簽的屬性值,會被HTML解碼,得到
<button onclick="confirm('7');">Button</button>然后被執(zhí)行
<button onclick="confirm('8\u0027);">Button</button> Unicode escape sequence encoded ' Answer: The javascript will NOT execute.不需要HTML解碼,onclick中的值會交給JS處理,在JS中只有字符串和標(biāo)識符能用Unicode表示,'顯然不行,JS執(zhí)行失敗。
<script>alert(9);</script> Character entity encoded alert(9); Answer: The javascript will NOT execute.不會被執(zhí)行,script屬于原始文本元素(Raw text elements),只可以容納文本,注意沒有字符引用,于是直接由JS處理,JS也認(rèn)不出來,執(zhí)行失敗
參考鏈接
https://blog.csdn.net/baidu_38844729/article/details/109328472
https://xz.aliyun.com/t/5863
總結(jié)
以上是生活随笔為你收集整理的web安全---浏览器解析提交数据的过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 牡蛎多少钱一盒啊?
- 下一篇: 许昌治疗子宫内膜异位症最好的医院推荐