JQuery的“易受攻击:css类选择器”是什么意思?

信息安全 xss css jQuery
2021-08-13 05:25:58

我主要是网络安全的初学者。前几天我遇到了关于 JQuery 1.3.2 如何容易受到 CSS 选择器和位置哈希(来源)的攻击。

我了解 XSS 的工作原理,也知道 CSS 选择器是什么。但是我真的不明白 Vulnerable with CSS class selector 是什么意思。这是否意味着每当一个站点使用 JQuery 1.3.2 时,是否可以对其进行 XSS 攻击?如果可以,有哪些可能?

如果有人能解释这在现实世界的场景中究竟是如何工作的,我将非常感激。

1个回答

在 jQuery 中,您可以使用相同的简写方式指定 CSS 选择器和 HTML 代码。

这是一个选择器:

$('#some-thing')

这是立即得到评估的 HTML:

$('<svg onload=alert(1)>')

这是一个真实的代码示例,用于从位置哈希(a 之后的 URL 部分#)解析选择器:

var x = $('#' + window.location.hash.substr(1));
x.addClass('highlighted').find('div').show();

它取自这个问题,并且在这个 SO thread中(危险地)推荐了一种类似的方法

看到它的问题了吗?作者的意图是允许一个用户控制的 CSS 选择器,但是如果您将受影响的站点打开为https://example.com/#<svg onload=alert(1)>,您最终会得到这个模棱两可的选择器:

$('#<svg onload=alert(1)>');

旧版本的 jQuery 将其作为 HTML 代码运行,从而产生 XSS 缺陷,因为一旦创建 DOM 节点,JS 事件处理程序将立即执行。但是,较新的版本决定必须将不以尖括号开头的字符串解析为选择器,从而减轻该缺陷。

文档

如果一个字符串作为参数传递给$(),jQuery 会检查该字符串以查看它是否看起来像 HTML(即,它以 开头<tag ... >)。如果不是,则字符串被解释为选择器表达式,如上所述。但是如果字符串看起来是一个 HTML 片段,jQuery 会尝试按照 HTML 的描述创建新的 DOM 元素。

您可以在讨论中阅读有关此行为如何更改为bug #9521的信息。

您链接的页面仅说明了每个版本易受攻击的选择器类型。