XSS总结知识点+例题实操

news2024/11/18 9:22:53

目录

XSS总结知识点

1、XSS也是属于注入攻击的一类,他是通过构造一个JS代码,注入到网页中,由用户的浏览器来请求源码且运行达到攻击的效果;

2、XSS的危害

3、XSS产生的原因

4、反射性XSS

5、存储型XSS

6、DOM的XSS

7、XSS的事件触发

8、XSS的防御及修复

9、XSS很多时候就是一边测试性的输入一边查看html源码,可以通过查看源码查看系统对我构造的js注入做了什么防御;

10、XSS的绕过

例题篇:

1、XSS反射型:就是我们在向服务器请求数据的时候,会有一个输入的过程,我在输入过程中故意输入了一个js脚本;然后服务器就会接收我们这个js脚本并同他的html代码结合然后一起返回给我,这样我的js代码就算是注入到我们的html源码中了;

2、DOM型XSS  --向源html码中插入代码,破坏源DOM

例题1:

--2、例题2

--3、例题3,不能于用户交互

--4、例题4  不能于用户交互

​编辑

--5、例题5

--6、例题6

--7、例题7

​编辑

8、例题8


XSS总结知识点

1、XSS也是属于注入攻击的一类,他是通过构造一个JS代码,注入到网页中,由用户的浏览器来请求源码且运行达到攻击的效果;

2、XSS的危害

3、XSS产生的原因

没有对用户输入数据进行转义过滤,导致有了完整的标签js代码出现了;

4、反射性XSS

5、存储型XSS

6、DOM的XSS

DOM的XSS是客户端通过本地的DOM,动态的将数据和html结合输出样式到页面;

我们的DOM XSS就是想办法修改客户端的网页DOM结构,想办法插入恶意代码,从而获取用户的一些信息

7、XSS的事件触发

第二个是:当鼠标对焦到失效图片上时,就会触发该事件;

这个事件不只可以在图片上使用,事件还可以在其他很多地方使用

js的触发事件还有很多很多,自己慢慢积累;

8、XSS的防御及修复

9、XSS很多时候就是一边测试性的输入一边查看html源码,可以通过查看源码查看系统对我构造的js注入做了什么防御;

因为很多时候你是看不到防御js注入的源码的,所以就只能通过一边尝试js注入,一边通过html源码来查看系统对我的js注入实行了什么防御操作

10、XSS的绕过

我们XSS的过滤无法就是通过正则表达式进行一些个过滤,那么我们的这个就XSS的绕过其实就和MySQL的绕过差不了多少;

我们就可以使用

1、大小写绕过

2、双重编码绕过:但是编码绕过的话一般是会被解码的:举个例子,我们使用的url编码绕过,但是url编码到达后端是会被解码的,那么我们就应当使用双重编码/多重编码,这样到达后端即使解码了,数据还是处于编码的形式,那么就不会被过滤了;然后这个编码的数据又返回给浏览器的时候又会被再次解码,那么我们的数据就会被还原了;而且我们浏览器是可以执行明文的html和js的;因此即使js代码在回浏览器上才解码了,也不算晚;

3、双写绕过

4、Unicode编码绕过:正常我们浏览器向服务器发送数据只会url的编解码,不会Unicode的编解码;只有服务器返回回来数据到浏览器上后,才会对数据才行进行url边界码,然后再进行Unicode的编解码;

因此当你使用Unicode编码之后,浏览器向服务器发送过去

5、当你的单双引号无法闭合的时候,那个这个注入点肯定就是没用的,那么我们就尝试去找到其他的注入点;

例题篇:

1、XSS反射型:就是我们在向服务器请求数据的时候,会有一个输入的过程,我在输入过程中故意输入了一个js脚本;然后服务器就会接收我们这个js脚本并同他的html代码结合然后一起返回给我,这样我的js代码就算是注入到我们的html源码中了;

因此如果我们需要对用户构成威胁,则我们需要首先构造一个链接等东西,里面蕴含了我的js脚本,然后用户点击这个链接进行输入,然后发送给服务器的时候,用户就会连同我的js脚本一起发送,然后服务器就会接收到我的js脚本然后将这个js脚本镶嵌在html源码中了;

服务器再将镶嵌了js源码的html运行,然后将结果返回给客户端浏览器,这样用户就会被造成损失;

注意:js的运行是在服务器上进行的,运行结束的html源码然后才返回给客户端

XSS反射性说白了就是服务器对用户的输入过滤不严格造成的!!

