HTTPS中的混合内容(Mixed Content)攻击原理与防御详解
一、 描述
混合内容(Mixed Content)指的是一个初始通过安全的HTTPS连接加载的网页,在加载过程中包含了通过不安全的HTTP协议加载的子资源(如脚本、图片、样式表、iframe、音视频等)。根据子资源对页面安全性的影响程度,混合内容主要分为两类:
-
被动/显示型混合内容:这类资源通常不影响页面其他部分的安全状态,攻击者即使篡改这些资源,其危害范围也相对有限。主要包括:
- 图片(``)
- 音频(``)
- 视频(``)
- 对象(``, 当不包含代码时)。
-
主动/脚本型混合内容:这类资源拥有极高的权限,可以直接访问和修改页面的DOM、Cookie、其他资源等。如果被中间人攻击者篡改,可以完全控制页面行为,危害极大。主要包括:
- 脚本(``)
- 样式表(``)
- iframe(``)
- 通过XMLHttpRequest、Fetch API等发起的AJAX请求。
<object>、<embed>、<applet>等可能执行代码的资源。
混合内容攻击就是攻击者利用网页中存在混合内容的漏洞,在用户与服务器之间的网络通道上进行中间人攻击,拦截或篡改那些通过HTTP明文传输的资源,从而实施窃听、会话劫持、内容篡改、恶意代码注入等一系列攻击。
二、 解题过程(原理与防御)循序渐进讲解
步骤1:理解HTTPS的保护范围与混合内容的漏洞点
HTTPS(HTTP over TLS/SSL)协议通过加密和身份认证,为客户端与服务器之间的通信提供了机密性和完整性保护。但是,这种保护是基于连接的。当用户访问 https://example.com 时,浏览器与 example.com 服务器之间建立了一个加密的TLS隧道。
- 漏洞产生:如果这个安全页面中有一个资源标签写的是
src="http://cdn.example.com/script.js",浏览器在加载这个资源时,会发起一个全新的、不安全的HTTP请求。这个请求独立于原始的HTTPS连接,没有任何加密保护。
步骤2:攻击者如何利用混合内容(攻击原理)
攻击者通常存在于用户与目标服务器之间的网络路径上,例如:
- 恶意的公共WiFi热点。
- 被入侵的路由器或ISP网络。
- 本地网络中的攻击者。
攻击流程如下:
- 用户访问一个HTTPS网站(例如
https://bank.com)。 - 浏览器解析页面,发现其中包含一个通过HTTP加载的关键脚本:
<script src="http://static.bank.com/auth.js"></script>。 - 由于是HTTP请求,攻击者可以进行中间人劫持。他/她可以:
- 窃听:被动地读取
auth.js文件的内容,可能泄露敏感逻辑或配置。 - 篡改:将
auth.js的内容替换为恶意脚本。例如,恶意脚本可以:- 监听用户的登录表单输入,窃取用户名和密码。
- 修改页面上的转账目标账户和金额。
- 窃取用户的会话Cookie,从而劫持用户会话。
- 在页面上注入键盘记录器。
- 窃听:被动地读取
- 浏览器接收到被篡改的恶意脚本,并无条件地执行它。由于该脚本来源于“受信任”的
static.bank.com子域(尽管协议不安全),同源策略不会阻止它访问bank.com主站的DOM和数据。 - 结果:虽然主页面是通过HTTPS加载的,给人以安全的假象,但攻击者已经通过不安全的子资源通道完全控制了页面行为,用户的所有敏感操作和数据都泄露给了攻击者。
步骤3:现代浏览器的混合内容阻止策略
为了缓解风险,现代浏览器实现了逐步强化的混合内容阻止策略:
- 被动内容警告:早期浏览器对被动混合内容(如图片)只显示“不安全”锁图标警告,但仍会加载资源。
- 主动内容阻止:对主动混合内容(如脚本),现代浏览器默认阻止加载。在开发者工具控制台会看到类似错误:
Mixed Content: The page at 'https://...' was loaded over HTTPS, but requested an insecure script 'http://...'. This request has been blocked; the content must be served over HTTPS. - 全面阻止:现在,主流浏览器(如Chrome, Firefox, Edge)默认阻止所有混合内容,包括被动内容。它们会自动将HTTP请求升级为HTTPS请求(如果服务器支持),如果升级失败则阻止加载。
步骤4:检测与发现混合内容
作为开发者或安全人员,你需要主动发现网站中的混合内容:
- 浏览器开发者工具:
- 控制台:直接显示混合内容阻止错误。
- 安全面板:在Chrome DevTools的
Security标签页中,可以查看当前页面的安全状态,明确列出混合内容资源。 - 网络面板:查看每个请求的
Protocol列,识别http/1.1或http/2的请求(HTTPS页面中应该都是h2或http/1.1over TLS)。
- 自动化扫描工具:
- 使用OWASP ZAP、Burp Suite、Nuclei等安全扫描器对网站进行爬取和测试,它们能有效识别混合内容。
- 内容安全策略:通过部署CSP并启用
upgrade-insecure-requests指令,可以观察浏览器上报的混合内容违规报告。
步骤5:修复与防御混合内容
防御的核心是确保所有资源都通过HTTPS加载。
-
更新资源链接:
- 将网页中所有资源的URL协议(
http://)显式地修改为https://。 - 或者使用协议相对URL(Protocol-relative URL):将
src="http://cdn.com/1.js"改为src="//cdn.com/1.js"。这样浏览器会根据当前页面协议自动选择HTTP或HTTPS。注意:在需要严格HTTPS的页面中,更推荐显式使用https://。
- 将网页中所有资源的URL协议(
-
服务器端修复:
- 确保你的资源服务器(CDN、图片服务器、静态文件服务器)支持并正确配置了HTTPS。
- 对于你自己域名的资源,确保其证书有效且配置正确。
-
利用HSTS:
- 部署HTTP严格传输安全头:
Strict-Transport-Security: max-age=31536000; includeSubDomains。 - 这能强制浏览器在未来一段时间内,对你网站的所有请求都使用HTTPS,即使手动输入
http://也会被转换。includeSubDomains确保所有子域也强制HTTPS,防止子域资源被降级。
- 部署HTTP严格传输安全头:
-
部署内容安全策略:
- 使用CSP头来提供额外的、可报告的保护:
Content-Security-Policy: upgrade-insecure-requests- 指令:浏览器会自动将页面中所有HTTP请求升级为HTTPS请求,并阻止无法升级的资源。这是修复混合内容最直接有效的方法之一。
Content-Security-Policy: block-all-mixed-content- 指令:明确指示浏览器阻止所有混合内容(主动和被动)。与
upgrade-insecure-requests相比,此指令是直接阻止而非尝试升级。
- 指令:明确指示浏览器阻止所有混合内容(主动和被动)。与
- 在部署最终策略前,可以先使用
Content-Security-Policy-Report-Only模式,收集混合内容违规报告,帮助定位所有问题资源。
- 使用CSP头来提供额外的、可报告的保护:
总结:
混合内容攻击破坏了HTTPS提供的整体安全性。防御的关键在于**“全站HTTPS”原则,确保主文档和所有子资源都通过加密通道传输。通过结合更新链接、服务器HTTPS支持、HSTS强制、以及CSP策略**,可以彻底杜绝混合内容漏洞,为用户提供真正端到端的安全浏览体验。