「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」
前言
最近有测试同事问我,为什么你打的包可以捉包,线上的包就不能捉包呢?我曾经写过一篇 Charles安装和配置HTTPS证书,是说如何去使用Charles来实现捉包的,那今天我们就来聊聊为什么Charles如何捉包
捉包原理
正常来说我们客户端和服务端进行连接,然后开始传输收据。那现在Charles作为中间人,就变成了客户端 <-> Charles <-> 服务端了。
Charles相当于在客户端给服务器端发消息的时候拦截请求,然后伪装成客户端与服务器进行通信。同理,服务器返回数据给客户端的时候,也会拦截然后伪装成服务器与客户端进行通信。
所以为了数据安全,现在一般都是用HTTPS进行传输数据。
那我们就会安装Charles根证书到手机上,然后进行信任,也可以拦截HTTPS传输数据,那时如何做到的呢?
下面我们就描写一下流程:
-
当客户端对服务端建立连接的时候,因为设置了
代理,就会被Charles拦截到服务器返回的证书A,这个证书是包含给客服端的公钥A,私钥A是留在服务端。 -
拦截到证书后,
Charles就会动态生成一张伪造证书B,用的是Charles的公钥B,代替服务端的证书A来发给客户端。 -
客户端收到
Charles证书B,因为我们手机是信任Charles根证书的,根据信任链,所以会通过验证通过。 -
验证通过后,客户端生成一个对称加密的
密钥X,然后用Charles公钥B加密后传送给服务端。当然这步也会被Charles拦截。 -
这时候,
Charles就可以用自己的私钥B来解密,就能得到对称加密的密钥X。 -
拿到
密钥X后,就可以解析出真实数据出来。再用原来服务端的公钥A对密钥X进行加密,传输给服务端。 -
服务端用拿到后用
私钥A进行解密,得到对称加密的密钥x。
就这样,Charles就神不知鬼不觉的实现获取数据,甚至可以删改数据,客户端和服务端都不会发现异常,这就是中间人攻击。
流程图
疑问
那我们如何能防止中间人攻击呢?
中间人通过掉包服务器传来的公钥,进而得到了密钥X。根本原因是客户端无法确认收到的公钥是不是服务端的公钥。
那下一篇文章,我们就来聊聊如何防止Charles捉包。