web安全---瀏覽器解析提交數據的過程

解碼規則

  1. html解析器對html文檔進行解析,完成解析并創建DOM樹
  2. JavaScript或者CSS解析器對內聯腳本進行解析,完成js、css解碼
  3. url解碼會根據url所在的順序不同而在JS解碼或者解碼后

解碼順序

html解析第一步執行,而JS解析和URL解析則要根據情況而定

HTML解析器

1、html解析器以狀態機的方式運行

狀態流程圖為:
在這里插入圖片描述
即:Data—》Tag open----》Tag name —》Data

注意:如果我們的標簽是在Data狀態下被解析出來的,那么標簽將作為一種文本輸出來,
舉例:<p>Hello<p>
初始狀態為Data state ,當遇到<時,狀態轉為 Tag open,讀取a-z某個字符創建開始標簽,然后狀態變為Tag name ,知道讀取到>,狀態變為Data,接著讀取到H會識別并生成一個字符,相應得會為Hello中的每個字符生成一個字符符號,之后遇到<,又變為Tag open,讀取到/則會創建一個閉合標簽,并將狀態改為Tag name,直到遇到>,后回到Data state。

注意:HTML解析器處于Data State、RCDATA State 、Attribute Value State(屬性值),字符實體會被解碼為對應的字符

2、原始文本元素

特性:該元素標簽中的實體不會被HTML解碼
標簽:script,style
舉例:標簽中的實體字符不會被html解碼,因此不會執行js

<script>alert&#40;&#49;&#41;</script>
3、RCDATA 元素

特性:html解析器遇到該元素標簽時,會進入RCDATA狀態,實體字符會被解析器解碼
標簽:textarea、title
舉例:字符實體會被解碼,但是不會執行JS,因為沒有進入Tag open狀態,其中<script>不會被解釋為HTML標簽

<textarea>&lt;script&gt;alert&#40;&#49;&#41;&lt;/script></textarea>
解碼得到<textarea><script>alert(1)</script></textarea>

JavaScript解析器

JavaScript中有三個地方可以出現JS編碼
1、字符串

<script>alert(“\u0031);</script>
被編碼的為1且是字符串,可以正常解碼并觸發執行

2、標識符

<script>\u0061\u006c\u0065\u0072\u0074(1);</script>
被編碼的部分為alert字符,是函數名,屬于在標識符中的情況,因此會被正常解碼并執行JS

3、控制符
包含:單引號、雙引號、括號等
特性:能被解碼但不會解釋為控制字符,即失去特殊意義,只會被當做標識符或字符串的一部分