---前端可以直接执行js代码,因此当我们的js代码镶嵌在前端中时,可以直接被执行;

2、DOM型XSS  --向源html码中插入代码,破坏源DOM

--1、

--1、<h2 id="spaghet"></h2><script>

spaghet.innerHTML = " Toucha Ma Spaghet!"

</script>

这里调用了我们js中每个标签都有的一个方法:inner HTML方法,这个方法可以将对应值插入id对应的标签底下。也可以将标签插入到id对应的标签底下

例题1:

<h2 id="spaghet"></h2><script>

    spaghet.innerHTML = (new URL(location).searchParams.get('somebody') || "Somebody") + " Toucha Ma Spaghet!"</script>

1、解决办法:?somebody=<script>alert(1)</script>

看似这种是可以的,但是因为官方认为innerHTML方法太不安全了,所以就对该方法做了限制,只要是想通过innerhtml方法实现添加<script>标签,那么该标签就会被变成一个没有任何功能的<script/>标签;

2、因此我们还可以使用:

?somebody=<img%20src=1%20οnerrοr=alert(1337)>

//意思:当我们的图片加载不出来就会执行js的onerror代码:alert(1337)

--2、例题2

<!-- Challenge --><h2 id="maname"></h2><script>

    let jeff = (new URL(location).searchParams.get('jeff') || "JEFFF")

    let ma = ""

    eval(`ma = "Ma name ${jeff}"`)

    setTimeout(_ => {

        maname.innerText = ma

    }, 1000)</script>

我们的js中也有执行函数eval

注意我们的js中eval也是将字符串当作代码执行,但是这里之所以还要逃出双引号,是因为本身获取的值就是一个字符串,字符串外面再套一层字符串就会执行不了

反引号也不能将字符串当作命令执行(严格来说Linux也不允许这样,但是Linux的部分命令可以这样);

解决方法:?jeff=";alert(1);"   //为了不让alert变成字符串,无法执行,则必须逃出单引号

--3、例题3,不能于用户交互

1、这里看到我们写入是只能在input元素中,

因此我们可以这样:?wey=aa" οnclick="alert(1) / aa" oncfocus="alert(1)

这样肯定没问题,但是我们这里是不能于用户交互的,因为我们的input元素,因此这个onclick是必须点击才能触发的

2、但是我们可以使用另一个方法wey=aa" οnfοcus=alert(1) autofocus="

就是正常对焦才能触发的函数,我们再来一个自动对焦;那么函数就能自动调用了

我们的οnclick=这种触发事件调用的值必须要加上双引号;但是很多时候其实浏览器会自动帮助我们加上;所以这题其实我们只要逃出来双引号,后面的双引号闭合即可,即使οnclick=后买的值没有加双引号浏览器也会帮助我们加上的

--4、例题4  不能于用户交互

这里是将用户的输入当作form表达的路径,然后下面有一个2秒钟自动提交

1、办法:?ricardo=javascript:alert(1)   //这样我们在自动提交到action中时,会自动触发action,自然而然的就会触发js代码

2、补充:我们的JavaScript的作用是当你的js代码是字符串时,那么你想要让系统认出你的js代码,那么就得在前面加上一个“Javascript:  ” 申明头;因此,如果我们想要在href,location这种值为字符串的里面添加js代码,就必须在其里面添加" Javascript:  "  申明头;

注意,我们的js代码是想要触发的,因此,我们的location="javascript:alert(1)"也是不能单独使用的;需要和触发项配合使用;比如下面第5题;

还比如我们的href=“值有js代码的时候必须写”javascript,因为里面是字符串形式的js代码

目前来,需要用到" javascript:  "申明头的主要有:href,location

3、反过来也是一样,我们的form表单也是不能点击的,他不像input那样有方框可以让你点击呀,因此我们的form表单也是不能添加onclick这种事件的

--5、例题5

显然是对符号进行过滤了,且过滤了多次;

然后将这个值添加到了<h2>标签下面

--方法:?a=<img src=1 οnerrοr=location="javascript:alert%25281%2529">

看思路:1、首先,我们看到我们的这个括号这些被过滤了,因此我们的括号是需要进行编码的,然后我们就将括号进行编码成了%28%29,但是注意我们的%28%29是作为的客户端输入的,因此这个传给服务器时,还是会进行解码,依然会变成(),那我们再使用%25嘛,

