跳到主要内容

中间人攻击与防御

什么是中间人攻击

中间人攻击(MitM)发生在攻击者拦截并可能修改通信双方之间的信息而不被察觉的情况下。这种攻击允许攻击者窃取敏感信息、篡改数据或注入恶意内容,对网络通信安全构成严重威胁。

攻击原理

  1. 拦截网络通信:攻击者通过各种手段(如ARP欺骗、DNS劫持、恶意Wi-Fi热点等)拦截通信双方的网络流量
  2. 伪装身份:攻击者伪装成通信双方信任的第三方,使双方误以为是在直接通信
  3. 窃取或篡改数据:攻击者可以读取、修改或注入通信内容
  4. 维持隐蔽:攻击通常在通信双方不知情的情况下进行

常见攻击场景

  • 公共Wi-Fi攻击:在公共Wi-Fi网络中拦截用户通信
  • ARP欺骗:在局域网中欺骗主机的MAC地址映射
  • DNS劫持:篡改DNS解析结果,将用户引导至恶意网站
  • SSL剥离:将HTTPS连接降级为HTTP连接
  • 证书伪造:伪造SSL/TLS证书欺骗客户端

防御措施

  1. 使用HTTPS/TLS:加密传输通道,确保数据 confidentiality和完整性
  2. 证书验证:验证服务器证书的有效性、颁发机构和有效期
  3. 避免使用公共Wi-Fi:尽量避免在公共网络中传输敏感信息
  4. 使用VPN:通过虚拟专用网络建立安全连接
  5. 启用HTTP严格传输安全(HSTS):强制使用HTTPS连接
  6. 使用证书固定:将服务器证书指纹固定在客户端
  7. 警惕钓鱼网站:仔细检查网站URL和证书信息

Node.js防御示例

配置HTTPS服务器

const https = require('https');
const fs = require('fs');
const express = require('express');
const app = express();

// 读取SSL证书和私钥
const options = {
key: fs.readFileSync('path/to/private-key.pem'),
cert: fs.readFileSync('path/to/certificate.pem'),
ca: fs.readFileSync('path/to/ca-cert.pem'), // 可选,用于验证客户端证书
requestCert: true, // 可选,要求客户端提供证书
rejectUnauthorized: true, // 拒绝无效证书
};

// 路由
app.get('/', (req, res) => {
res.send('Secure Hello World!');
});

// 创建HTTPS服务器
https.createServer(options, app).listen(443, () => {
console.log('HTTPS server running on port 443');
});

启用HSTS

const express = require('express');
const helmet = require('helmet');
const app = express();

// 启用HSTS
app.use(helmet.hsts({
maxAge: 31536000, // 1年
includeSubDomains: true,
preload: true
}));

// 重定向HTTP到HTTPS
app.use((req, res, next) => {
if (req.secure) {
next();
} else {
res.redirect(`https://${req.headers.host}${req.url}`);
}
});

app.listen(80, () => {
console.log('HTTP server running on port 80');
});

Nginx防御示例

server {
listen 443 ssl;
server_name example.com;

ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

# 启用HSTS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

# 其他配置...
}

# 重定向HTTP到HTTPS
server {
listen 80;
server_name example.com;
return 301 https://$server_name$request_uri;
}

检测与响应

  • 使用网络监控工具:如Wireshark、tcpdump等监控网络流量
  • 证书验证:定期检查服务器证书的有效性
  • 异常检测:监控异常的网络行为,如大量重定向、未知的证书颁发机构等
  • 应急响应:制定中间人攻击应急响应计划,包括断开可疑连接和通知用户

最佳实践

  • 对所有网站和API实施HTTPS
  • 定期更新SSL/TLS证书
  • 避免在通信中传输明文敏感信息
  • 教育用户识别安全连接的标志(如浏览器地址栏的锁图标)
  • 在客户端实现证书固定,防止证书伪造攻击
  • 对关键应用使用双向认证(客户端和服务器都验证对方证书)