文章目录加载中

Web安全:中间人攻击

# 原理和防范

它也被称为浏览器劫持、web 劫持。可以往 web 中添加一些第三方厂商的 dom 元素,或者重定向到另外的钓鱼站。

常用手段有 2 种:

  1. 网络报文传输过程中对其截获、篡改(过程中)
  2. 客户端发起 http 请求之前或者得到 response 之后对数据篡改(开头、结尾)

防范方式就是使用 https 协议,一套在传输层 TCP 和应用层 HTTP 之间的 TLS 协议。

# https 交互细节

以下内容摘自:《深入理解 Web 安全:中间人攻击》

简单地说,一次 https 网络请求在建立开始阶段具有以下的一个“握手”流程:

首先,客户端向服务端发起一个基于 https 协议的网络请求,这相当于告诉它:“我希望得到一个安全加密的网页,你可别直接把明文扔过来!”

服务端接收到这个网络请求后,了解到客户端的提出的这种加密的诉求,于是先把一个公钥和网站的 https 证书发送给客户端。

客户端随后要做两件事,一是验证证书的合法性与时效性,如果颁发证书的机构客户端这边不承认或者证书中标明的过期时间已经过了,这都会导致客户端浏览器报出那个红叉子,chrome 浏览器还会直接拦截掉这个请求,除非用户点详情->继续,否则不会与该网站的服务器进行后续沟通,这相当于一个强交互的提醒,告诉用户“我拿到的证书有问题,这网站可能是个冒牌货,你要看仔细了!”

如果以上两步验证无误,那么客户端会先生成一个随机秘钥,利用刚刚拿到的公钥给自己要访问的 url+这个随机秘钥进行加密,把密文再次发往服务端。

当服务端收到客户端传过来的密文之后,会通过自己手里持有的一个私钥对密文进行解密。注意,这里提到的私钥和刚刚的公钥是一对儿秘钥,这是一个典型的非对称加密,加密和解密分别使用两把不同的钥匙,这也保证了在此场景下的安全性。

此时,服务端要将真正的 html 网页文本发给你了,它会利用解密得到的随机秘钥对网页文本内容进行加密,将密文发给客户端。

客户端拿到真正的 html 报文之后,就用自己刚才生成的那个随机秘钥进行解密,然后就得到了跟普通 http 请求时一样的一个网页文本了,在这之后就像往常那样解析、渲染、加载更多资源……

对于真正要传输的 html 文本,实际上是使用刚刚提到的这个随机秘钥进行了一次对称加密,因为上锁和开锁的钥匙实际上是一模一样的。

本文来自心谭博客:xin-tan.com,经常更新web和算法的文章笔记,前往github查看目录归纳:github.com/dongyuanxin/blog