%25经过url编码会变成%,因此%2528%2529经过一次url解码之后,会变成:%28%29,又因为我们的js代码是不能将符号进行编码的,因此不能这样写:οnerrοr="alert%2528%2529";

那么我们怎样才能让js中的括号允许编码,——让js代码变成字符串;也就是加入location使用,οnerrοr="location="alert%2528%2529"";

这样,我的js符号就没有编码了,因为我的js代码是location="javascript:alert%2528%2529",而alert%2528%2529是属于location的字符串的,不属于js代码;因此,在发送向浏览器的时候,我们的alert%2528%2529就变成了alert%28%29,然后以为这个alert%28%29是在location里面的,所以他不会被认为是js代码;这样将这个返回给浏览器的时候,又被解码了,又变成了(),这样浏览器就可以正常执行js代码了;

注意:1、服务器执行不了的js代码,浏览器也会继续执行!!

2、oneerror="alert(1)"这里面的alert(1),js会认为他是js代码,因为这种就是正常的js代码的写法;但是如果是把这个加入到location里面的话,系统就会认为他是字符串;

但是回到浏览器的时候,系统把他解析成()之后,浏览器一看这个字符串里面还有javascript这个申明头,那么就知道这个字符串是js代码了

因此经过正则表达式过滤之后,%28%29依然存在,就这样有发送给了客户端浏览器;

客户端浏览器再一解析,就变成了(),这样就成功运行了;

---注意:我们的location后面可以加Javascript:  声明头

--6、例题6

这里说明了不能用数字字母,显然就是想让我们用符号

这里将alert(1)进行jsfuck编码,然后再将这个编码进行url编码,最后才是将url编码后的值传递给balls    ?balls=jsfuck和url编码后的值...

我们的js中可以识别jsfuck编码,因此我们的js支持对符号进行jsfuck编码和html实体编码;

问题:为啥需要进行url编码,不是浏览器会自动进行编解码吗?

因为浏览器上可能会对 + 这种类似的编码出错,然后到达服务器上就变不回 + 了

--7、例题7

这里除开的对符号过滤以外,还对alert和confirm也过滤了,这里confirm写漏了;

那我们就不能像例题6那样了,那我们该怎么办?

可以看出,他的alert只过滤了小写,没有过滤大写,那我们可以使用大写呀!

--问题又来了,我们的js是严格区分大小写的,我们转ALERT就会不起作用了呀,js就不能执行了呀!

那我们不妨将其再用函数将其转成小写怎么样?

方法1:说干就干:?mafia=Function(/Alert(1)/.source.toLowerCase())()    //这个是构造函数

//source.toLowerCase()函数是将其转换成小写,最后面的()是自动执行构造函数;

我们的普通函数是不能自己执行自己的,但是我们的构造函数是可以自动执行自己的,就是在函数体最后面添加一个();

注意使用.source则必须在前面加上两个 /.../

//准确的来说其实这个是不是普通的函数,普通函数哪有可以自动执行的,其实这个是构造函数

方法2:parseint编码

?mafia=eval(8680439..toString(30))(1)

8、例题8

这篇文章没有什么好说的,他主要考察的是这个框架的过滤:黑名单

这个框架对于οnerrοr=alert(1)这种标准js进行了过滤,对于字符串中函数有Javascript:alert(1)

这种也进行了过滤;

但是没有过滤字符串tel:这种类型的js,因此我们可以尝试使用:<a id=ok href=tel:alert(1)>

我们的tel为什么也可以让浏览器执行这个js代码?

因为我们js中也有tel,cid等这些关键字/函数,那么当你在前端用这些关键字/函数的时候,浏览器就会把他看作是他能认出的语言里面的关键字,刚好js中有这个关键字,那么浏览器自然就会把他解析成我们的js代码

下面的setTimeout(ok,2000):在2秒后调用我们的ok对应的标签,也就是进入a标签,注意,这里使用setTimeout调用的话,不能使用name=ok,只能使用id=ok。

完结篇啦,哈哈哈。

本篇注意事项:

--1、题目中这种是不行的,因为onfocus是不能是字符串的;这里的onfocus进行解码之后明显是变成了字符串;

可能有人会说,这里即使不是编码,直接就是写一个wey="οnfοcus=alert(1)"为什么就可以?

因为我们的js中变量附加在标签中时,会自动把其变成普通值,而非字符串;就是说会把字符串的双引号去掉,变成一个值了;

