发布:2019年5月22日在13:15 UTC
更新:2019年5月29日在12:10 UTC
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
我还录制了一个视频,以便您可以在行动中看到它: