术语表

SSL 剥离 (SSL Stripping)

最后核实

定义

SSL 剥离是一种中间人攻击,攻击者截获本应把用户引向 HTTPS 的跳转或链接,让用户一直停留在明文 HTTP 上。

SSL 剥离由 Moxie Marlinspike 在 2009 年提出,并发布了 sslstrip 工具。处在网络路径上的攻击者(例如同一个公共 Wi-Fi 中)截获用户发出的第一个明文请求,因为用户通常直接输入 example.com 而不带协议。攻击者不把服务器的 HTTPS 跳转转交给用户,而是自己去连 HTTPS 站点,再用 HTTP 把页面转给用户,同时把页面里的 https:// 链接全部改成 http://。整个过程中用户和攻击者之间从未建立 TLS 连接,自然也不会出现证书警告。

为什么重要

它不需要破解任何密码算法,利用的是 TLS 开始之前那一步明文通信。服务器端的 301 跳转无济于事,因为这个响应本身就在攻击者手里。防御只能放在浏览器侧:HSTS 让浏览器在请求发出前就在内部升级为 HTTPS,HSTS 预加载则连首次访问也覆盖。浏览器的 HTTPS 优先、仅 HTTPS 模式也能进一步降低风险。SSL 剥离是中间人攻击的一种具体形式,也是协议降级攻击的近亲。企业在评估办公网和访客 Wi-Fi 风险时,通常会把它列为基础检查项。

例子

用户   -> http://example.com           被攻击者截获
攻击者 -> https://example.com          与服务器建立真实的 TLS 连接
攻击者 -> 用户:页面的 HTTP 副本,所有 https:// 链接被改为 http://

检查站点是否具备防护:

curl -sI http://example.com  | grep -i '^location'
curl -sI https://example.com | grep -i strict-transport-security

常见误区

  • 把 HTTP 跳转到 HTTPS 就能防 SSL 剥离。 跳转本身走的是 HTTP,攻击者不转发即可;只有 HSTS 能让浏览器根本不发出那个明文请求。
  • 没有登录页的网站没什么可剥离的。 任何通过 HTTP 提供的页面都可能被注入脚本、广告或伪造的下载链接。
  • 用户会看到证书错误。 不会出现任何错误,用户看到的只是一个 http:// 地址,而很多人从不留意。

延伸阅读