欢迎来到阳君的频道这里作为网络安全漏洞的第一篇希望是一个好的开头吧一、概述中间人攻击Man-in-the-Middle Attack简称 MITM是网络安全领域最常见、最易实施且危害极大的攻击方式之一无需复杂技术门槛可轻松劫持流量、窃取敏感信息广泛存在于个人上网、企业办公、移动终端等各类场景也是护网行动、企业安全审计中高频排查的漏洞类型同时更是 Java 安全开发中需重点规避的风险点。二、原理关于原理呢其实也就是攻击者在中间转发流量所以就可以进行偷窥和修改简单类比A 要给 B 寄一封信攻击者偷偷拦截信件拆开查看内容甚至修改信件内容后重新封好寄给 B同时拦截 B 回复 A 的信件同样查看、篡改后再寄给 AA 和 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(MapString, String params, long timestamp) { // 1. 排序参数避免参数顺序导致签名不一致 ListString 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(MapString, 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、数据安全法等合规要求护网行动重点检查项。