<script>alert\u0028″xss”);</script>
\u0028會被解碼為( 但是不會觸發JS,因為是控制符

URL解析器

1、URL的協議部分必須為ASCII字符、否則URL解析器的狀態機將進入No Scheme狀態

<a href="%6a%61%76%61%73%63%72%69%70%74:alert(1)"></a>
url編碼部分為javascript,因為作為協議部分的"javascript"被編碼,故不會觸發JS

2、url中的符號不能被以任何形式編碼

<a href="javascript%3aalert(1)"></a>
:被url編碼為%3a,導致url狀態機進入No Scheme狀態,故不會觸發JS

3、當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>

這個是可以成功執行的,當HTML解析到href時,交給URL處理,URL發現了javascript:,把后面的數字解碼后交由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沒有編碼,不用考慮,根據href,URL模塊處理,但是協議沒辦法識別(即編碼的JavaScript:),URL會解碼出來,但JS不會被執行,所以url編碼的XSS,javascript:一定不能被url編碼,編碼后無法識別,js還是不能執行

在這里插入圖片描述

<a href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:%61%6c%65%72%74%28%32%29">
Character entity encoded "javascript" and URL encoded "alert(2)"
Answer: The javascript will execute

HTML先解碼得到:

<a href="javascript:%61%6c%65%72%74%28%32%29">

href中為URL,URL模塊可識別為javascript協議,進行URL解碼,得到

<a href="javascript:alert(2)">

由于是javascript協議,解碼完給JS模塊處理,于是被執行

<div>&#60;img src=x οnerrοr=alert(4)&#62;</div>
Character entity encoded < and >
Answer: The javascript will NOT execute.

當HTML解析到&#60;時,此時的狀態為Data,會被解碼,但是不能創建img標簽,因為不是Tag open狀態,所以解碼后被當做文本,不會執行

<button onclick="confirm('7&#39;);">Button</button>
Character entity encoded '
Answer: The javascript will execute.

這里onclick中為標簽的屬性值,會被HTML解碼,得到

<button onclick="confirm('7');">Button</button>

然后被執行

<button onclick="confirm('8\u0027);">Button</button>
Unicode escape sequence encoded '
Answer: The javascript will NOT execute.

不需要HTML解碼,onclick中的值會交給JS處理,在JS中只有字符串和標識符能用Unicode表示,'顯然不行,JS執行失敗。

<script>&#97;&#108;&#101;&#114;&#116&#40;&#57;&#41;&#59</script>
Character entity encoded alert(9);
Answer: The javascript will NOT execute.

不會被執行,script屬于原始文本元素(Raw text elements),只可以容納文本,注意沒有字符引用,于是直接由JS處理,JS也認不出來,執行失敗

參考鏈接

https://blog.csdn.net/baidu_38844729/article/details/109328472
https://xz.aliyun.com/t/5863

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/379917.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/379917.shtml
英文地址,請注明出處:http://en.pswp.cn/news/379917.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

commons-lang的FastDateFormat性能測試

commons-lang的FastDateFormat是一個thread-safe的&#xff0c;對SimpleDateFormat的一個重新實現。 SimpleDateFormat為什么不是thread-safe的呢&#xff1f;看一下具體實現就知道了&#xff0c;其父類中定義了成員變量Calendar&#xff0c;每次格式化日期時都會先重置這個Cal…

C——Flowers

Problem Description As you know, Gardon trid hard for his love-letter, and now he’s spending too much time on choosing flowers for Angel. When Gardon entered the flower shop, he was frightened and dazed by thousands kinds of flowers. “How can I choose!”…

include函數_include()函數以及JavaScript中的示例

include函數includes() is a predefined function in JavaScript, which is used to check whether a given element exists in the array or not? include()是JavaScript中的預定義函數&#xff0c;用于檢查數組中是否存在給定元素&#xff1f; Example: 例&#xff1a; &l…

利用POI創建OpenOffice中的Excel文件

之所以稱為OpenOffice的Excel文件,我發現了一個特點就是: 一些網站嚴格限定了文件必須為MS的Excel格式的話,用POI的HSSF創建的Excel就會不識別.不知道是什么原因,可能是版本的問題,據說HSSF(令人討厭的電子表格格式)生成的是MS97的格式.但是97-2003的提示中明顯的說明了MS的lib…

批處理文章集錦

http://www.5dmail.net/html/2005-10-17/20051017181702.htmhttp://www.cnblogs.com/glaivelee/archive/2009/10/07/1578737.html轉載于:https://www.cnblogs.com/Jessy/archive/2012/02/29/2372955.html

web安全-----CSRF漏洞

簡述 CSRF&#xff1a;Cross-site request -forgery&#xff0c;跨站請求偽造&#xff0c;是一種web攻擊方式&#xff0c;是由于網站的cookie在瀏覽器中不會過期&#xff0c;只要不關閉瀏覽器或者退出登錄&#xff0c;那以后只要訪問這個網站&#xff0c;都會默認你已經登錄。…

java math 類_Java Math類靜態長輪(double d)示例

java math 類數學課靜態長回合(雙D) (Math Class static long round(double d) ) This method is available in java.lang package. 此方法在java.lang包中可用。 This method is used to return the closest long value to the given argument. 此方法用于將最接近的long值返回…

C——求平均成績

Problem Description 假設一個班有n(n<50)個學生&#xff0c;每人考m(m<5)門課&#xff0c;求每個學生的平均成績和每門課的平均成績&#xff0c;并輸出各科成績均大于等于平均成績的學生數量。 Input 輸入數據有多個測試實例&#xff0c;每個測試實例的第一行包括兩個…

依賴、關聯、聚合、組合還有泛化的關系(轉載)

依賴、關聯、聚合、組合還有泛化的關系 此文為轉載文章:http://zjzkiss.cnblogs.com/世界是普遍聯系的&#xff0c;因此程序世界中的類&#xff0c;也不可能是孤立的。UML為我們定義了它們之間的關系&#xff0c;就是&#xff1a;依賴、關聯、聚合、組合還有泛化。 泛化關系比…

神奇的LINQ ---可以通過對象來查詢數據

摘要&#xff1a; linq:在一個新項目里面要用這個技術&#xff0c;然后自己拿起書看了下&#xff0c;記錄下自己的新發現&#xff0c;只適合簡單入門的新童鞋看呀&#xff01;&#xff01;&#xff01; 結論&#xff1a; linq是對象領域與數據領域的一個橋梁。 為什么會出現Lin…

java math.cos_Java Math類靜態double cos(double d)示例

java math.cos數學類靜態雙cos(double d) (Math Class static double cos(double d)) This method is available in java.lang package. 此方法在java.lang包中可用。 This method is used to return the trigonometric cosine of an angle of the given parameter in the meth…

web安全---SSRF漏洞

簡介 SSRF&#xff1a;服務器請求偽造&#xff0c;是一種攻擊者構造形成由服務端發起請求 的一個安全漏洞。一般情況下&#xff0c;SSRF攻擊的目標是從外網無法訪問的內部系統&#xff08;正是因為它是由服務端發起的&#xff0c;所以它能夠請求到與它相連而與外網隔離的內部系…

集合——對象數組(引用數據類型數組)

案例&#xff1a;我有5個學生&#xff0c;請把這個5個學生的信息存儲到引用數據類型數組中&#xff0c;并遍歷數組&#xff0c;獲取得到每一個學生的信息。 思路分析&#xff1a;首先&#xff0c;想要創建學生對象&#xff0c;就得有學生這個類&#xff0c;所以&#xff0c;首…

提升應用視覺Android效果的10個UI技巧

在Android應用開發中&#xff0c;風格和設計或許不是最關鍵的要素&#xff0c;但它們在決定Android應用成功與否上確實扮演重要的角色。以下是10個Android應用的UI設計技巧&#xff0c;還有個附加技巧&#xff0c;能夠提供你的Android應用的視覺吸引力。 技巧1&#xff1a;使用…

kotlin中判斷字符串_Kotlin程序查找字符串中字符的頻率

kotlin中判斷字符串Given a string and a character, we have to find the frequency of the character in the string. 給定一個字符串和一個字符&#xff0c;我們必須找到字符串中字符的頻率。 Example: 例&#xff1a; Input:string "IncludeHelp"character to…

OD使用

0x01 功能界面 序號1是匯編代碼對應的地址窗口序號2是匯編對應的十六進制機器碼窗口序號3是反匯編窗口序號4是反匯編代碼對應的注釋信息窗口序號5是寄存器信息窗口序號6是當前執行到的反匯編代碼的信息窗口序號7是數據所在的地址序號8是數據的十六進制編碼信息&#xff0c;序號…

windows mobile 開發總結--菜單

在開發時經常要創建菜單&#xff0c;并且動態顯示和隱藏菜單或者是某個子菜單。以下就是實現的方法&#xff1a; 1。創建并顯示菜單,先在資源里添加菜單&#xff0c;然后如下代碼 SHMENUBARINFO mbi; ZeroMemory(&mbi, sizeof(SHMENUBARINFO)); mbi.cbSizesizeof(SHMENUBAR…

Java——集合的概述

* A&#xff1a;集合的由來* 數組是容器&#xff0c;集合也是容器* 數組的弊端&#xff1a;數組的長度是固定的&#xff0c;當添加的元素超過了數組的長度時&#xff0c;需要對數組重新定義&#xff0c;太麻煩* Java內部給我們提供了集合類&#xff0c;可以存儲任意對象&#x…

排序算法中平均時間復雜度_操作系統中的作業排序(算法,時間復雜度和示例)...

排序算法中平均時間復雜度作業排序 (Job sequencing) Job sequencing is the set of jobs, associated with the job i where deadline di > 0 and profit pi > 0. For any job i the profit is earned if and only if the job is completed by its deadline. To complet…

python---文件處理

0x01 打開一個文件 python中內置了文件對象&#xff0c;通過open()函數就可以制定模式打開指定文件&#xff0c;并創建文件對象。該函數的格式如下&#xff1a; open(file[,moder[,buffering-1]])file&#xff1a;指定要打開或創建的文件名稱&#xff0c;如果該文件不存在當前…