1. 网络安全学会
  2. 跨站脚本

跨站脚本

在本节中,我们将解释什么是跨站点脚本,描述跨站点脚本漏洞的不同种类,并阐明如何查找和防止跨站点脚本。

什么是跨站点脚本(XSS)?

跨站点脚本(也称为XSS)是一个web安全漏洞,攻击者可以利用该漏洞来破坏用户与易受攻击的应用程序之间的交互。 它允许攻击者规避相同的源策略,该策略旨在将不同的网站彼此隔离。 跨站点脚本漏洞通常允许攻击者冒充受害者用户,执行用户能够执行的任何操作以及访问用户的任何数据。 如果受害用户在应用程序内具有特权访问权限,则攻击者可能能够完全控制应用程序的所有功能和数据。

XSS如何工作?

跨站点脚本通过操纵易受攻击的网站来工作,以便它将恶意JavaScript返回给用户。 当恶意代码在受害者的浏览器中执行时,攻击者可以完全破坏他们与应用程序的交互。

Cross-site scripting

XSS攻击有哪些类型?

XSS攻击有三种主要类型。 这些是:

  • 反映的XSS,其中恶意脚本来自当前HTTP请求。
  • 存储的XSS,其中恶意脚本来自网站的数据库。
  • 基于DOM的XSS,该漏洞存在于客户端代码而不是服务器端代码中。

反映的跨站点脚本

反映的XSS是最简单的跨站点脚本。 当应用程序在HTTP请求中接收数据并将该数据以不安全的方式包含在即时响应中时,就会出现这种情况。

这是反映的XSS漏洞的简单示例:

https://insecure-website.com/status?message=All+is+well.

<p>Status: All is well.</p>

该应用程序不执行数据的任何其他处理,因此攻击者可以轻松地构造如下攻击:

https://insecure-website.com/status?message=<script>/*+Bad+stuff+here...+*/</script>

<p>Status: <script>/* Bad stuff here... */</script></p>

如果用户访问由攻击者构造的URL,则攻击者的脚本将在该用户与应用程序的会话的上下文中在用户的浏览器中执行。 此时,脚本可以执行用户可以访问的任何操作并检索任何数据。

Stored cross-site scripting

当应用程序从不可信来源接收数据并将该数据以不安全的方式包含在其以后的HTTP响应中时,就会出现存储的XSS(也称为持久或二级XSS)。

有问题的数据可以通过HTTP请求提交给应用程序; 例如,对博客帖子的评论,聊天室中的用户昵称或客户订单上的联系方式。 在其他情况下,数据可能来自其他不受信任的来源; 例如,显示通过SMTP接收的消息的Webmail应用程序,显示社交媒体帖子的营销应用程序或显示来自网络流量的数据包数据的网络监视应用程序。

这是一个存储的XSS漏洞的简单示例。 留言板应用程序使用户可以提交消息,并显示给其他用户:

<p>Hello, this is my message!</p>

该应用程序不执行任何其他数据处理,因此攻击者可以轻松发送一条攻击其他用户的消息:

<p><script>/* Bad stuff here... */</script></p>

基于DOM的跨站点脚本

当应用程序包含一些客户端JavaScript时,通常会通过将数据写回到DOM中,从而以不安全的方式处理来自不受信任源的数据,从而出现基于DOM的XSS(也称为DOM XSS)。

在下面的示例中,应用程序使用一些JavaScript从输入字段读取值并将该值写入HTML中的元素:

var search = document.getElementById('search').value;
var results = document.getElementById('results');
results.innerHTML = 'You searched for: ' + search;

如果攻击者可以控制输入字段的值,则他们可以轻松构造一个恶意值,该恶意值导致其自己的脚本执行:

You searched for: <img src=1 onerror='/* Bad stuff here... */'>

在典型情况下,输入字段将从HTTP请求的一部分(例如URL查询字符串参数)填充,从而允许攻击者以与所反映的XSS相同的方式使用恶意URL进行攻击。

XSS可以用来做什么?

利用跨站点脚本漏洞的攻击者通常能够:

  • 假扮或冒充受害者用户。
  • 进行用户可以执行的任何操作。
  • 读取用户能够访问的任何数据。
  • 捕获用户的登录凭据。
  • 对网站进行虚拟修饰。
  • 将木马功能注入网站。

