第一关
前端F12查看代码:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200516215847347.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xkemhoaA==,size_16,color_FFFFFF,t_70)
这里只能看到参数test输出在h2里面,可以尝试直接构造payload:
<script>alert(/xss/)</script>
![](https://img-blog.csdnimg.cn/20200516215956821.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xkemhoaA==,size_16,color_FFFFFF,t_70)
成功!
后台关键源码:
<?php
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
?>
这里是以GET方法获取参数name,并直接输出,没有任何过滤或转义。
第二关
尝试上一关的方法:
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020051622030267.png)
Payload没有执行成功,而且被原封不动的输出来了,估计是被实体转义了。
尝试一下构造闭合input的payload:
"><script>alert(/xss/)</script>//
成功
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200516222157210.png)
后台关键源码:
<?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>';
?>
这里面的输出用了htmlspecialchars()函数做实体转义,payload的一些字符被转换为HTML实体了,所以不能作为标签运行。
htmlspecialchars()函数具体参考如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200516220441840.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xkemhoaA==,size_16,color_FFFFFF,t_70)
这里的字符转换只是作为HTML输出,浏览器输出还是和原来的字符一样,例如:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200516220506423.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xkemhoaA==,size_16,color_FFFFFF,t_70)
第三关
先试一下第二关的方法:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200516220532862.png)
这里可以看到用来构造闭合的双引号被转义了。
后台关键源码:
<?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>";
?>
和第二关的源代码做一下对比,发现这里不仅输出用了htmlspecialchars()函数做实体转义,输入也用了该函数。所以只能用来尝试
因为&、<、>还有双引号都被转换了,可以尝试构造不包含这些字符的payload
方法一:构造onclick事件(点击一下输入框,就可以触发onclick事件,响应onclick中的javascript代码)
Payload='onclick=alert(/xss/)//
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200516220827443.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200516220839730.png)
方法二:构造onmouseover事件(鼠标移动到输入框,就可以触发onmouseover事件,响应onmouseover中的javascript代码)
Payload='onmouseover=alert(/xss/)//
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200516220901795.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200516220923407.png)
第四关
用上一关的方法:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200516220934794.png)
发现单引号闭合不了,那就用双引号试试:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200516220944913.png)
成功闭合,鼠标移动到输入框,成功!
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200516221001362.png)
后台关键源码:
<?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>';
?>
此处用了str_replace()函数将用户输入个keyword中的字符 > < 替换为空,所以不能用<>的payload。
总结
碰到字符被转义的情况,尝试用其他没有被转义的字符构造payload。