滥用jQuery进行CSS动力计时攻击

CSS时正式攻击

Arthur Saftnes去年做了一些很棒的研究使用jQuery CSS选择器进行的定时攻击实际上,这可能是我去年最喜欢的博客文章。

这是网站通过位置的常见设计模式。beplay体育能用吗jQuery $函数

$(location.hash);

哈希可能受到攻击者的控制,这用于导致XSS,但是许多年前的jQuery修补了。亚瑟发现,理论上仍然可以使用正时攻击来利用这种模式。您可以反复调用JQuery的:有选择器并衡量从目标页面推断内容的性能影响。这将这些情况从无法解释的XSS转变为读取几乎所有输入值。

我决定跟进这项研究,以发现使用此技术的现实世界脆弱性。我首先修改了Burp的动态分析寻找在内部执行的jQuery选择器哈希奇活动,并扫描了许多网站。beplay体育能用吗我寻找的原因哈希奇事件是攻击的限制;为了衡量性能的影响,您需要重复更改哈希(Hash)以对所有可能的字符进行二进制搜索,仅在哈希奇事件大火。发布的原始技术的另一个局限性是,您需要该网站来解码哈希,因为现在大多数现代浏览器URL编码它 - 但是我找到了解决此问题的方法。

我找到了一些确实使用过的错误赏金网站位置与jQuery$函数a哈希奇事件,但是发现的大多数网站确实没有任何有趣的数据要窃取。不过有一个例外,红色帽子在一个内部使用jQuery选择器哈希奇事件并具有帐户功能。查看该站点,它没有任何输入可以从中窃取数据,但是在登录时确实显示了您的全名。亚瑟的原始攻击CSS属性选择器但是全名不在任何输入元素中,因此我无法使用它们。

我浏览了所有jQuery CSS选择器,发现了:包含选择器找到包含指定字符串的元素。不幸的是:包含不允许您查看字符串的开始或结尾,因此我需要另一种提取值的方法。我考虑使用该空间作为提取名字的锚点,但问题是在Firefox上,该空间将被编码。幸运的是,Backslash不是编码URL,因此我可以使用CSS十六进制逃逸。起初我尝试了\ 20但这会破坏选择器,因为下一个角色将继续六角逃逸,但是如果我用零填充逃生,这将确保使用正确的CSS逃生。我修改了Arthur的代码以改善Make_Selector功能以使用空间:

函数make_selector(前缀,字符,firstNameflag,firstName){
return carame.split(“”)。映射(c =>!firstNameflag?slot_selector +
selector_template.replace('{}',c + prefix +'\\ 000020'):slow_selector +
selector_template.replace(“ {}”,prefix.replace( / /,'\\ 000020') + c))
。加入(”,”);
}

上面的代码使用六角形编码空间向后扫描名称。我使用firstNameFlag来决定它是名字还是第二个名称,当找到标志的名字的大写字母时,它开始匹配第二个名称,但这次使用名字作为前缀。和空间。

if(!firstNameflag && /[a-z ]/.test(名称){
firstNameFlag = true;
名称 +='';
回溯= 0;
继续;
}

我遇到的另一个问题是,您无法使用实际选择器中的空间,因为它被编码为URL,而HEX Escapes在这里无法使用。我花了很多时间尝试构建一个没有空间的选择器,并且仍然具有可测量的性能影响。最后,我想出了以下选择器:

const slow_selector =“*:has(*:has(*):parent:has*):parent:has(*):parent:has*has(*):parent:has has(*)):parent:parent:has(“;”;
const selector_template =“。account-user:contains('{}'))”;

这会引起性能影响,但比在CSS后代选择器。然后,我的下一个问题是如何确定您已达到名称的结尾。就像我之前说的那样:包含选择器无法查看字符串的末端。因此,我想出的唯一方法是连续寻找6个背带。

漏洞现在已经解决,但我将在下面分享原始POC,以便您可以看到我使用的代码:

firefox Access.redhat.com jQuery选择器POC

我还录制了一个视频,以便您可以在行动中看到它:

XSS

回到所有文章

相关的研究

每日Swig的推荐故事beplay2018官网