跳到主要内容

点击劫持

威胁描述

点击劫持(Clickjacking)是一种视觉欺骗攻击,攻击者通过在受害者网站上覆盖一层透明或半透明的页面,诱导用户点击看似正常的按钮或链接,实际上却触发了攻击者精心设计的恶意操作。

工作原理

  1. 攻击者创建一个包含iframe的网页,iframe指向受害者网站
  2. 设置iframe为透明或半透明,并精确定位到受害者网站上的特定按钮或链接
  3. 在iframe上方放置诱导性内容,吸引用户点击
  4. 用户点击时,实际上点击的是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>';
}

最佳实践

  1. 始终设置X-Frame-Options头部为DENY或SAMEORIGIN
  2. 对于关键操作(如支付、修改密码),额外添加用户确认步骤
  3. 结合使用CSP和X-Frame-Options提供多层防御
  4. 定期进行安全测试,确保防御措施有效
  5. 保持Web应用程序和依赖库的更新,以防止已知漏洞被利用