XSS跨站脚本攻击

1. 概述

XSS(Cross-Site Scripting)是一种常见的Web安全漏洞,攻击者通过在Web应用中插入恶意的脚本代码,让用户在浏览器端执行这些脚本代码,从而获取用户的敏感信息或者执行未授权的操作。

2. 攻击种类

根据攻击的来源,XSS 攻击可分为 反射型、存储型 和 DOM-Based 型三种。

类型 存储区 插入点
反射型 URL HTML
存储型 服务端数据库 HTML
DOM-Based型 服务端数据库/客户端存储/URL 前端 JavaScript

名词说明:

  • 存储区:恶意代码存放的位置
  • 插入点:由谁取得恶意代码,并插入到网页上

反射型:

攻击者将恶意代码注入到Web应用的URL参数中,当用户点击一个恶意链接时,Web应用会解析URL参数中的恶意代码并执行。

攻击步骤:

  1. 攻击者把带有恶意脚本代码参数的 URL 地址发送给用户
  2. 用户点击此链接
  3. 服务器端获取请求参数并且直接使用,服务器反射回结果页面

说明:

  • 反射型 XSS 攻击是一次性的,必须要通过用户点击链接才能发起
  • 一些浏览器如 Chrome 其内置了一些 XSS 过滤器,可以防止大部分反射型 XSS 攻击
  • 反射型 XSS 其实就是服务器没有对恶意的用户输入进行安全处理就直接反射响应内容,导致恶意代码在浏览器中执行的一种 XSS 漏洞

存储型:

攻击者将恶意代码存储在服务器上,当其他用户访问这些被污染的页面时,恶意代码会被执行。

攻击步骤:

  1. 攻击者将恶意脚本代码上传或存储到漏洞服务器
  2. 服务器把恶意脚本保存到服务器
  3. 当正常客户访问服务器时,服务器会读取恶意数据并且直接使用
  4. 服务器会返回含有恶意脚本的页面

注意:

  • 这种攻击常见于带有用户保存数据的网站功能,如论坛发帖、商品评论、用户私信等。

修复:

  • 服务端一般不会轻易对大量已存数据再编辑。需要对新写入数据修正存储逻辑。前端做好正确的 编码转义。
类型 反射型 存储型
持久性 非持久 持久化(存储在服务器)
触发时机 需要用户点击 不需要用户交互也可以触发
危害 危害较小 危害更大

DOM Based 型:

攻击者通过修改页面的DOM结构,插入恶意代码,并通过某些方式触发这些代码执行,从而达到攻击的目的。

攻击步骤:

  1. 用户打开带有恶意的链接
  2. 浏览器在 DOM 解析的时候直接使用恶意数据
  3. 用户中招
  4. 常见的触发场景就是在修改 innerHTML、outerHTML、document.write 的时候

3. 攻击方法总结

  • 在 HTML 中内嵌的文本那种,恶意内容以 script 标签形成注入
  • 在内联的 JavaScript 中,拼接的数据突破了原本的限制(字符串、变量、方法名等)
  • 在标签属性中,恶意内容包含引号,从而突破属性值的限制,注入其他属性或者标签
  • 在标签的 href、src 等属性中,包含 javascript: 等可执行代码
  • 在 onload、onerror、onclick 等事件中,注入不受控制代码
  • 在 style 属性和标签汇总,包含类似 background-image: url("javascript:...") 的代码(新版本浏览器已经可以防范)
  • 在 style 属性和标签中,包含类似 expression(...) 的 CSS 表达式代码(新版本浏览器已经可以防范)

4. 防止XSS攻击

  • 输入验证:对用户输入的数据进行验证,仅接受符合特定格式的输入。例如,限制输入只能是纯文本,不允许包含任何HTML标签或脚本代码。
  • 输出过滤:将用户的输入进行过滤,去除或替换掉特殊字符和潜在的恶意代码。可以使用一些工具或框架提供的安全函数或过滤器来过滤输出。
  • 转义HTML:将用户输入中的特殊字符转义为其对应的 HTML 实体,例如 < 转义为 <
  • 使用内容安全策略(Content Security Policy,CSP):CSP是一种安全机制,允许网站所有者定义允许加载的资源来源,限制执行内嵌脚本的范围,从而减少XSS攻击的成功率。
  • 使用HTTP Only标志:通过将Cookie中的HTTP Only标志设置为true,可以防止恶意脚本通过JavaScript访问和窃取用户的Cookie信息。

总结起来,防止XSS攻击的关键是在开发过程中充分认识和理解XSS漏洞的原理,并采取适当的安全措施来过滤和转义用户输入的内容,以确保安全可控的应用程序。及时进行安全测试和漏洞扫描也是非常必要的。

参考资料

JavaScript Guidebook xss
阮一峰 Content Security Policy 入门教程

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部