XSS漏洞的影响

XSS攻击的实际影响通常取决于应用程序的性质,其功能和数据以及受感染用户的状态。 例如:

  • 在小册子软件应用程序中,所有用户都是匿名的,所有信息都是公开的,其影响通常很小。
  • 在保存敏感数据(例如银行交易,电子邮件或医疗记录)的应用程序中,影响通常会很严重。
  • 如果受感染的用户在应用程序中具有较高的特权,那么影响通常将是至关重要的,从而使攻击者可以完全控制易受攻击的应用程序并危害所有用户及其数据。

如何查找和测试XSS漏洞

使用Burp Suite的Web漏洞扫描程序可以快速,可靠地找到绝大多数XSS漏洞。

手动测试反射和存储的XSS通常涉及向应用程序的每个入口点提交一些简单的唯一输入(例如短字母数字字符串)。 标识HTTP响应中返回提交的输入的每个位置; 并分别测试每个位置,以确定是否可以使用适当制作的输入来执行任意JavaScript。

手动测试由URL参数引起的基于DOM的XSS涉及一个类似的过程:将一些简单的唯一输入放入参数中,使用浏览器的开发人员工具在DOM中搜索此输入,并测试每个位置以确定是否可利用。 但是,其他类型的DOM XSS较难检测。 要在非基于URL的输入(如document.cookie)或非基于HTML的接收器(如setTimeout)中查找基于DOM的漏洞,没有替代方法来复查JavaScript代码,因为这非常耗时。 Burp Suite的web漏洞扫描程序结合了JavaScript的静态和动态分析,可以可靠地自动检测基于DOM的漏洞。

内容安全政策

内容安全策略(CSP)是一种浏览器机制,旨在减轻跨站点脚本和其他一些漏洞的影响。 如果使用CSP的应用程序包含类似XSS的行为,则CSP可能会阻止或阻止利用此漏洞。 通常,可以避开CSP以利用潜在的漏洞。

悬挂标记注入

如何防止XSS攻击

在某些情况下,防止跨站点脚本编写很简单,但根据应用程序的复杂性及其处理用户可控制的数据的方式,阻止跨站脚本的编写可能会困难得多。

通常,有效地防止XSS漏洞可能涉及以下措施的组合:

  • 到达时过滤输入。 在接收到用户输入时,应根据预期或有效输入尽可能严格地进行过滤。
  • 在输出上编码数据。 在HTTP响应中输出用户可控制的数据时,请对输出进行编码,以防止将其解释为活动内容。 根据输出上下文,这可能需要应用HTML,URL,JavaScript和CSS编码的组合。
  • 使用适当的响应标头。 为了防止HTTP响应中不包含任何HTML或JavaScript的XSS,可以使用Content-Type和X-Content-Type-Options标头来确保浏览器以您期望的方式解释响应。
  • 内容安全政策。 作为最后一道防线,您可以使用内容安全策略(CSP)来降低仍然发生的任何XSS漏洞的严重性。

有关跨站点脚本编制的常见问题

XSS漏洞有多常见?XSS漏洞非常普遍,并且XSS可能是最常见的web安全漏洞。

XSS攻击有多常见?很难获得有关实际XSS攻击的可靠数据,但是,与其他漏洞相比,它的利用频率可能较低。

XSS和CSRF有什么区别?XSS涉及使网站返回恶意JavaScript,而CSRF涉及诱使受害用户执行他们不打算执行的操作。

XSS和SQL注入有什么区别?XSS是针对其他应用程序用户的客户端漏洞,而SQL注入是针对应用程序的数据库的服务器端漏洞。

如何防止PHP中的XSS? 使用允许的字符白名单过滤输入内容,并使用类型提示或类型转换。 对于HTML上下文,请使用htmlentities和ENT_QUOTES来转义您的输出;对于JavaScript上下文,请使用JavaScript Unicode转义。

如何防止Java中的XSS?使用允许的字符白名单过滤输入内容,并使用Google Guava之类的库对HTML上下文的输出进行HTML编码,或者对JavaScript上下文使用JavaScript Unicode转义。

Daily Swig中有关跨站点脚本的故事