歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

一次對瀏覽器解析和XSS的深度探究

來源:本站整理 作者:佚名 時間:2020-01-28 TAG: 我要投稿

一、需要了解的一些基本知識
為什么要進行編碼?
主要是因為某些數據不適合傳輸。原因多種多樣,如 Size 過大,包含隱私數據,另外重要的一點就是有些字符會引起歧義。
對于 URL: &用于分割多個參數,倘若有某個參數鍵值為 name=v&lue,就會因為 name 參數的值 v&lue 中攜帶了&而造成歧義。因此需要對&進行 URL 編碼。url編碼后,服務端會把緊跟在“%”后的字節當成普通的字節,就是不會把它當成各個參數或鍵值對的分隔符。
對于 HTML: 當瀏覽器遇到會識別為元素的結束。倘若有” >,由于標簽的屬性值攜帶了>,同樣會造成歧義。因此需要屬性值的>需要 進行 HTML 編碼,即使用字符實體。
二、三種編碼
2.1HTML 編碼(字符實體)
字符實體是一個預先定義好的轉義序列。 字符實體兩種表示方法:
1、 字符實體以&開頭+預先定義的實體名稱+;分號結束,如“
2、 字符實體還可以以&開頭+#符號+字符在 ASCII 對應的十進制數字+;分號結束,如
字符都是有實體編號的,但有些字符是沒有實體名稱
顯示結果 
描述
實體名稱
實體編號
空格
 
 
小于號
<

大于號
>
>
&
和號
&
&

引號
"
"

撇號 
' (IE不支持)
'

分(cent)
¢
¢
£
鎊(pound)
£
£
¥
元(yen)
¥
¥

歐元(euro)


§
小節
§
§
©
版權(copyright)
©
©
®
注冊商標
®
®

商標


×
乘號
×
×
÷
除號
÷
÷
2.2 JavaScript 編碼
最常用的,如\uXXXX 這種寫法的Unicode 轉義序列,表示一個字符,其中 XXXX 表示一個 16 進制數字,如
2.3 URL 編碼
RFC3986 文檔規定,URL 中只允許包含英文字母(a-zA-Z)、數字(0-9)、-_.~4 個特殊字 符以及所有保留字符。 RFC3986 中指定了以下字符為保留字符:! * ‘ ( ) ; : @ & = + $ , / ? # [ ]
編碼方式 %加字符在 ASCII 碼表中的十六進制值。例如,/在 ASCII 碼表中十六進制為 0x2f,那么它對應的 URL 編碼為%2f。
JavaScript 中提供了 3 個函數用來對 URL 編碼以得到合法的 URL:
1、 escape()
2、 encodeURI()
3、 encodeURIComponent()
三、瀏覽器解碼規則

瀏覽器無論什么情況都會遵守一個這樣的解碼規則:
1、 HTML 解析器對 HTML 文檔進行解析,完成 HTML 解碼并且創建 DOM 樹
2、 JavaScript 或者 CSS 解析器對內聯腳本進行解析,完成 JS、CSS 解碼
3、 URL 解碼會根據 URL 所在的順序不同而在 JS 解碼前或者解碼后
3.1HTML 解析器
3.1.1HTML 中有五類元素:
1、 空元素(Voidelements),有 area、base、br、col、command、embed、hr、img、input、 keygen、link、meta、param、source、track、wbr
2、 原始文本元素(Raw textelements),有和
3、 RCDATA 元素(RCDATA elements),有和
4、 外部元素(Foreignelements),例如 MathML 命名空間或者 SVG 命名空間的元素
5、 基本元素(Normal elements),即除了以上 4 種元素以外的元素
五類元素的區別如下:
1、 空元素,不能容納任何內容(因為它們沒有閉合標簽,沒有內容能夠放在開始標簽和閉合標簽中間)。
2、 原始文本元素,可以容納文本。
3、 RCDATA 元素,可以容納文本和字符引用。
4、 外部元素,可以容納文本、字符引用、CDATA 段、其他元素和注釋
5、 基本元素,可以容納文本、字符引用、其他元素和注釋
3.1.2 HTML編解碼

HTML 解析器以狀態機的方式運行,它從文檔輸入流中消耗字符并根據其轉換規則轉換到不同的狀態。
示例:
   
    Hello world
   
   
1、 初始狀態為”DataState”,當遇到””,每個字符都附加到這個符號名上,例子中創建的是一個 html 符號。
2、 當讀取到”>”,當前的符號就完成了,此時,狀態回到”Data state”,””重復這一處理過程。到這里,html 和 body 標簽都識別出來了,F在,回到”Data state”,讀取”Helloworld”中的字符”H”將創建并識別出一個字符符號,這里會為”Hello world”中的每個字符 生成一個字符符號。
3、 這樣直到遇到””中的””。然后,產生一個新的標簽符號并回到”Data state”。后面的””將和 “”一樣處理。
總結:當HTML 解析器處于數據狀態(DataState)、RCDATA 狀態(RCDATA State)、屬性值狀態(Attribute Value State)時,字符實體會被解碼為對應的字符。
示例:
<img src=x onerror=alert(4)>
被編碼為字符實體<和>。 當 HTML 解析器解析完時,會進入數據狀態(Data State)并發布標簽令牌。接著解析到實體<時因為處在數據狀態(Data State)就會對實體進行解碼為。
這里會有個問題,被解碼后,img是否會被解析為 HTML 標簽而導致 JS 執行呢?
答案是否定的。因為解析器在使用字符引用后不會轉換到標簽打開狀態(Tag OpenState),不進入標簽打開狀態就不會被發布為 HTML 標簽。因此,不會創建新 HTML 標簽, 只會將其作為數據來處理。 這也是為什么我們可以使用字符實體來避免用戶不安全輸入導致 XSS

[1] [2] [3]  下一頁

【聲明】:黑吧安全網(http://www.650547.live)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        安徽快3自由的百科 玩真钱的扑克游戏 第一次玩股票怎么开户 吉林11选五玩法介绍 什么是对应码 快乐12开奖结果 浙江6+1走势图幸运之门 手机工作室挂机项目 广东体育彩票网 陕西省体彩11选五开奖结果 今晚开什么特马