xss和實體編碼的一點小思考


首先,瀏覽器渲染分以下幾步:

  1. 解析HTML生成DOM樹。
  2. 解析CSS生成CSSOM規則樹。
  3. DOM樹與CSSOM規則樹合並在一起生成渲染樹。
  4. 遍歷渲染樹開始布局,計算每個節點的位置大小信息。
  5. 將渲染樹每個節點繪制到屏幕。

已知的問題:

"" 之間的xss我們都知道可以使用偽協議,那么如果冒號或者javascript等關鍵字被過濾了我們應該如何解決?

我們可以在標簽內通過實體編碼觸發xss:
<a href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;%6
1%6c%65%72%74%28%32%29">test</a>
瀏覽器遇到html標簽 會對標簽里面的實體編碼進行解碼 如果解碼后存在javascript: 則會執行js偽協議觸發xss
 
那么我這個菜雞開始思考, 既然實體編碼 會被html自解碼,那么為什么過濾xss的方法之一是實體編碼特殊符號呢 為什么<>的實體編碼沒有自解碼后被解析成一個新的dom節點呢?通過查詢資料我得到了一個答案
瀏覽器最早開始解析HTML,將標簽轉化為內容樹中的DOM 節點,此時識別標簽的時候,HTML 解析器是無法識別那些被實體編碼的內容的,只有建立起DOM 樹,才能對每個節點的內容進行識別,如果出現實體編碼,則會進行實體解碼。在此基礎上,JavaScript DOM API 參與進來,可以對DOM 樹進行修改,改變DOM樹的結構和內容。
這段話說的比較清楚了,在dom樹構建之時,html實體編碼是沒有被自解碼的,那么此時dom樹的節點結構就已經被固定了。后續自解碼以后並不會影響到dom樹/節點/標簽的結構。這個道理和sql中的預編譯是有些類似的。之后的自解碼以后獲得的<>將不會被解析成新的節點。 但並不是說dom樹構建完畢后就不能被改變了。js是可以操作節點進行增刪改操作的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM