什么是跨站点脚本?

跨站点脚本攻击会诱使 Web 浏览器运行恶意代码。

学习目标

阅读本文后,您将能够:

  • 了解跨站点脚本
  • 定义客户端代码
  • 描述跨站点脚本攻击的后果
  • 解释反射性和持久性跨站点脚本之间的区别
  • 列出防护跨站点脚本的策略

相关内容


想要继续学习吗?

订阅 TheNET,这是 Cloudflare 每月对互联网上最流行见解的总结!

参阅 Cloudflare 的隐私政策,了解我们如何收集和处理您的个人数据。

复制文章链接

什么是跨站点脚本?

跨站点脚本 (XSS) 是一种漏洞利用,攻击者将代码附加到合法网站上,当受害者加载网站时,代码就会执行。恶意代码可以通过几种方式插入。最常见的是添加到 URL 的末尾,或者直接发布到显示用户生成的内容的页面上。用更专业的术语来说,跨站点脚本是一种客户端代码注入攻击。

跨站点脚本攻击

什么是客户端代码?

客户端代码是在用户计算机上运行的 JavaScript 代码。就网站而言,客户端代码通常是在浏览器加载网页后由网络浏览器执行的代码。这与服务器端代码相反 - 服务器端代码在主机的 Web 服务器上执行。客户端代码对于交互式网页非常有用;可以让交互式内容的运行速度更快、更可靠,因为用户的计算机不必在每次交互时都与 Web 服务器进行通信。基于浏览器的游戏是热门的客户端代码平台,因为客户端代码可以确保游戏顺利运行,而不考虑连接问题。

在客户端运行的代码在现代 Web 开发中非常流行,并在大多数现代网站中得到利用。由于跨站点代码是现代 Web 的基本内容,因此跨站点脚本已成为最常见的网络安全漏洞之一;跨站点脚本攻击已袭击了 YouTube、Facebook 和 Twitter 等知名站点。

什么是跨站点脚本示例?

跨站点脚本攻击的一个有用示例常见于具有未验证评论论坛的网站。在这种情况下,攻击者发布评价,其中包含包裹在“<script></script>”标记中的可执行代码。这些标记告诉 Web 浏览器将标记之间的所有内容解释为 JavaScript 代码。评价出现在页面上之后,任何其他用户加载网站时,其 Web 浏览器将执行脚本标记之间的恶意代码,而用户则成为攻击的受害者。

攻击者如何使用跨站点脚本造成伤害?

JavaScript 跨站点脚本攻击很受攻击者欢迎,因为 JavaScript 可以访问一些敏感数据,用于身份盗窃和其他恶意目的。例如,JavaScript 可以访问 cookie*,而攻击者可以使用 XSS 攻击来窃取用户的 cookie 并在网上冒充他们。JavaScript 还可以创建 HTTP 请求,这些请求可用于将数据(例如,被盗的 cookie)发回给攻击者。此外,客户端 JavaScript 还可以帮助攻击者访问包含地理位置坐标、网络摄像头数据和其他敏感信息的 API。

典型的跨站点脚本攻击流程如下:

  1. 受害者加载网页,恶意代码复制用户的 cookie
  2. 然后,代码将 HTTP 请求发送到攻击者的 Web 服务器,请求主体中带有窃取的 cookie。
  3. 然后,攻击者即可使用这些 Cookie 来假冒该网站上的用户,以进行社会工程攻击,甚至访问银行帐号或其他敏感数据。

*Cookie 是保存在用户计算机上的临时登录凭据。例如,当用户登录到 Facebook 之类的网站时,该网站为他们提供一个 cookie,这样,如果他们关闭浏览器窗口并在当日晚些时候回到 Facebook,将自动由该 cookie 进行身份验证,而无需再次登录。

跨站点脚本有哪些类型?

最常见的两种跨站点脚本攻击类型是反射式跨站点脚本和持久性跨站点脚本。

反射式跨站点脚本

这是最常见的跨站点脚本攻击。通过反射攻击,恶意代码被添加到网站 URL 的末尾;通常,这是一个合法的、值得信赖的网站。当受害者在 Web 浏览器中加载此链接时,浏览器将执行注入到 url 中的代码。攻击者通常使用某种形式的社交工程来诱骗受害者单击链接。

例如,用户可能会收到一封看起来正常的电子邮件,声称信息来自银行。该电子邮件将要求他们在银行的网站上采取一些措施,并提供一个链接。该链接可能看起来像这样:

http://legitamite-bank.com/index.php?user=<script>这里是一些恶意代码!</script>

尽管该 URL 的第一部分看起来很安全,并且包含受信任网站的域名,但是注入 URL 末尾的代码可能是恶意的。

持久性跨站点脚本

持久性跨站点脚本发生在允许用户发布其他用户将看到的内容的网站上,例如评论论坛或社交媒体网站。如果站点未正确验证用户生成的内容,则攻击者可能插入页面加载时其他用户的浏览器将执行的代码。例如,攻击者可能访问一个在线约会网站,在他们的个人资料中包含以下内容:

“嗨!我叫 Dave,我喜欢在沙滩上散步,并且<script>这里是恶意代码</script>”

任何试图访问 Dave 的个人资料的用户都将成为 Dave 的持久性跨站点脚本攻击的受害者。

如何防止跨站点脚本

没有哪个单一策略可以防护跨站点脚本,不同类型的 Web 应用程序需要不同级别的保护。有许多保护措施可以采取,如下所述。

如果可能,避免在输入中使用 HTML - 避免持久性跨站点脚本攻击的一种非常有效的方法是防止用户将 HTML 发布到表单输入中。还有其他一些方案,例如 markdown 和 WYSIWYG 编辑器,可以使用户无需使用 HTML 即可创建丰富的内容。

验证输入 - 验证表示实施规则,以防止用户将数据发布到不符合特定条件的表单中。例如,要求用户输入“姓氏”的输入应具有验证规则,仅允许用户提交由字母数字字符组成的数据。验证规则也可以设置为拒绝跨站点脚本中常用的任何标记或字符,例如“<script>”标记。

清理数据 - 清理数据类似于验证,但是它发生在数据发布到 Web 服务器之后、显示给其他用户之前。有几种在线工具可以清除 HTML 并筛除恶意代码注入。

采取 cookie 安全措施 - Web 应用程序还可以为其 cookie 处理设置特殊规则,以防护通过跨站点脚本攻击进行的 cookie 盗窃。Cookies 可以绑定到特定的 IP 地址以防止跨站点脚本攻击者访问。另外,可以创建规则以完全阻止 JavaScript 访问 cookie。

设置 WAF 规则 - WAF 也可以配置为强制执行规则,以防止反射性跨站点脚本。这些 WAF 规则采用的策略将阻止对服务器的奇怪请求,包括跨站点脚本攻击。Cloudflare WAF 提供交钥匙安装服务,可保护 Web 应用程序免受跨站点脚本攻击、DDoS 攻击SQL 注入和其他常见威胁的侵害。