但是如果这里进行编码了,那么我们将起双引号去掉之后,然后加入到html标签中,然后再进行实体解码,那么这个又会变成一个"οnfοcus=alert(1)"这样一个字符串了;

--2、我们的JavaScript是可以进行编码的,因为我们的Javascript本身就是应用在字符串中的,起申明作用的;所以当我们的Javascript编码且加上双引号之后,在js中就会去掉字符串属性,也就是去掉双引号;

然后添加到html中时,就会被html实体解码;然后又会变成字符串;这样也是刚刚符合JavaScript必须存在于字符串的要求;

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

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

相关文章

C++第三十八弹---一万六千字使用红黑树封装set和map

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、set/map基本结构 2、红黑树基本结构改造 3、红黑树的迭代器 4、set的模拟实现 5、map的模拟实现 6、完整代码 1、set/map基本结构 在封装…

三元组损失Triplet loss 详解

深度神经网络在识别模式和进行预测方面表现出色,但在涉及图像识别任务时,它们常常难以区分相似个体的图像。三元组损失是一种强大的训练技术,可以解决这个问题,它通过学习相似度度量,在高维空间中将相似图像准确地嵌入到彼此接近的位置。 在这篇文章中,我们将以简单的技术术语解…

程序员为什么要一直写bug ,不能一次性写好吗?

文章目录 一、前言二、为什么要写bug1、程序员的疑问&#xff1f;2、bug产生的原因3、减少bug的措施4、程序员不是机器 三、写代码的好习惯&#xff0c;减少80%的bug1、修改完代码&#xff0c;记得自测一下2、方法入参尽量都检验3、修改老接口的时候&#xff0c;思考接口的兼容…

SpringBoot3核心特性-快速入门

目录 传送门前言一、简介1、前置知识2、 环境要求3、SpringBoot是什么 二、快速体验1、开发流程2、特性小结3、Spring Initializr 创建向导 三、应用分析1、依赖管理机制2、自动配置机制2.1、初步理解2.2、完整流程2.3、如何学好SpringBoot 四、核心技能1、常用注解1.1、组件注…

Spring Boot的自动装配机制?(Spring Boot怎么完成自动装配的?)----面试常问

Spring Boot的自动装配机制&#xff1f;(Spring Boot怎么完成自动装配的?) 目录 一、概念版&#xff08;重要&#xff09; 二、实操版 1. 依赖管理 (pom.xml导坐标) 2. 自动配置类 2.1 SpringBootApplication 注解 2.2 EnableAutoConfiguration 2.3 Import({AutoCon…

基于node.js的宠物寄存管理系统,基于express的宠物寄存系统

摘 要 伴随着社会以及科学技术的发展&#xff0c;互联网已经渗透在人们的身边&#xff0c;网络慢慢的变成了人们的生活必不可少的一部分&#xff0c;紧接着网络飞速的发展&#xff0c;系统管理这一名词已不陌生&#xff0c;越来越多的宠物店等机构都会定制一款属于自己个性化…

2.8销毁窗口

目录 1.实验原理 2.实验代码 3.运行结果 1.实验原理 销毁某一个指定名称的窗口 destoryWindow 函数原型 Destroys a window.void destroyWindow(const string& winname)&#xff1b;含义 功能: 销毁指定名称的窗口。 参数: const string& winname: 一个字符串&am…

香港租云服务器多少钱一台?

香港租云服务器多少钱一台&#xff1f;香港云服务器的租用价格因配置、带宽、服务等级等因素而异&#xff0c;从数百元到数千元不等。例如&#xff0c;入门级服务器的价格在数百元至一千元之间&#xff0c;适用于个人网站、小型博客等低流量应用。标准型服务器的价格在一千元至…

电商人必看!4招拿捏消费者心理,没有卖不出去的产品

在竞争激烈的电商领域&#xff0c;产品如何脱颖而出&#xff0c;成为消费者心中的首选&#xff0c;不仅依赖于产品的质量与性价比&#xff0c;更在于如何精准把握并巧妙运用消费者心理。今天&#xff0c;我们就来探讨4个关键策略&#xff0c;结合选品建议&#xff0c;帮助电商人…

欠债还钱 天经地义李秘书专业写作:这是一篇涉借款纠纷的民事起诉状

欠债还钱 天经地义 李秘书专业写作&#xff1a;这是一篇涉借款纠纷的民事起诉状 &#xff08;精品范文&#xff09; 民 事 诉 状 原告&#xff1a;李某军&#xff0c;男&#xff0c;现年46岁&#xff0c;无业&#xff0c;现住黑龙江省大兴安岭地区漠河市汉东路阳和门。 被告…

