狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

[點晴永久免費OA]淺淡XSS跨站腳本攻擊的防御方法

admin
2020年4月8日 11:57 本文熱度 3092
一、HttpOnly屬性
       為Cookie中的關鍵值設置httponly屬性,眾所周知,大部分XSS(跨站腳本攻擊)的目的都是通過瀏覽器的同源策略,來獲取用戶Cookie,從而冒充用戶登陸系統的。
       如果為Cookie中用于用戶認證的關鍵值設置httponly屬性,瀏覽器將會禁止js通過同源策略訪問cookie中設有httponly屬性的信息,因此以劫持用戶認證cookie為目的XSS攻擊將會失敗。
        但很明顯,只為cookie中的值設置Httponly是不夠的,因為XSS攻擊并不是只能獲取用戶COOKIE,它還可以竊取用戶瀏覽器信息,模擬用戶身份執行操作等等。(具體內容詳見:《白帽子講Web安全》)

二、對用戶輸入進行檢查——XSS filter
       XSS filter是在用戶提交數據時獲取變量,并進行XSS 過濾的。此時的XSS filter只對用戶輸入數據進行XSS檢查,并沒有結合渲染頁面的HTML代碼。
       所以針對XSS filter需要強調兩點:
       1.XSS filter對語境的理解并不完整(比如:無法針對輸出點位置進行合適的XSS過濾。所以有時可能會造成遺漏、破壞原有語義等后果)
       2.XSS filter是在服務器進行URL解碼之前生效的,所以要考慮URL編碼繞過的問題。(比如XSS filter過濾了<script>標簽,但如果用戶輸入的是經過URL編碼后的<script>標簽:%3C%73%63%72%69%70%74%3E,這樣就饒過了原本的XSS filter檢測)

三、對用戶輸出進行檢查——安全的編碼函數
(1)HtmlEncode
一般來說,在進行XSS防御的時候,至少需要將以下字符做轉換處理:
        轉換前        轉換后
           &            &amp;
           <             &lt;
           >             &gt;
           "              &quot;
           ''               &#x27;
           /              &#x2F;

(2)JavascriptEncode
javascriptEncode的編碼方式和HtmlEncode有所不同,它使用  \  對特殊字符進行轉義。
常用的JavaScript編碼函數為:escapeJavascript()
該函數的功能為:將 ‘    ”  <   >   \   &   #  這些個危險字符進行轉義。

舉一個《白帽子講Web安全》里的例子
var x=1;alert(2);
var y="1;alert(2)";
JS環境內,第一行的彈窗代碼會被執行,第二行則會是安全的,即使攻擊者想要嘗試閉合",輸入的"也會被JavaScript編碼轉義為\"。這樣攻擊者相要繞過"的封鎖也會十分苦難。

不過這里需要注意:

1.如果頁面使用的是GBK編碼,可能會被攻擊者利用類似寬字節注入的方式繞過。
2.用戶的輸出如果是在標簽內,則要求JavascriptEncode的變量輸出點一定要被引號包裹。
如果用戶輸出點太多,導致開發人員無法針對性的對用戶輸出進行編碼、轉義。則可以使用更嚴格的Javascriptencode函數,使用函數將除了數字、字母之外的所有字符通通都以"\xHH"的方式進行16進制編碼。

接下來需要介紹一個很重要的東西,是我當天總結的重中之重!!!!!!

相信很多初學者會和我一樣,非常好奇為什么會有Htmlencode和JavaScriptEncode兩種編碼方式,從功能上來看都可以抵御XSS攻擊,但為什么要將兩者分開使用。這是因為瀏覽器有兩套不同的自解碼機制。

1、HTML的自解碼機制
      瀏覽器在解析HTML標簽屬性值內的代碼前,會先對下列兩種編碼進行解碼,然后再對屬性中的代碼進行解析。
(1)、進制解碼:&#xH;(十六進制格式)、&#D;(十進制格式)。編碼中最后的分號(;)可以不要。且16進制中用來表示10~15的a~f對大小寫不敏感
例子:
<iframe src=''javascrip&#116;&#58;alert`1`''></iframe>
也可寫成
<iframe src=''javascrip&#116&#58alert`1`''></iframe>
(2)、HTML 實體編碼
例子:
<input type="button" value="test" οnclick="document.write(''<img src=@ οnerrοr=alert(123) />'')" />
也可寫成
<input type="button" value="test" οnclick="document.write(''&lt;img src=@ οnerrοr=alert(123) /&gt;'')" />

