所謂XSS就是跨網站指令碼 Cross-site scripting 的簡稱,屬於指令碼注入的一種。基本上,XSS就是攻擊者在網頁插入惡意指令碼(指令碼可以使JavaScript、Java或甚至任何其他的程式碼),使用戶在瀏覽頁面時執行惡意指令碼,以盜取用戶的各種資訊,例如cookie、session、token等敏感資訊。
攻擊者透過在受害者的網頁請求參數paramater之中直接插入惡意指令碼,使受害者的瀏覽器執行指令碼。
可以看一看以下例子:
假設有這樣的一個網站,會將paramater中的data
的值直接換成HTML插入到網頁中:
可以看到,網址輸入xxx.com?data=test
的話,網頁會顯示Data: test
。
然而,如果攻擊者在data
輸入<script>
指令碼,出來的結果會是甚麼樣呢?
我們試一試輸入?data=<script>alert()</script>
:
可以看到,alert()
的代碼被執行了。那麼攻擊者只需要在data打上惡意程式碼,然後把連結發給受害者,就能夠在受害者的瀏覽器上執行惡意代碼了。
概念和反射性XSS類似,不同的是惡意代碼儲存在伺服器端或資料庫等等,而不是在請求參數等用戶提供的東西。這會使得所有瀏覽該網頁的用戶都會執行惡意代碼。
這是基於DOM(文件物件模型)的一種XSS。DOM簡單來說就是HTML和XML文檔的編程接口,定義了訪問和操作HTML文檔的標准方法。而在DOM型XSS中,攻擊者利用網頁中的DOM操作,直接修改網頁結構和內容。
在CTF中,如果我們想要測試XSS的可行性,我們可以先在看到可以輸入資料的地方試一下打一些東西。
以上的例子中,可以看到,網頁將我們data
parameter的值放到了<input>
的value
之中。我們可以嘗試提早關掉<input>
tag,再加上<script>
tag,例如:
可以看到,我們把data設定成"><script>alert("XSS'ed")</script>
,
那麼HTML代碼就會變成:
<input type="text" name="data" value=""><script>alert("XSS'ed")</script>">
而理所當然的,<script>
裡面的alert()
也被順利執行了。
到這裡,我們就知道這個data
可以讓我們進行XSS了。
而在CTF裡面,有一些最簡單的題目甚至會列明只要進行XSS執行某個代碼就可以通關獲得Flag,那麼就能很容易的獲得Flag了。
<script>
之外的XSSXSS也不一定需要利用到<script>
tag -- 有時候我們會被限制了插入<script>
tag。這時候,我們可以找找有沒有其他可以讓我們XSS的地方,就例如:
假如有一個模擬發文平台,用戶可以輸入HTML的訊息發出去。
這時候,如果<script>
被禁止了(例如是,包含<script>
tag會被禁止發送),那麼我們可以嘗試利用<img>
的onerror
特性--onerror
中的指令碼會在<img>
圖片載入失敗時執行。就好像:
<img src="bad_src" onerror="alert()">
由於bad_src
不存在,<img>
出現錯誤,onerror
中的alert()
就會被執行。同樣道理,我們能夠把alert()
換成其他的指令碼,來達成執行任意指令碼的目標。
大部分可供XSS的Payload(例如上面的<img onerror="">
) 可以在GitHub上的payloadbox/xss-payload-list找到。