绝大多数 XSS 毛病可以使用 Burp Suite 的 Web 毛病扫描器快速、可靠地找到。
手动测试反射型和存储型 XSS 通常涉及将一些简朴唯一的输入(例如短的字母数字字符串)提交到应用程序的每个入口点,识别在 HTTP 响应中返回提交输入的每个位置,并单独测试每个位置以确定精心构造的输入是否可用于实行任意 JavaScript。通过这种方式,您可以确定 XSS 发生的上下文并选择符合的有效载荷来利用它。
手动测试由 URL 参数引起的基于 DOM 的 XSS 涉及类似的过程:将一些简朴唯一的输入放在参数中,使用欣赏器的开发人员工具在 DOM 中搜索此输入,并测试每个位置以确定它是否可利用。然而,其他范例的 DOM XSS 更难检测。要在非基于 URL 的输入(例如document.cookie)或非基于 HTML 的吸取器(如setTimeout)中查找基于 DOM 的毛病,没有什么可以替换审查 JavaScript 代码,这可能非常耗时。Burp Suite 的 Web 毛病扫描器结合了 JavaScript 的静态和动态分析,以可靠地主动检测基于 DOM 的毛病。 XSS 攻击有哪些范例?
XSS 攻击重要有三种范例。这些是:
很多存储型的 XSS 毛病可以使用 Burp Suite 的 Web 毛病扫描程序找到。
手动测试存储型跨站脚本(XSS)毛病可能具有挑衅性。您需要测试所有相干的“入口点”,攻击者可控制的数据可通过这些入口点进入应用程序的处理过程,以及所有“出口点”,在这些点上数据可能会出现在应用程序的响应中。
进入应用程序处理过程的入口点包括:
基于 DOM 的 XSS(也称为 DOM XSS)是指应用程序包含一些客户端 JavaScript,这些 JavaScript 以不安全的方式处理来自不受信任的来源的数据,通常是将数据写回 DOM。
在下面的示例中,应用程序使用一些 JavaScript 从输入字段中读取值,并将该值写入 HTML 中的元素:
var search = document.getElementById('search').value;
You searched for: <img src=1 onerror='/* Bad stuff here... */'>
复制代码
在典型情况下,输入字段将从 HTTP 哀求的一部门(例如 URL 查询字符串参数)填充,从而允许攻击者以与反射型 XSS 雷同的方式使用恶意 URL 进行攻击。 在本节中将介绍基于 DOM 的跨站点脚本 (DOM XSS),解释怎样查找 DOM XSS 毛病,并讨论怎样利用具有差异源和吸取器的 DOM XSS。 什么是基于 DOM 的跨站点脚本?
基于 DOM 的 XSS 毛病通常出现在 JavaScript 从攻击者可控制的来源(如 URL)获取数据并将其通报给支持动态代码实行的吸取器(如 eval() 或 innerHTML)时。这使攻击者可以或许实行恶意 JavaScript,这通常允许他们挟制其他用户的帐户。
要提供基于 DOM 的 XSS 攻击,您需要将数据放入源中,以便将其传播到吸取器并导致任意 JavaScript 的实行。
DOM XSS 最常见的源是 URL,通常通过 window.location 对象访问。攻击者可以构造一个链接,将受害者发送到易受攻击的页面,该页面的查询字符串和 URL 的片段部门包含有效负载。在某些情况下,例如,当定位 404 页面或运行 PHP 的网站时,有效负载也可以放置在路径中。
有关 sources 和 sink 之间的污染流的详细解释,请参考基于 DOM 的毛病文章。 8.1 怎样测试基于 DOM 的 XSS
大多数 DOM XSS 毛病都可以使用 Burp Suite 的 Web 毛病扫描程序快速可靠地找到。要手动测试基于 DOM 的跨站点脚本,您通常需要使用带有开发人员工具(如 Chrome)的欣赏器。您需要依次处理每个可用 source,并单独测试每个 source。 8.1.1 测试 HTML 吸取器
要在 HTML 吸取器中测试 DOM XSS,请将随机字母数字字符串放入源中(例如 location.search),然后使用开发人员工具检查 HTML 并查找字符串的表现位置。请注意,欣赏器的 “View source” 选项不实用于 DOM XSS 测试,因为它没有考虑 JavaScript 在 HTML 中实行的更改。在 Chrome 的开发者工具中,你可以使用 Control+F(或 MacOS 上的 Command+F)在 DOM 中搜索字符串。
对于字符串在 DOM 中出现的每个位置,您需要标识上下文。根据此上下文,您需要优化您的输入以查看其处理方式。例如,如果您的字符串出现在双引号属性中,则实验在字符串中注入双引号,以查看是否可以跳出该属性。
请注意,欣赏器在 URL 编码方面的举动有所差异,Chrome、Firefox 和 Safari 会对location.search和location.hash进行 URL 编码,而 IE11 和 Microsoft Edge(Chromium 之前的版本)不会对这些来源进行 URL 编码。如果你的数据在被处理之前进行了 URL 编码,那么 XSS 攻击不太可能成功。 8.1.2 测试 JavaScript 实行汇点 sinks
为基于 DOM 的 XSS 测试 JavaScript 实行 sink 有点困难。使用这些 sink,你的输入不一定会出现在 DOM 中的任何位置,因此你无法搜索它。相反,您需要使用 JavaScript 调试器来确定是否以及怎样将输入发送到吸取器。
对于每个可能的来源(例如location),您起首需要在页面的 JavaScript 代码中找到引用该来源的情况。在 Chrome 的开发者工具中,您可以使用 Control+Shift+F(或 MacOS 上的 Command+Alt+F)来搜索页面的所有 JavaScript 代码以查找源代码。
找到读取源的位置后,可以使用 JavaScript 调试器添加断点并遵循源值的使用方式。您可能会发现源被分配给其他变量。如果是这种情况,您将需要再次使用 search 函数来跟踪这些变量,并查看它们是否被通报到 sink。当您找到正在分配源自源的数据的吸取器时,您可以使用调试器检查值,方法是将鼠标悬停在变量上,以便在将其发送到吸取器之前表现其值。然后,与 HTML 吸取器一样,您需要优化输入,以查看是否可以成功提供 XSS 攻击。 8.1.3 使用 DOM Invader 测试 DOM XSS
在现实情况中识别和利用 DOM XSS 可能是一个繁琐的过程,通常需要你手动欣赏复杂的、颠末压缩的 JavaScript。然而,如果你使用 Burp 的欣赏器,你可以利用其内置的 DOM Invader 扩展,它可以为你完成很多艰巨的工作。 8.2 利用具有差异源和吸取器的 DOM XSS
原则上,如果存在数据可以从源传播到吸取器的可实行路径,则网站容易受到基于 DOM 的跨站点脚本的攻击。在实践中,差异的源和吸取器具有差异的属性和举动,这可能会影响可利用性,并确定需要哪些技能。此外,网站的脚本可能会对数据进行验证或其他处理,在实验利用毛病时必须考虑这些处理。有多种与基于 DOM 的毛病相干的吸取器。
document.write 吸取器实用于script元素,因此您可以使用简朴的有效负载,如下所示:
如果使用像 AngularJS 这样的框架,可能无需尖括号或变乱即可实行 JavaScript。当一个站点在 HTML 元素上使用ng-app属性时,它将由 AngularJS 处理。在这种情况下,AngularJS 将在可以直接出现在 HTML 中或属性内的双花括号内实行 JavaScript。 8.2.2 DOM XSS 与反射和存储数据相结合
一些纯粹基于 DOM 的毛病仅存在于单个页面中。如果一个脚本从 URL 读取一些数据并将其写入伤害的吸取点,那么该毛病完全在客户端。
然而,来源并不范围于欣赏器直接袒露的数据——它们也可以来自网站。例如,网站通常在服务器的 HTML 响应中反映 URL 参数。这通常与普通的跨站脚本攻击(XSS)相干,但也可能导致反射型 DOM XSS 毛病。
在反射型 DOM XSS 毛病中,服务器处理来自哀求的数据,并将数据回显到响应中。反射的数据可能被放入 JavaScript 字符串字面量中,大概放入 DOM 中的数据项中,例如表单字段。页面上的脚本随后以不安全的方式处理反射的数据,最终将其写入伤害的吸取点。
eval('var data = "reflected string"');
复制代码
网站也可能在服务器上存储数据并在其他地方反映出来。在存储型 DOM XSS 毛病中,服务器从一个哀求吸取数据,存储它,然后在后续响应中包含该数据。后续响应中的脚本包含一个吸取点,然后以不安全的方式处理数据。
在这里,第一个反斜杠意味着第二个反斜杠被按字面解释,而不是作为特殊字符。这意味着引号现在被解释为字符串终止符,因此攻击成功。
一些网站通过限制允许使用的字符来使跨站脚本攻击(XSS)更加困难。这可以在网站层面上进行,也可以通过摆设一个 Web 应用防火墙(WAF)来防止你的哀求到达网站。在这些情况下,你需要实验其他绕过这些安全措施来调用函数的方法。一种方法是使用带有非常处理程序的throw语句。这使你可以或许在不使用括号的情况下将参数通报给函数。以下代码将alert()函数分配给全局非常处理程序,并且throw语句将1通报给非常处理程序(在这种情况下是alert)。最终结果是alert()函数以1作为参数被调用。
onerror=alert;throw 1
复制代码
有多种方法可以使用此技能调用不带括号的函数。 9.3.3 使用 HTML 编码
当 XSS 上下文是引号标记属性(例如变乱处理程序)中的一些现有 JavaScript 时,可以利用 HTML 编码来绕过一些输入过滤器。
当欣赏器分析出响应中的 HTML 标记和属性后,在进一步处理标记属性值之前,它将对其进行 HTML 解码。如果服务器端应用程序制止或清理成功进行 XSS 利用所需的某些字符,则通常可以通过对这些字符进行 HTML 编码来绕过输入验证。
例如,如果 XSS 上下文如下:
<a href="#" onclick="... var input='controllable data here'; ...">