我主要是网络安全的初学者。前几天我遇到了关于 JQuery 1.3.2 如何容易受到 CSS 选择器和位置哈希(来源)的攻击。
我了解 XSS 的工作原理,也知道 CSS 选择器是什么。但是我真的不明白 Vulnerable with CSS class selector 是什么意思。这是否意味着每当一个站点使用 JQuery 1.3.2 时,是否可以对其进行 XSS 攻击?如果可以,有哪些可能?
如果有人能解释这在现实世界的场景中究竟是如何工作的,我将非常感激。
我主要是网络安全的初学者。前几天我遇到了关于 JQuery 1.3.2 如何容易受到 CSS 选择器和位置哈希(来源)的攻击。
我了解 XSS 的工作原理,也知道 CSS 选择器是什么。但是我真的不明白 Vulnerable with CSS class selector 是什么意思。这是否意味着每当一个站点使用 JQuery 1.3.2 时,是否可以对其进行 XSS 攻击?如果可以,有哪些可能?
如果有人能解释这在现实世界的场景中究竟是如何工作的,我将非常感激。
在 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的信息。
您链接的页面仅说明了每个版本易受攻击的选择器类型。