zoukankan      html  css  js  c++  java
  • HTTP劫持

    HTTP劫持

    想了解什么是HTTPS,要先知道什么是HTTP

    HTTP

    HTTP是一个基于TCP/IP通信协议来传递数据的协议,传输的数据类型为HTML文件,图片文件,查询结果等,一般基于B/S架构,即浏览器作为HTTP客户端通过URL向HTTP服务端(WEB服务器)发送所有请求。

    我们以访问百度为例:

     

    而实际使用中,绝大说的网站现在都采用的是https协议,这也是未来互联网发展的趋势。

    一些网站访问时,可以看到访问的账号密码都是明文传输, 这样客户端发出的请求很容易被不法分子截取利用,因此,HTTP协议不适合传输一些敏感信息,比如:各种账号、密码等信息,使用http协议传输隐私信息非常不安全。

    所以,http存在一些问题:

    • 请求信息明文传输,容易被窃听截取。
    • 数据的完整性未校验,容易被篡改
    • 没有验证对方身份,存在冒充危险

    HTTPS

    为了解决上述的问题,就用到了HTTPS

    HTTPS 协议(HyperText Transfer Protocol over Secure Socket Layer):一般理解为HTTP+SSL/TLS,通过 SSL证书来验证服务器的身份,并为浏览器和服务器之间的通信进行加密。

    • 1.浏览器想服务器发送https请求(包含一套支持的加密规则)
    • 2.服务端收到请求之后,生成SSL密钥,包括公钥(服务器)和私钥(服务器)
    • 3.返回公钥
    • 服务器从浏览器的加密算法规则中选出一组加密算法和HASH算法,并将自己的身份信息(公钥)以证书的形式发送给浏览器,证书里包括网站地址、加密公钥以及证书的颁发机构等;
    • 4.客户端验证公钥(服务器)
    •     4.1.验证证书的合法性:颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致
    •     4.2.若证书受信任,或者用户接受了不信任的证书,浏览器会产生一串随机数的密码(密钥(客户端))),并用证书中提供的公钥(服务器)对其加密
    •     4.3.使用约定好的HASH值计算握手消息,并用生成的随机数对消息进行加密,过程如下图:
    • 5.客户端将所有信息(握手消息+密钥(客户端))发送给服务器 
    • 6.服务器端接收信息 用私钥(服务器)将信息解密,得到客户端的密钥,然后用密钥(客户端)解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致;对握手消息加密是对称加密,对客户端密钥加密是非对称加密
    • 7.服务器端使用使用密钥(客户端)加密一段握手消息,发送给浏览器
    • 8.浏览器获取信息后,用密钥(客户端)解密并计算握手消息的HASH,若与服务器发来的HASH一致,此时握手结束,之后所有的听信数据将由之前浏览器生成的随机密码(客户端密钥)利用对称密码算法加密

    PS:非对称加密算法用于在握手过程中加密生成的密码,对称加密算法用于对真正传输的数据进行加密,而HASH算法用于验证数据的完整性

    那什么是SSL/TLS呢?

    SSL(Secure Sockets Layer)安全套接层协议

    TLS(Transport Layer Security)传输层安全性协议,TLS是SSL+HTTPS安全传输层协议名称

    它们都属于加密协议,在网络数据传输中起到保护隐私和数据的完整性。保证了该网络传输的信息不会被未经授权的元素拦截或修改,从而确保只有合法的发送者和接收者才能完全访问并传输信息。

    在应用层和传输层之间使用SSL协议。最广泛的用途在HTTP协议,从而产生HTTPS加密协议。

    SSL握手

    SSL协议使用非对称和对称加密

    SSL/TSL协议保证信息的完整性:

    SSL/TLS协议不仅提供信息的机密性,还保证其完整性。为此,它使用消息认证码(MAC,消息认证码)。该认证码使用具有密码密钥的散列函数来计算,该密钥仅通信的发送者和接收者(客户端和服务器)知道。以这种方式,如果修改了所有信息的单个比特,则MAC将完全不同,并且双方当时可以知道信息已被修改。

    HTTP劫持

    常见的http劫持有DNS劫持和内容劫持

    DNS劫持

    举例:

    在浏览器输入如下域名https:// www.zhihu.com那浏览器要打开这个网站,首先要解析域名www.zhihu.com,结果这个域名被黑客劫持到他的私人服务器1.2.3.4,结果我的浏览器和他 的私人服务器1.2.3.4建立SSL连接,他的服务器1.2.3.4也和www.zhihu.com建立SSL的连接,我收发的数据都通过他的服务器1.2.3.4中转,也就是黑客的服务器1.2.3.4相当于一个https代理服务器,结果我收发的所有数据,他都能看到。可能这样被劫持吗?

    这种攻击就是中间人攻击,跳转1.2.3.4就是DNS劫持,DNS被劫持到一个非源端的IP上

    1、中间人截取客户端发送给服务器的请求,然后伪装成客户端与服务器进行通信;将服务器返回给客户端的内容发送给客户端,伪装成服务器与客户端进行通信。
    2、通过这样的手段,便可以获取客户端和服务器之间通信的所有内容。
    3、使用中间人攻击手段,必须要让客户端信任中间人的证书,如果客户端不信任,则这种攻击手段也无法发挥作用。

    下面用SSL握手来分析一下流程:

    1、首先如果黑客要跟你的浏览器建立SSL连接,那么他需要有一个CA证书,而通常系统内置根证书都是大型机构的根证书,几乎无法伪造。如果非要做一个只能是自签名证书。

     

    2、浏览器拿着对方的自签名证书和系统证书进行校验,结果一定是如下图所示:

     

    3、如果他要假冒其他机构颁发证书,因为没有颁发机构的秘钥,那么这个证书的指纹一定没办法对上,还是一样会报警。

    4、除非用户自己主动导入一个自己信任的证书

    所以,最好不要随便安装证书

    若出现中间人用HTTPS跟服务器通信,然后用HTTP跟客户端通信

    只要利用HSTS(HTTP+Strict+Transport+Security,RFC6797)就可以解决这个问题。通过在HTTP+Header中加入Strict-Transport-Security的声明,告诉浏览器在一定时间内必须通过HTTPS协议访问本域名下的资源。

    这种情况下,只要用户曾经在安全网络环境下访问过一次某站,中间人在指定时间内也无法让其回落到HTTP

    内容劫持

    作为中间人,没有服务器的私钥,是不能解密客户端发送的内容的,若没有客户端自己生成的秘钥,就不能解密客户端发送的内容

    PS:
    1.CA证书保证了公钥的可靠性。
    2.服务端私钥+公钥的非对称加解密保证了客户端生成的随机数传输安全,不会被中间人拦截获取。但是非对称加密对服务端开销大。
    3.所以利用随机数的对称加密保证后续通讯的安全性,也可以降低服务器的解密开销。
    4.HTTPS只针对传输内容进行加密,保证的是客户端和网站之间的信息就算被拦截也无法破解。如果不是全站HTTPS,仅仅只是在登录页采用HTTPS,那些HTTP连接的页面同样是危险的,从HTTP->HTTPS跳转依然可能被劫持。国内的部分银行就是这样,对安全性的考量还比不上百度,百度早就全站HTTPS了。

    如何预防HTTP劫持

    因为使用中间人攻击,必须让客户端信任中间人的证书

    1、证书校验:针对安全性要求比较高的 app,可采取客户端预埋证书的方式锁死证书,只有当客户端证书和服务端的证书完全一致的情况下才允许通信,如一些银行类的app,但这种方式面临一个问题,证书过期的问题,因证书有一定的有效期,当预埋证书过期了,只有通过强制更新或者要求用户下载证书来解决

    2、域名检验

    写死在代码中?

    问题

    1、如何验证CA证书的合法性?或者是颁发机构的合法性?通过HASH值?

    作者: Pam

    出处: https://www.cnblogs.com/pam-sh/>

    关于作者:网安在读

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(mir_soh@163.com)咨询.

  • 相关阅读:
    第二周教学设计反思
    uni-app,一套代码应用在多个平台
    新CMS
    学习js
    关于数据库
    自己写的一段jquery实现当滚动条滑动到某个位置实现向中间移动
    js平滑滚动到顶部、底部、指定地方
    统一一个帝国中搜索页面的模板
    帝国CMS的总结
    回到顶部的功能
  • 原文地址:https://www.cnblogs.com/pam-sh/p/14679595.html
Copyright © 2011-2022 走看看