点击劫持
威胁描述
点击劫持(Clickjacking)是一种视觉欺骗攻击,攻击者通过在受害者网站上覆盖一层透明或半透明的页面,诱导用户点击看似正常的按钮或链接,实际上却触发了攻击者精心设计的恶意操作。
工作原理
- 攻击者创建一个包含iframe的网页,iframe指向受害者网站
- 设置iframe为透明或半透明,并精确定位到受害者网站上的特定按钮或链接
- 在iframe上方放置诱导性内容,吸引用户点击
- 用户点击时,实际上点击的是iframe中的受害者网站按钮,执行了攻击者预设的操作
示例代码
攻击页面示例
<!DOCTYPE html>
<html>
<head>
<title>点击劫持示例</title>
<style>
#target-website {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
opacity: 0.01; /* 几乎透明 */
z-index: 10;
}
#decoy-content {
position: absolute;
top: 100px;
left: 100px;
z-index: 5;
background: white;
padding: 20px;
border: 1px solid black;
}
</style>
</head>
<body>
<iframe id="target-website" src="https://victim-website.com"></iframe>
<div id="decoy-content">
<h1>免费礼品!</h1>
<p>点击下方按钮领取免费礼品</p>
<button>立即领取</button> <!-- 这个按钮位置与受害者网站上的重要按钮重合 -->
</div>
</body>
</html>
防御措施
1. X-Frame-Options头部
服务器端设置X-Frame-Options响应头,防止页面被嵌入到iframe中:
X-Frame-Options: DENY
或只允许特定域名嵌入:
X-Frame-Options: SAMEORIGIN
2. Content-Security-Policy (CSP) 头部
使用CSP的frame-ancestors指令:
Content-Security-Policy: frame-ancestors 'self';
3. JavaScript防御
在页面中添加JavaScript代码检测是否被嵌入到iframe中:
if (top !== window) {
// 页面被嵌入到iframe中
// 可以选择隐藏内容或跳转到警告页面
document.body.innerHTML = '<h1>警告:此页面无法在框架中显示</h1>';
}
最佳实践
- 始终设置X-Frame-Options头部为DENY或SAMEORIGIN
- 对于关键操作(如支付、修改密码),额外添加用户确认步骤
- 结合使用CSP和X-Frame-Options提供多层防御
- 定期进行安全测试,确保防御措施有效
- 保持Web应用程序和依赖库的更新,以防止已知漏洞被利用