(手动)翻译自部分维基百科

XSS(Cross-site scripting,跨站脚本)攻击是Web应用程序中一种典型的安全性漏洞。XSS允许攻击者向网页注入客户端脚本从而使其他浏览者运行此脚本。这种脚本可能被攻击者用来绕过同源策略(same-origin policy)。根据赛门铁克的数据,大约84%的网站安全漏洞是XSS漏洞。白帽公司HackerOne在2017年报道称XSS仍然是主要威胁载体。XSS既可以造成相当的麻烦,也可以导致严重的安全风险,这取决于网站处理的数据的敏感性与网站主实施的安全缓解措施的性质。

背景

由于安全性的需要,同源策略限制了网页访问URI(Uniform Resource Identifier,资源统一标识符) Scheme或主机名、端口号不同的权限。

[scheme]://[host]:[port]/[path]?[query]

XSS攻击者利用已知漏洞向Web应用、服务器或插件系统注入恶意内容,由于所有内容都由信任源发出,恶意脚本以用户的身份从浏览器取得了访问、控制、修改敏感页面、cookies与验证信息的权限。

微软的安全工程师在2000年2月引入了XSS的术语,用以描述从一个不相关的攻击网站加载被攻击的第三方网页应用,以一种运行攻击者准备好的在目标站点中的JavaScript代码片段的方式攻击(利用反射或非持续XSS漏洞)。这种定义逐渐扩展到了持续性和非JavaScript语言的攻击。

XSS漏洞早在上世纪90年代被发现和利用。包括Twitter,Facebook,MySpace,Youtube与Orkut等网站都中过招。现在XSS漏洞已经超过了缓冲区溢出成为最常见的安全漏洞,2007年的部分研究者称,至少约68%的网站可能对XSS攻击是透明的。

种类

XSS没有标准化的分类,但大部分专家将其分为非持续性XSS攻击与持续性XSS攻击。也有分为传统的XSS攻击(由服务器代码漏洞导致的)与基于DOM的XSS攻击(在客户端代码中注入脚本)。

非持续性XSS(反射)

非持续XSS是目前最基础的web漏洞。这种漏洞发生在web客户端提交数据时,通常包含在HTTP请求参数中。没有经过验证和编码的用户提交数据可能会导致HTML注入。搜索引擎是一个常见的例子,因为搜索页面会显示用户输入的内容,如果不进行合适的编码,将会导致非持续性XSS。

持续性XSS(存储)

持续性XSS具有更大的破坏力。由于恶意代码保存在服务器上,任何浏览网页的用户都会受影响。典型的例子是留言板,如果没有经过验证和编码,用户提交的HTML内容将反映到其他用户浏览的页面。如果这是一个匿名留言版,恶意内容可能会收集用户信息。

因为存储在服务器上,这种攻击不需要主动寻找受害者,相比一个个地诱导覆盖面更大,尤其在在社交网络中传播(XSS蠕虫)。

服务端对比基于DOM的XSS

历史上XSS漏洞首先在服务端渲染页面的Web应用中被发现,但随着JavaScript与AJAX等技术发展,非持续性XSS的一个子类——基于DOM的XSS攻击出现,这种攻击不需要经由网站的服务器,而由JavaScript代码在用户端实现。JQuery在2011年曾曝出基于DOM的XSS漏洞,而这种漏洞的预防方法与一般的XSS预防方法相近,区别在于由JavaScript代码执行预防策略(如输入验证和字符转义)。一些JavaScript框架内建了预防XSS攻击的策略——如Angular.JS。

Self-XSS

Self-XSS不是严格意义上的XSS,它欺骗用户自己执行代码,尽管Web应用并没有漏洞。这种XSS的风险与常规XSS相当。

Mutated XSS(mXSS)

这种攻击方式可谓很天才了,它指的是攻击者利用一段看似安全的代码(绕过预防XSS的策略)进行XSS攻击,这些代码将会被浏览器修改或重新渲染,这使得预防策略难以生效。一个例子是在CSS的font-family中利用引号与引号的转义字符改变浏览器渲染的结果。