欢迎来到阳君的频道,这里作为网络安全漏洞的第一篇,希望是一个好的开头吧
一、概述
中间人攻击(Man-in-the-Middle Attack,简称 MITM)是网络安全领域最常见、最易实施且危害极大的攻击方式之一,无需复杂技术门槛,可轻松劫持流量、窃取敏感信息,广泛存在于个人上网、企业办公、移动终端等各类场景,也是护网行动、企业安全审计中高频排查的漏洞类型,同时更是 Java 安全开发中需重点规避的风险点。
二、原理
关于原理呢,其实也就是攻击者在中间转发流量,所以就可以进行偷窥和修改
简单类比:A 要给 B 寄一封信,攻击者偷偷拦截信件,拆开查看内容,甚至修改信件内容后,重新封好寄给 B;同时拦截 B 回复 A 的信件,同样查看、篡改后再寄给 A,A 和 B 都以为自己在和对方直接通信,实则所有数据都被攻击者掌控。
从技术层面拆解 2 个核心实现逻辑
链路劫持:攻击者通过 ARP 欺骗、DNS 欺骗、路由欺骗等方式,让通信双方的流量强制经过自己的设备(比如伪装成网关),实现流量拦截;
数据伪造:拦截流量后,通过伪造通信数据包、伪造证书(HTTPS 场景)等方式,绕过通信验证,实现数据窃取或篡改。
三、中间人攻击真实攻击场景
1、个人日常场景(最易中招)
- 公共 WiFi 场景:在咖啡店、高铁站、商场等公共 WiFi 环境中,攻击者搭建仿冒 WiFi(名称与正规 WiFi 相似,无需密码或简单密码),用户连接后,所有上网流量(浏览记录、账号密码、支付信息)都被攻击者拦截;
- 家庭 / 办公网络场景:攻击者通过 ARP 欺骗,伪装成家庭 / 办公网络的网关,劫持同一局域网内所有设备的流量,窃取微信、支付宝、邮箱等敏感账号信息。
2、企业办公场景(护网高频)
- 内网中间人攻击:攻击者接入企业内网(比如通过弱密码登录内网设备、物理接入办公网络),通过 ARP 欺骗劫持内网流量,窃取企业员工账号密码、内部办公数据、客户信息;
- 业务通信劫持:劫持企业与客户、企业与合作伙伴之间的通信链路,篡改业务数据(比如篡改订单金额、合同内容),或窃取商业机密(比如报价单、核心技术文档);
- 物联网设备场景:劫持企业内网中的监控、打印机、智能终端等物联网设备,获取设备控制权,或通过设备流量渗透到企业核心网络。
3、移动终端场景
- 手机流量劫持:通过伪基站、DNS 欺骗,劫持手机移动数据(4G/5G)流量,窃取手机短信、验证码、APP 登录信息;
- 蓝牙 / 近场通信场景:在近距离内,通过蓝牙中间人攻击,劫持手机与智能设备(比如智能手表、耳机)的通信,获取个人隐私数据。
四、中间人攻击的漏洞危害
1、个人级
- 敏感信息泄露:账号密码(微信、支付宝、邮箱、银行卡)、个人隐私(聊天记录、位置信息、照片)、支付信息(银行卡号、验证码)被窃取;
- 信息被篡改:收到的短信、邮件被篡改,导致误操作(比如误转账、误点击恶意链接);
- 设备被控制:手机、电脑被植入恶意程序,沦为攻击者的 “肉鸡”,进一步窃取更多数据。
2、企业级
- 核心数据泄露:客户信息、商业机密、财务数据、内部决策文档被窃取,导致企业经济损失、声誉受损;
- 业务中断 / 异常:核心业务通信被劫持、数据被篡改,导致订单异常、交易失败、系统瘫痪,直接影响企业正常运营;
- 合规风险:根据《网络安全法》《数据安全法》,企业因中间人攻击导致数据泄露,需承担行政处罚、民事赔偿,甚至刑事责任;
- 内网渗透入口:中间人攻击可作为企业内网渗透的 “突破口”,攻击者通过劫持流量,进一步挖掘内网漏洞,实现内网全面控制(护网行动中高频攻击链路)。
五、修复方案
1、个人层面防护
- 拒绝连接不明公共 WiFi,优先使用手机移动数据,或连接加密的、官方认证的 WiFi;
- 所有敏感操作(转账、登录账号),优先使用 HTTPS 协议的网站 / APP,避免使用 HTTP 协议;
- 手机、电脑安装安全软件,开启 ARP 防护、DNS 防护功能,及时拦截欺骗攻击;
- 不随意点击陌生链接、下载陌生 APP,避免设备被植入恶意程序。
2、Java 代码层防护
- 强制使用 HTTPS 协议,规避 HTTP 明文通信漏洞
// Spring Boot 配置类示例:强制HTTPS跳转 @Configuration public class HttpsConfig { @Bean public ServletWebServerFactory servletContainer() { TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() { @Override protected void postProcessContext(Context context) { SecurityConstraint securityConstraint = new SecurityConstraint(); securityConstraint.setUserConstraint("CONFIDENTIAL"); SecurityCollection collection = new SecurityCollection(); collection.addPattern("/*"); securityConstraint.addCollection(collection); context.addConstraint(securityConstraint); } }; tomcat.addAdditionalTomcatConnectors(redirectConnector()); return tomcat; } // HTTP端口(80)跳转至HTTPS端口(443) private Connector redirectConnector() { Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL); connector.setScheme("http"); connector.setPort(80); connector.setSecure(false); connector.setRedirectPort(443); return connector; } }- 验证服务器证书,防止证书伪造(HTTPS 场景)
// Java 客户端证书验证示例(避免跳过证书验证) public class HttpsCertVerify { public static void main(String[] args) throws Exception { // 加载信任的根证书(企业可使用自己的CA证书) TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); ks.load(new FileInputStream("truststore.jks"), "password".toCharArray()); tmf.init(ks); // 配置SSL上下文,启用证书验证 SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, tmf.getTrustManagers(), new SecureRandom()); // 使用配置好的SSL上下文发起HTTPS请求 HttpsURLConnection connection = (HttpsURLConnection) new URL("https://xxx.com/api").openConnection(); connection.setSSLSocketFactory(sslContext.getSocketFactory()); // 禁止跳过主机名验证 connection.setHostnameVerifier((hostname, session) -> { // 验证主机名与证书匹配(可根据实际需求调整) return hostname.equals("xxx.com"); }); // 后续请求逻辑... } }- 接口通信添加签名,防止数据篡改
// 接口签名工具类(Java) public class SignUtil { // 密钥(前后端/服务间统一,妥善保管,避免泄露) private static final String SECRET_KEY = "your_secure_secret_key"; // 生成请求签名(参数+时间戳+密钥) public static String generateSign(Map<String, String> params, long timestamp) { // 1. 排序参数(避免参数顺序导致签名不一致) List<String> keys = new ArrayList<>(params.keySet()); Collections.sort(keys); // 2. 拼接参数+时间戳+密钥 StringBuilder sb = new StringBuilder(); for (String key : keys) { sb.append(key).append("=").append(params.get(key)).append("&"); } sb.append("timestamp=").append(timestamp).append("&secret=").append(SECRET_KEY); // 3. SHA256加密生成签名 return DigestUtils.sha256Hex(sb.toString()); } // 验证签名合法性 public static boolean verifySign(Map<String, String> params, long timestamp, String sign) { // 1. 校验时间戳(防止签名被复用,比如有效期5分钟) if (System.currentTimeMillis() - timestamp > 5 * 60 * 1000) { return false; } // 2. 重新生成签名,与传入的签名对比 String generateSign = generateSign(params, timestamp); return generateSign.equals(sign); } }- 规避 Java 网络编程中的中间人攻击漏洞
禁止使用 HTTPURLConnection 发起 HTTP 明文请求,优先使用HttpsURLConnection;
避免使用不安全的 Socket 通信,如需使用,启用SSL/TLS加密;
不随意跳过证书验证、主机名验证,不使用弱加密算法(比如 DES、MD5),优先使用AES、SHA256等强加密算法。
3、企业级整体防护(贴合护网、国企合规要求)
(1)网络层面防护(核心,拦截链路劫持)
- 部署 ARP 防火墙、DNS 防火墙,拦截 ARP 欺骗、DNS 欺骗攻击,防止流量被劫持;
- 划分网络分区,内网与外网隔离、核心业务区与普通办公区隔离,限制攻击者的横向移动;
- 所有网络设备(路由器、交换机)启用端口安全,禁止不明设备接入内网,定期排查内网异常设备;
- 部署流量监测系统(比如 Wireshark、科来网络分析系统),实时监控网络流量,及时发现中间人攻击异常(比如大量 ARP 欺骗包、异常流量转发)。
(2)设备与系统层面防护
- 所有服务器、终端设备,及时更新系统补丁、安全软件,关闭不必要的端口和服务;
- 企业内网设备(电脑、服务器、物联网设备)统一配置静态 ARP,绑定网关 IP 与 MAC 地址,防止 ARP 欺骗;
- 部署终端安全管理系统,禁止终端设备接入不明 WiFi、开启热点,防止内网流量泄露。
(3)合规与人员培训
- 制定网络安全管理制度,明确员工上网规范,禁止在公共 WiFi 环境中处理企业敏感业务;
- 定期开展网络安全培训,讲解中间人攻击的危害、识别方法、防护技巧,提升员工安全意识;
- 定期开展安全审计、渗透测试,排查中间人攻击漏洞,及时整改,符合等保 2.0、数据安全法等合规要求(护网行动重点检查项)。