## 什么是HTTP劫持? 在用户的客户端与其要访问的服务器经过网络协议协调后,二者之间建立了一条专用的数据通道,用户端程序在系统中开放指定网络端口用于接收数据报文,服务器端将全部数据按指定网络协议规则进行分解打包,形成连续数据报文。 ## HTTP网络劫持的原理 在用户的浏览器连上被访问的网站服务器,发送了HTTP请求后,运营商的路由器会首先收到此次HTTP请求,之后运营商路由器的旁路设备标记此TCP连接为HTTP协议,之后可以抢在网站服务器返回数据之前发送HTTP协议的302代码进行下载软件的劫持,浏览器收到302代码后就会跳转到错误的软件下载地址下载软件了,随后网站服务器的真正数据到达后反而会被丢弃。或者,旁路设备在标记此TCP连接为HTTP协议后,直接返回修改后的HTML代码,导致浏览器中被插入了运营商的广告,随后网站服务器的真正数据到达后最终也是被丢弃。 从上述原理中看出,如果需要进行HTTP劫持,首先需要进行标记:如果是HTTP协议,那么进行劫持,否则不进行劫持。 常见的http劫持有DNS劫持和内容劫持。 ### DNS劫持 在浏览器输入如下域名 `www.test.com`,那浏览器要打开这个网站,首先要解析域名`www.test.com`,结果这个域名被黑客劫持到他的私人服务器1.2.3.4,结果我的浏览器和他 的私人服务器1.2.3.4建立SSL连接,他的服务器1.2.3.4也和www.test.com建立SSL的连接,我收发的数据都通过他的服务器1.2.3.4中转,也就是黑客的服务器1.2.3.4相当于一个https代理服务器,结果我收发的所有数据,他都能看到。这种攻击就是中间人攻击,跳转1.2.3.4就是DNS劫持,DNS被劫持到一个非源端的IP上。 1. 中间人截取客户端发送给服务器的请求,然后伪装成客户端与服务器进行通信;将服务器返回给客户端的内容发送给客户端,伪装成服务器与客户端进行通信。 2. 通过这样的手段,便可以获取客户端和服务器之间通信的所有内容。 3. 使用中间人攻击手段,必须要让客户端信任中间人的证书,如果客户端不信任,则这种攻击手段也无法发挥作用。 ### 内容劫持 作为中间人,没有服务器的私钥,是不能解密客户端发送的内容的,若没有客户端自己生成的秘钥,就不能解密客户端发送的内容 PS: 1.CA证书保证了公钥的可靠性。 2.服务端私钥+公钥的非对称加解密保证了客户端生成的随机数传输安全,不会被中间人拦截获取。但是非对称加密对服务端开销大。 3.所以利用随机数的对称加密保证后续通讯的安全性,也可以降低服务器的解密开销。 4.HTTPS只针对传输内容进行加密,保证的是客户端和网站之间的信息就算被拦截也无法破解。如果不是全站HTTPS,仅仅只是在登录页采用HTTPS,那些HTTP连接的页面同样是危险的,从HTTP->HTTPS跳转依然可能被劫持。 --- ## 如何预防HTTP劫持 因为使用中间人攻击,必须让客户端信任中间人的证书 1、证书校验:针对安全性要求比较高的 app,可采取客户端预埋证书的方式锁死证书,**只有当客户端证书和服务端的证书完全一致的情况下才允许通信**,如一些银行类的app,但这种方式面临一个问题,证书过期的问题,因证书有一定的有效期,当预埋证书过期了,只有通过强制更新或者要求用户下载证书来解决 2、域名检验 ## HTTP被劫持怎么办? 如果确认遭遇了HTTP劫持,可以向ISP(互联网服务提供商,即向广大用户综合提供互联网接入业务、信息业务、和增值业务的电信运营商。)客服强烈投诉,来达到免于被劫持的目的。因为劫持技术本身设计中包括类似黑名单的功能,如果收到宽带用户的强烈反对,ISP会将该用户放入"黑名单"过滤掉,于是用户在短期内就不会遇到劫持的情况了。 HTTPS的出现对利用网络劫持的企业来说,无疑是一个巨大的打击。HTTPS的出现,通过对数据的加密,使得第三方难以修改我们的数据内容。就像字条上的文字只有甲方跟丙方能够看懂,作为乙方根本不知道纸条上写的是什么内容,就不从下手对内容进行修改。同时,给字条加上信封,再加上一次性的印戳,使得乙方根本无法看到字条上的内容,因为一旦拆开信封,丙方就知道自己的信息被第三方看到了,从而对纸条内容产生怀疑。SSL证书就像信封,把我们的数据放在里面,只有指定的一方可以解读这个数据,一旦数据被第三方劫持,接受数据的用户就会产生不信任,从而丢弃数据。