XSS的構造技巧
By:Mirror王宇陽 E-mail:2821319009@qq.com
本文為長期持續維護,一旦遇到新的技術技巧將及時更新本文內容
非常的歡迎技術大佬糾正並補充,也歡迎技術同僚討論學習
利用字符編碼
利用字符編碼構造成一個xss,在道哥的書中是這樣描述的:
百度搜索存在一個script標簽輸出一個變量,但是轉義了雙引號
var ** = "  \";alert(/xss/);" 
 
        正常情況下,雙引號被轉義了,后面的(引號外)內容是會被賦給**並得不到有效輸出的~(一旦賦值那么這就知識一個普通的字符串,而不會構成xss)
但是百度使用了GBK的編碼方式返回頁面,在返回中“%c1/”會組合成為一個Unicode字符,在瀏覽器中會被認為是一個合法的字符,意義:表示這個轉義的斜杠就失去了作用,同理雙引號也就不會被轉義
# 構造
%c1";alert(/xss/);//
# 頁面返回效果
var ** = "%c1/";alert(/xss/);//"
//這時的**的值時特殊的字符 alert(/xss/);被當做一條可執行的語句存在script標簽中構成了xss
 
        繞過長度限制
存在xss漏洞的攻擊點,服務端對該處有邏輯上的長度限制;在有限的長度限定內無法完成自己需要的xss語句構造!
舉例:<input type=text value="$var" > 該處的$var可以實現xss><script>alert(/xss/)</script>等一定字符限制內容的xss構造……
如果服務端對$var變量的長度設置了字符長度限制……攻擊者可以利用事件Event來縮短自己xss的字符長度例如:" onclick=alert(/xss/) 這時候也會鼠標觸發事件導致xss的執行……
但是如果長度的限制導致我們也無法使用事件來構造xss;道哥給出的解決辦法是:將xss Payload寫到其他地方,在構造簡短的代碼加載Payload xss
使用location.hash
location.hash是一個很好的藏代碼的地方,他下載地址欄#符號后面,長度理論上沒有限制而且HTTP協議中是不會計算該內容的……
# URL構造
http://www.xxx.com/index.html#alert(/xss執行/)
# 構造xss $var變量的值
" onclick="eval(location.hash.substr(1))" 
 
        當觸發鼠標時間后,就會執行eval函數(執行js代碼),調用location.hash的內容且從第一個字符開始(因為第0個字符是符號#)
特定環境注釋繞過長度限制
當我們的xss測試環境下,有兩個以及兩個以上的可輸入的文本框,則可以利用HTML的注釋符特性,將兩個文本框之間的HTML代碼內容全部注釋,最終將多個文本框之間連通在一起可以實現多字節長度的xss Payload的構造和使用……
<base>標簽
<base>標簽是一種用於定義HTML文檔中定義的“相對路徑”鏈接屬性源地址的標簽;通俗的說:
<img src="/imgage/2001/9/img_222993.png">
 
        這是一個圖片標簽,使用的是相對地址,默認情況是從當前的位置尋找imgage文件夾一路追溯找到png圖片,但是本地並沒有這個png圖片,這個圖片是從一個圖穿網站上找來的,但是沒有使用絕對路徑導致圖片無法加載,而正有幾百個img標簽存在與這同樣的問題;為了方便可以使用<base>標簽,定義:
<base href="http://www.xxx.con/">
 
        在這個標簽之后的所有地址鏈接都會從這個網站開始構造成一個絕對路徑進行追溯文件並加載……
攻擊者可以在適當的地方加入<base>標簽,導致該標簽后的所有鏈接地址重新定義追溯地址的起點位置,攻擊者可以利用這個偽造圖片、鏈接等等……這是一種鏈接地址劫持
巧妙運用window.name
window.name是對當前窗口的對象操作,而非document……利用window.name可以實現不一樣的神奇的操作…
index_1.html:
<script>
	window.name = "text";
    alert(document.domain + "~" + window.name);
    window.location = "index_2.html";
</script>
 
        index_2.html:
<script>
	alert(document.domain + "~" + window.name)
</script>
 
        最后的測試結果顯示:兩個HTML頁面的window.name的內容為一致!由此可得出:window.name是可以跨站、跨頁面實現一定的操作內容的!
同理:window.name的內容值實現了跨頁面后,就可以在另外一個由該頁面跳轉的HTML頁面中發現xss漏洞后利用window.name;若window.name是一個xss Payload語句,在頁面xss利用處直接寫入eval(window.name)豈不是美哉!