2、JavaScript 自解碼機制
(1)、Unicode 形式:\uH(十六進制)。
(2)、普通十六進制:\xH。
(3)、純轉義:\''、\"、\<、\>這樣在特殊字符之前加\進行轉義。
注:以上三種規則僅在通過JS更改HTML DOM樹時才適用( 例如document.write()  document.getelementbyid().innerhtml=""),直接在<script>標簽內使用上述編碼,自解碼規則不生效。
例子:
<input type="button" id="exec_btn" value="exec" />
<script>
function $(id){return document.getElementById(id);};
$(''exec_btn'').onclick = function(){
document.write(''&lt;img src=@ οnerrοr=alert(123) /&gt;'');//改代碼可執行、可彈窗
//在JS執行前會先將上面這行代碼先解碼為:document.write(''<img src=@ οnerrοr=alert(123)/>'');
};
</script>
但如果直接在<script>標簽內使用該編碼,則自解碼機制不生效。
例如:
<script>\u0061\u006c\u0065\u0072\u0074\u0028\u0031\u0032\u0033\u0029</script>
其中上述\u編碼內容為alert(123),但該代碼并沒有更新DOM樹,所以不會彈窗。

四、針對不同的輸出點使用合適的編碼方式
1.輸出點在HTML標簽之間
如<div>輸出點</div>
攻擊者如果想要構造XSS語句并執行,需要構造一個能執行腳本的環境。示例如下:
<div><script>alert`1`</script></div>
此處適合使用HtmlEncode,將攻擊者輸入的<>編碼為&lt;&gt; 
使得攻擊者無法構造JS環境,導致XSS失敗。

2.輸出點在HTML屬性中輸出
<div id=''111'' name="輸出點"></div>
普通攻擊者嘗試的方法為將name屬性的雙引號閉合,然后再構造xss語句。
<div id=''111'' name=" "><script>alert`1`</script><""></div>
此處同樣推薦使用HtmlEncode

3.輸出點在<script>標簽中
在<script>標簽中輸出時,首先應該確保輸出的變量在引號中,例如
<script> var x="輸出點"</script>
此處的防御思想是:使攻擊者無法閉合標簽,導致無論輸入什么參數都會被瀏覽器當作字符串處理。
此處應使用JavascriptEncode。

4.在事件中輸出
   在事件中輸出和在<script>標簽中類似
<a href=# οnclick="funcA(''輸出點'')">超鏈接</a>
攻擊方法舉例:
<a href=# οnclick="funcA('''');alert`1`;//'')">超鏈接</a>

5.在CSS中輸出
因為對CSS不太熟悉,所以此部分暫不介紹。
但根據白帽子一書中的介紹,推薦使用  encodeForCSS()函數

6.在地址欄中輸出
在地址欄中的輸出比較復雜,但總結起來相較于前面有兩點需要注意:
(1).輸出點在路徑或者參數中。
<a >test</a>
攻擊者可按照如下方式構造payload
<a οnclick=alert(1) "">test</a>
此處的防御方法為使用URLEncode,是代碼變成下面這樣
<a >test</a>
(2).輸出點為整個URL。
<a href="輸出點">test</a>
此時就不能單純的使用URLEncode來抵御XSS攻擊了,因為協議和域名部分是不能夠進行URL編碼的,不然會改變原有的語意。
此處攻擊者可能會構造偽協議實施攻擊
<a href="javascript:alert(1);">test</a>
能被攻擊者利用的偽協議有:javascript,vbscript,dataURL
dataURL這個偽協議是Mozila所支持的,能夠將一段代碼寫在URL里
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydGAxYDwvc2NyaXB0Pg==">test</a>
這段base64字符串解碼后就是<script>alert`1`</script>

所以此處的防御方法應為:
<script> <style> <a>等標簽的src和href屬性必須以白名單的方式強制為   http://或https://開頭,并且不能有10進制和16進制編碼的字符串。(此處的做法是防止攻擊者使用偽協議進行XSS攻擊)

7.DOM型XSS的防御
如果用戶的輸出點在<script>之間時,須先進行一次JavaScriptEncode,在通過document.write等方式輸出到HTML頁面時,如果輸出點為事件或者腳本,須再進行一次JavaScriptEncode,如果輸出點為HTML的內容或者屬性,則需要做一次Htmlencode。

五、總結
輸出到HTML標簽內或者之間,需使用HtmlEncode編碼進行防御。
輸出到JavaScript標簽內或者之間,需要進行JavaScriptencode來進行防御。
抵御DOM型XSS,當使用document.write等方法向HTML頁面內輸入內容時,如過輸出點在JS環境內就要再進行一次JavascriptEncode,如果輸出點在HTML標簽內,則再進行一次HtmlEncode。

以上內容大部分參考《白帽子講Web安全》一書。
關于XSS進階教程強烈推薦大家看我的另一篇博客,事我很認真,一點點總結出來的,但訪問量很少。。。鏈接如下:

該文章在 2020/4/8 11:57:26 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved