XSS基础——xsslabs通关挑战

news2024/9/23 21:21:49

目录

  • XSS基础
    • 一、XSS基础概念
      • 1、XSS基础概念
      • 2、XSS分类
    • 二、xsslabs通关挑战
      • level 1
      • level 2
      • level 3
        • htmlspecialchars函数
        • html事件属性
      • level 4
      • level 5
      • level 6
      • level 7
      • level 8
        • 深入理解浏览器解析机制和XSS向量编码
      • level 9
      • level 10
      • level 11
      • level 12
      • level 13
    • 三、总结

XSS基础

一、XSS基础概念

1、XSS基础概念

跨站脚本攻击XSS(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。XSS攻击针对的是用户层面的攻击!

当然,也有很精简的定义,就是web程序在开发的时候没有对用户的输入进行严格的控制。导致用户的某些非法恶意输入可以在我们的页面上加载外部脚本资源。泄露客户端本地存储的用户敏感信息(尤指cookie)。引发严重的后果。

2、XSS分类

按照大的分类可以分成两类:反射型xss和存储型xss
而反射型xss可根据作用位置的不同分为两类,反射型xss和dom型xss
总的来说就是三类:反射型xss、dom型xss、存储型xss
其中存储型xss危害最大

二、xsslabs通关挑战

level 1

在这里插入图片描述

点击后在url 发现注入点

在这里插入图片描述
在这里插入图片描述

level 2

在这里插入图片描述

发现注入点,先尝试刚才输入的payload,发现没成功,F12发现需要闭合input 标签

那怎么闭合呢?双引号需要成对存在
	aaa"><svg onload=alert(1)>

在这里插入图片描述

在这里插入图片描述

level 3

在这里插入图片描述
在这里插入图片描述

尝试注入,发现我们输入的全部被实体转义了,而htmlspecialchars(),没做设置,默认过滤双引号。

htmlspecialchars函数

在这里插入图片描述

html事件属性

在这里插入图片描述

在这里插入图片描述

level 4

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

	注入测试后,发现过滤了><
	aaa" οnclick="alert(1)

在这里插入图片描述

level 5

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

发现script 和 on 都被替换了
我们尝试大小写混用
咳咳,在线打脸哈,输出全为小写,看来人家也是做了大小写过滤了。
继续尝试看看能否闭合,我们输入',",<,>,\进行尝试,发现只有'被实体转义。那应该就是可以使用"来构造闭合
再然后,我发现它是把<script 过滤了,也就意味着只要不是<script 开头 就不会被过滤,这时候我就想到了js伪协议,location js伪协议还用不了,因为过滤了on
![在这里插入图片描述](https://img-blog.csdnimg.cn/7db93f13db2d4896bca7b304eff7db54.png)

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

在这里插入图片描述

level 6

在这里插入图片描述

在这里插入图片描述

我们发现
$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);
这些都被过滤了
我们尝试大小写混用
aaa"><ScRipt>alert(1)</scRIpT>

在这里插入图片描述

level 7

在这里插入图片描述
在这里插入图片描述

我们发现这次不再是<script  被过滤,而是script被过滤。
$str2=str_replace("script","",$str);
看到这,发现script被置换为空,我们尝试双写绕过
aaa"><scrscriptipt>alert(1)</scrscriptipt>
为什么折磨写呢?
中间的script被置换为空,最后剩下的就只有
aaa"><script>alert(1)</script>

在这里插入图片描述

level 8

在这里插入图片描述
在这里插入图片描述

测试payload,可以看见前面测试过的基本都过滤了,大小写也都卡的死死的,但是我们发现前端代码中直接构造好了<a>标签,既然这样,我们不妨试试编码,看能否绕过,不必全部编码,我们只编码r&#x72;i&#x69;
javasc&#x72;&#x69;pt:alert(1)

在这里插入图片描述
编码确实可以绕过,但为什么这里可以编码?又或者我们什么时候可以编码?

深入理解浏览器解析机制和XSS向量编码

下面我们举几个例子
1

<a 	href="%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29">aaa	</a>

在这里插入图片描述
解析不了
URL 编码 “javascript:alert(1)”

2.

<a href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:%61%6c%65%72%74%28%32%29">

解析不了
HTML字符实体编码 “javascript” 和 URL 编码 “alert(2)”

3.

<div>&#60;img src=x onerror=alert(4)&#62;</div>

解析不了
4.
URL 编码 “:”
5.<script>alert(5)</script>
HTML字符实体编码 < 和 >
6.
最后两个 标签执行不了script

在解析一篇HTML文档时主要有三个处理过程:HTML解析,URL解析和JavaScript解析。每个解析器负责解码和解析HTML文档中它所对应的部分,其工作原理已经在相应的解析器规范中明确写明。

从XSS的角度来说,我们感兴趣的是HTML文档是如何被词法解析的,因为我们并不想让用户提供的数据最终被解析为一段可执行脚本的script标签。HTML词法解析细则在这里。HTML词法解析细则是一篇冗长的文档,我们只提取其中一部分拿来分析。这篇博文只会覆盖有关文档解码如何结束,以及新token何时被创建这两个有趣的部分。

一个HTML解析器作为一个状态机,它从输入流中获取字符并按照转换规则转换到另一种状态。在解析过程中,任何时候它只要遇到一个’<‘符号(后面没有跟’/'符号)就会进入“标签开始状态(Tag open state)”。然后转变到“标签名状态(Tag name state)”,“前属性名状态(before attribute name state)”…最后进入“数据状态(Data state)”并释放当前标签的token。当解析器处于“数据状态(Data state)”时,它会继续解析,每当发现一个完整的标签,就会释放出一个token。

这里有三种情况可以容纳字符实体,“数据状态中的字符引用”,“RCDATA状态中的字符引用”和“属性值状态中的字符引用”。在这些状态中HTML字符实体将会从“&#…”形式解码,对应的解码字符会被放入数据缓冲区中。例如,在问题4中,“<”和“>”字符被编码为“<”和“>”。当解析器解析完

并处于“数据状态”时,这两个字符将会被解析。当解析器遇到“&”字符,它会知道这是“数据状态的字符引用”,因此会消耗一个字符引用(例如“<”)并释放出对应字符的token。在这个例子中,对应字符指的是“<”和“>”。

读者可能会想:这是不是意味着“<”和“>”的token将会被理解为标签的开始和结束,然后其中的脚本会被执行?

答案是脚本并不会被执行。原因是解析器在解析这个字符引用后不会转换到“标签开始状态”。正因为如此,就不会建立新标签。因此,我们能够利用字符实体编码这个行为来转义用户输入的数据从而确保用户输入的数据只能被解析成“数据”。
概念
字符实体(character entities)

字符实体是一个转义序列,它定义了一般无法在文本内容中输入的单个字符或符号。一个字符实体以一个&符号开始,后面跟着一个预定义的实体的名称,或是一个#符号以及字符的十进制数字。就是我们常说的HTML实体编码。

HTML字符实体(HTML character entities)

在HTML中,某些字符是预留的。例如在HTML中不能使用“<”或“>”,这是因为浏览器可能误认为它们是标签的开始或结束。如果希望正确地显示预留字符,就需要在HTML中使用对应的字符实体。一个HTML字符实体描述如下:

http://p9.qhimg.com/t0171d5ca6fbb87488f.png
需要注意的是,某些字符没有实体名称,但可以有实体编号。

字符引用(character references)

字符引用包括“字符值引用”和“字符实体引用”。在上述HTML例子中,‘<‘对应的字符值引用为’&#60’,对应的字符实体引用为‘&lt’。字符实体引用也被叫做“实体引用”或“实体”。)

现在你大概会明白为什么我们要转义“<”、“>”、“'” (单引号)和“"” (双引号)字符了。

这里要提一下RCDATA的概念。要了解什么是RCDATA,我们先要了解另一个概念。在HTML中有五类元素:


1. 空元素(Void elements),如<area>,<br>,<base>等等

2. 原始文本元素(Raw text elements),有<script><style>

3. RCDATA元素(RCDATA elements),有<textarea><title>

4.外部元素(Foreign elements),例如MathML命名空间或者SVG命名空间的元素

5.基本元素(Normal elements),即除了以上4种元素以外的元素

五类元素的区别如下:

  • 1、 空元素,不能容纳任何内容(因为它们没有闭合标签,没有内容能够放在开始标签和闭合标签中间)。

  • 2、原始文本元素,可以容纳文本。

  • 3、RCDATA元素,可以容纳文本和字符引用。

  • 4、 外部元素,可以容纳文本、字符引用、CDATA段、其他元素和注释

  • 5、基本元素,可以容纳文本、字符引用、其他元素和注释

如果我们回头看HTML解析器的规则,其中有一种可以容纳字符引用的情况是“RCDATA状态中的字符引用”。这意味着在<textarea>和<title>标签中的字符引用会被HTML解析器解码。这里要再提醒一次,在解析这些字符引用的过程中不会进入“标签开始状态”。这样就可以解释问题5了。另外,对RCDATA有个特殊的情况。在浏览器解析RCDATA元素的过程中,解析器会进入“RCDATA状态”。在这个状态中,如果遇到“<”字符,它会转换到“RCDATA小于号状态”。如果“<”字符后没有紧跟着“/”和对应的标签名,解析器会转换回“RCDATA状态”。这意味着在RCDATA元素标签的内容中(例如<textarea>或<title>的内容中),唯一能够被解析器认做是标签的就是“</textarea>”或者“</title>”。因此,在“<textarea>”和“<title>”的内容中不会创建标签,就不会有脚本能够执行。这也就解释了为什么问题6中的脚本不会被执行。

总结
1<script><style>数据只能有文本,不会有HTML解码和URL解码操作
2<textarea><title>里会有HTML解码操作,但不会有子元素
3、其他元素数据(如div)和元素属性数据(如href)中会有HTML解码操作
4、部分属性(如href)会有URL解码操作,但URL中的协议需为ASCII
5、JavaScript会对字符串和标识符Unicode解码,JS中不能对特殊字符进行unicode编码

level 9

在这里插入图片描述
在这里插入图片描述

除了以前做过的所有过滤,竟然还加了个strpos函数这函数的意思是咱们输入的字符串里面必须要有http://

javasc&#x72;&#x69;pt:alert('http://')

在这里插入图片描述
但如果http://放在最后面,则会弹出失败
javascript:alert(1)http://
在这里插入图片描述
这个只需要把http://注释掉就行
javascript:alert(1)//http://

level 10

在这里插入图片描述
在这里插入图片描述

keyword参数只是一个迷惑而已呀,真正起作用的是t_sort参数,但是有一个问题,它的type类型是hidden,我们得在前端改为text类型,让其显现出来,且后台只对<>做了过滤,我们可以用事件来构造:
t_link=qwq&t_history=qwq&t_sort=qwq" type=text
t_link=qwq&t_history=qwq&t_sort=qwq" onclick=alert(1) type=text

在这里插入图片描述
在注入οnclick=alert(1)

level 11

在这里插入图片描述
在这里插入图片描述

和第十关比较类似,都有隐藏的表单。只是多了一个t_ref参数。
发现多了一个$str11=$_SERVER['HTTP_REFERER']字段,而我们知道,HTTP_REFERER			是获取http请求中的Referer字段的,也就是我们是从哪一个页面来到现在这个页面的。我们可以使用Hackbar进行修改Referer字段。

在这里插入图片描述

level 12

在这里插入图片描述
在这里插入图片描述
发现这次的和上一关一模一样,那么思路就有了,我们直接从User-agent入手,构造代码:

user-agent" onclick="alert(1)" type="text

在这里插入图片描述

level 13

**加粗样式**
在这里插入图片描述

这里是对cookie的插入
我们要先找到cookie的键,才能进行后续的插入:user=123
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

三、总结

在有注入点的情况下我们<script>alert(1)测试,然后查看返回参数的位置,进行绕过。白盒可以对照开源代码进行测试,但一般情况下,都是黑盒测试,这就需要花费更多的时间去测试。就比如Leval 5 javascript伪协议
在这里插入图片描述

1、
2、用onclick 不行on 被替换成o_n
3、<script>也被进行了替换<scr_ipt>
4、测试大小写绕过,也不行,设置忽略大小写。
5、继续尝试看看能否闭合,我们输入’,",<,>,\进行尝试,发现只有’被实体转义。那应该就是可以使用"来构造闭合。
6、最后我们测试了javascript 的伪协议
"><a href=javascript:alert(1)>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/356905.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法刷刷刷| 二叉树篇| 110平衡二叉树| 257二叉树的所有路径 |404左叶子之和| 513找树左下角的值| 112路径总和| 113路径总和II

110.平衡二叉树 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 class Solution {public boolean isBalanced(TreeNode root) {int dfs…

【前端】Vue3+Vant4项目:旅游App-项目总结与预览(已开源)

文章目录项目预览首页Home日历&#xff1a;日期选择开始搜索位置选择上搜索框热门精选-房屋详情1热门精选-房屋详情2其他页面项目笔记项目代码项目数据项目预览 启动项目&#xff1a; npm run dev在浏览器中F12&#xff1a; 首页Home 热门精选滑动到底部后会自动加载新数据&a…

【factoryio】使用SCL编写 <机械手控制> 程序

使用虚拟工厂软件和博图联合仿真来编写【scl】机械手控制程序 文章目录 目录 文章目录 前言 二、程序编写 1.机械手运行部分 2.启动停止部分 3.急停复位部分 三、完整代码 总结 前言 在前面我们一起写过了许多案例控制的编写&#xff0c;在这一章我们一起来编写一下一个…

Vue中 引入使用 babel-polyfill 兼容低版本浏览器

注意&#xff1a;本文主要介绍的 vue-cli 版本&#xff1a;3.x&#xff0c; 4.x&#xff1b; 最近在项目中使用 webpack 打包后升级&#xff0c;用户反馈使用浏览器&#xff08;chrome 45&#xff09;访问白屏。经过排查发现&#xff1a;由于 chrome 45 无法兼容 ES6 语法导致的…

linux018之安装mysql

linux上安装mysql&#xff1a; 第一步&#xff1a;查看是否已经安装mariadb&#xff0c;mariadb是mysql数据库的分支&#xff0c;mariadb和mysql一起安装会有冲突&#xff0c;所以需要卸载掉。 yum list installed | grep mariadb &#xff1a;查看是否安装mariadb&#xff0c;…

「可信计算」论文初步解读

可信计算组织&#xff08;Ttrusted Computing Group,TCG&#xff09;是一个非盈利的工业标准组织&#xff0c;它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立&#xff0c;并采纳了由可信计算平台联盟&#xff08;the Trusted Computing Platform Alli…

数据结构与算法

1、复杂度分析&#xff08;上&#xff09;&#xff1a;如何分析、统计算法的执行效率和资源消耗&#xff1f;复杂度分析是整个算法学习的精髓&#xff0c;只要掌握了它&#xff0c;数据结构和算法的内容基本上就掌握了一半。&#xff08;1&#xff09;为什么需要复杂度分析&…

Github 学生优惠包 -- 最新防踩坑指南

Github学生优惠包的申请最近越来越麻烦&#xff0c;里面有非常多的坑&#xff0c;留下此文防止各位申请的时候踩到。 此文面向中国大陆真正有学生身份的同学&#xff01;&#xff01;&#xff01; 文章目录前言1.用到的网址2.申请所需3.详细步骤4.踩坑点前言 记得在一年以前还…

进程的概念

进程的概念 程序的概念 这里说的是一个可执行文件&#xff0c;passive的意思可以理解为我们这个执行文件需要我们进行双击才会被被执行。 双击后&#xff0c;程序入口地址读入寄存器&#xff0c;程序加载入主存&#xff0c;成为一个进程 进程是主动去获取想要的资源&#xff0…

图解LeetCode——剑指 Offer 10- II. 青蛙跳台阶问题

一、题目 一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。 答案需要取模 1e97&#xff08;1000000007&#xff09;&#xff0c;如计算初始结果为&#xff1a;1000000008&#xff0c;请返回 1。 二、示例 2.1>…

inno setup打包软件学习

目录 一 打包结果 二 示例打包脚本 三 错误解决 3.1 另一个程序正在使用此文件&#xff0c;进程无法访问 3.2 桌面图标无法修改 四 参考资料 一 打包结果 测试程序来自&#xff1a; 泽森科工 (zenustech.com) 二 示例打包脚本 使用打包软件下载地址&#xff1a; in…

[U3D ShaderGraph] 全面学习ShaderGraph节点 | 第四课 | Input/Lighting

📣📣📣本专栏所有内容在完结之前全部为试读模式,专栏完结之后会取消试读模式,如果感觉内容还不错的话请支持一下📣📣📣 ShaderGraph是可视化的着色器编辑工具。您可以使用此工具以可视方式创建着色器。 本专栏可以让你更了解ShaderGraph中每个节点的功能,更自如的…

BUUCTF Reverse xor

题目&#xff1a;BUUCTF Reverse xor 一些犯傻后学到了新东西的记录 查壳&#xff0c;没壳&#xff0c;IDA打开 main函数很好理解&#xff0c;输入一个长度为33的字符串&#xff0c;1-32位与前一位异或后与global相等&#xff0c;则判定flag正确 找global 在strings window直…

【Java】《Java8 实战》 CompletableFuture 学习

文章目录前言1. 并发(Concurrent) 和 并行(Parallel)1.1 并发的来源1.2 并发技术解决了什么问题2. 并行的来源2.1 并行解决了什么问题3. CompletableFuture 简介4. CompletableFuture 简单应用5. CompletableFuture 工厂方法的应用6. CompletableFuture join() 方法7. 使用 Par…

2022黑马Redis跟学笔记.实战篇(七)

2022黑马Redis跟学笔记.实战篇 七4.11.附近的店铺功能4.11.1. GEO数据结构的基本用法1. 附近商户-导入店铺数据到GEO4.11.2. 获取附近的店铺1. 附近商户-实现附近商户功能4.9. 签到功能4.9.1.BitMap原理1. 用户签到-BitMap功能演示4.9.2.实现签到功能4.9.3.实现补签功能4.9.4.统…

.net开发安卓入门-自动升级(配合.net6 webapi 作为服务端)

文章目录思路客户端权限清单&#xff08;AndroidManifest.xml&#xff09;权限列表(完整内容看 权限清单&#xff08;AndroidManifest.xml&#xff09;&#xff09;打开外部应用的权限(完整内容看 权限清单&#xff08;AndroidManifest.xml&#xff09;&#xff09;添加文件如下…

网络数据包接收流程

1. 网络数据包接收流程简述 典型的以太网卡网络包接收流程如下&#xff1a; 1.网络包通过物理介质传到接收端的phy芯片&#xff1b; 2.phy芯片通过RGMII协议传到MAC芯片rx queue fifo中&#xff1b; 3.MAC芯片通过专用DMA将网络包搬运到网卡驱动程序预先分配好的rx ringbuffer中…

【多线程与高并发】- synchronized锁的认知

synchronized锁的认知 &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 一个有梦有戏的人 怒放吧德德 &#x1f31d;分享学习心得&#xff0c;欢迎指正&#xf…

言简意赅+图解 函数传参问题(传值、传地址 500字解决战斗)

1、传值 2、传地址 不论是传值&#xff0c;还是传地址&#xff0c;形参都是对于实参的一份拷贝 下图为按值传递进行交换&#xff1a; 形参left拷贝一块新空间&#xff0c;形参right拷贝一块新空间 下图为按指针传递进行交换 形参left拷贝一块新的空间&#xff0c;形参right…

研究生薪资管理系统-课后程序(JAVA基础案例教程-黑马程序员编著-第四章-课后作业)

【案例4-5】研究生薪资管理系统 【案例介绍】 案例描述 在学校中&#xff0c;学生每个月需要交相应的生活费&#xff0c;老师每个月有相应的工资&#xff0c;而在职研究生既是老师又是学生&#xff0c;所以在职研究生既需要交学费又会有工资。下面要求编写一个程序来统计在职…