儿童可以用挖耳勺吗?六大挑选妙招需掌握!

耳垢会随着人体的运动量增加&#xff0c;1岁以下的儿童运动量较小&#xff0c;可以不用经常掏耳朵&#xff0c;但随着年龄增长&#xff0c;耳垢也会增多&#xff0c;这时可以适当地给儿童掏耳勺。但掏耳朵的工具要选对&#xff0c;目前市面上不少宣称是儿童专用的掏耳工具&…

汇凯金业:清洗黄金首饰的方法

黄金首饰&#xff0c;作为我们日常生活中常见的饰品&#xff0c;不仅能够提升我们的穿着品味&#xff0c;更彰显了我们的经济实力。然而&#xff0c;黄金首饰戴久了&#xff0c;难免会出现一些污渍&#xff0c;甚至失去原有的光泽。这时候&#xff0c;很多人会选择去专业的珠宝…

【MySQL】SQL语句执行流程

目录 一、连接器 二、 查缓存 三、分析器 四、优化器 五、执行器 一、连接器 学习 MySQL 的过程中&#xff0c;除了安装&#xff0c;我们要做的第一步就是连接上 MySQL 在一开始我们都是先使用命令行连接 MySQL mysql -h localhost -u root -p 你的密码 使用这个命令…

Qt (9)【Qt窗口 —— 如何在窗口中创建菜单栏和工具栏】

阅读导航 引言一、Qt窗口简介二、如何在窗口中创建菜单栏1. 创建菜单栏2. 在菜单栏中添加菜单3. 创建菜单项4. 在菜单项之间添加分割线 三、如何在窗口中创建工具栏1. 创建工具栏2. 设置停靠位置3. 设置浮动属性4. 设置移动属性 引言 在上一篇文章中&#xff0c;我们深入探讨了…

掌握 BM25:深入了解算法及其在 Milvus 中的应用

我们可以通过 Milvus 轻松实现 BM25 算法&#xff0c;将文档和查询转化为稀疏向量。然后&#xff0c;这些稀疏向量可用于向量搜索&#xff0c;根据特定查询找到最相关的文档。 信息检索算法在搜索引擎中非常重要&#xff0c;可确保搜索结果与用户的查询相关。 想象一下&#…

Vue2中watch与Vue3中watch对比和踩坑

上一节说到了 computed计算属性对比 &#xff0c;虽然计算属性在大多数情况下更合适&#xff0c;但有时也需要一个自定义的侦听器。这就是为什么 Vue 通过 watch 选项提供了一个更通用的方法&#xff0c;来响应数据的变化。当需要在数据变化时执行异步或开销较大的操作时&#…

conda环境下在pycharm中调试scrapy项目

前提条件 已经创建好了conda环境已经安装好了scrapy框架项目初始化完成 编写一个爬虫脚本 import scrapyclass StackOverflowSpider(scrapy.Spider):name stackoverflowstart_urls [http://stackoverflow.com/questions?sortvotes]def parse(self, response):print("…

阿一网络安全实战演练之利用 REST URL 中的服务器端参数污染

所需知识 要解决这个实验室问题&#xff0c;您需要了解以下内容&#xff1a; 如何确定用户输入是否包含在服务器端的 URL 路径或查询字符串中。如何使用路径遍历序列尝试更改服务器端请求。如何查找 API 文档。 这些内容在我们的 API 测试学院主题中有涵盖。 进入实验室 研…

终极解决CondaValueError: Malformed version string ‘~’: invalid character(s)问题

conda 创建环境时出现&#xff1a; Solving environment: failed CondaValueError: Malformed version string ‘~’: invalid character(s)以下两种方法都不行时&#xff1a; 原因一&#xff1a; 添加的镜像源中&#xff0c;清华镜像源是https&#xff08;错误&#xff09;&a…

软件测试 - 测试分类(静态测试、动态测试、白盒测试、黑盒测试、灰盒测试、单元测试、集成测试、系统测试、验收测试等)

一、为什么要对软件测试进⾏分类&#xff1f; 软件测试是软件⽣命周期中的⼀个重要环节&#xff0c;具有较⾼的复杂性&#xff0c;对于软件测试&#xff0c;可以从不同的⻆度 加以分类&#xff0c;使开发者在软件开发过程中的不同层次、不同阶段对测试⼯作进⾏更好的执⾏和管理…