• home > webfront > SGML > web >

    web安全:中间人攻击

    Author:zhoulujun Date:

    中间人攻击是攻击方同时与服务端和客户端建立起了连接,并让对方认为连接是安全的,但是实际上整个通信过程都被攻击者控制了。攻击者不仅能获得双方的通信信息,还能修改通信信息。

    什么是中间人攻击?

    中间人攻击是攻击方同时与服务端和客户端建立起了连接,并让对方认为连接是安全的,但是实际上整个通信过程都被攻击者控制了。攻击者不仅能获得双方的通信信息,还能修改通信信息。

    通常来说不建议使用公共的 Wi-Fi,因为很可能就会发生中间人攻击的情况。如果你在通信的过程中涉及到了某些敏感信息,就完全暴露给攻击方了。

    在前端领域,中间人攻击,也被称为浏览器劫持、web劫持。最常见的就是 地方ISP运营商 给你网站塞广告:往web页面里塞入一些广告厂商的DOM元素,也有可能直接把网络请求劫持到另外一台服务器,很可能是个钓鱼站。

    从实现漏洞实现的原理上面主要可以分为两类:

    • 在网络报文传输过程中对其截获、篡改。

    •  在客户端浏览器发送http请求之前或得到httpResponse之后对数据进行篡改。

    对于http来说,完全是明文传输,所以运营商可以直接获取里面的数据,并塞入自己的数据。客户端无法校验数据是否被篡改。

    之前在《SSL/TLS协议的运行原理浅析—https通信过程及CA证书诠释》一文中国提到:

    为什么需要采用https加通信

    不使用SSL/TLS的HTTP通信,就是不加密的通信。所有信息明文传播,带来了三大风险。

    (1) 窃听风险(eavesdropping):第三方可以获知通信内容。

    (2) 篡改风险(tampering):第三方可以修改通信内容。

    (3) 冒充风险(pretending):第三方可以冒充他人身份参与通信。

    SSL/TLS协议是为了解决这三大风险而设计的,希望达到:

    (1) 所有信息都是加密传播,第三方无法窃听。

    (2) 具有校验机制,一旦被篡改,通信双方会立刻发现。

    (3) 配备身份证书,防止身份被冒充。

    只要https的私钥没有泄露,中间人就无法解密其中的数据。所以避免了被劫持。

    https可以避免我们被劫持,当然https不止这个作用。但是,需要确保走https

    确保https

    服务的接收https

    第一个是服务端只接受https通信,比如nginx配置:

    error_page 497 https://$host$request_uri; #当网站只允许https访问时,当用http访问时nginx会报出497错误码

    具体参考《Nginx葵花宝典—草根站长配置Nginx运维百科全书 》

    服务的可以禁止非https请求,但是无法禁止用户去发起http请求,如从http://zhoulujun.cn 跳转到https://zhoulujun.cn,这个中间会存在中间人攻击

    对于篡改302的攻击,建议服务器开启HTTP Strict Transport Security功能

    浏览器强制https

    之前讲过《HTTP严格安全传输之HSTS:HTTP Strict Transport Security...

    通过HTTP Strict Transport Security通知浏览器,这个网站禁止使用HTTP方式加载,浏览器应该自动把所有尝试使用HTTP的请求自动替换为HTTPS请求。

    HSTS可以很大程度上解决SSL剥离攻击,因为只要浏览器曾经与服务器创建过一次安全连接,之后浏览器会强制使用HTTPS,即使链接被换成了HTTP

    另外,如果中间人使用自己的自签名证书来进行攻击,浏览器会给出警告,但是许多用户会忽略警告。HSTS解决了这一问题,一旦服务器发送了HSTS字段,用户将不再允许忽略警告

    HSTS并不是HTTP会话劫持的完美解决方案。用户仍然容易受到攻击,如果他们通过HTTP访问HSTS保护的网站时是第一次, 例如:

    1. 以前从未访问过该网站

    2. 最近重新安装了其操作系统

    3. 最近重新安装了其浏览器

    4. 切换到新的浏览器

    5. 切换到一个新的设备如移动电话

    6. 删除浏览器的缓存

    7. 最近没访问过该站并且max-age过期了

    网上很多文字 给了读者这样感觉:完全走https就安全了的感觉。其实并不然:

    现在很多公司给监控员工的浏览器行为就是 CA根证书  本地信任,中间服务器代理劫持

    证书颁发机构和域名一样,是一个树状的结构,一旦信任一个根证书颁发机构,等同于信任其下所有颁发的所有证书,以及其授权的二级证书颁发机构颁发的所有证书。更为严重的事情是,根证书颁发机构,是整个证书颁发体系中,唯一不受任何身份验证的。其身份的正确性,由其自行保证也就是说,根证书颁发机构可以宣称自己是任何一个公司,没有任何人和组织可以对其进行审查

    事实上,根证书颁发机构是整个证书体系中,最薄弱的环节。这就是为什么上次微软在操作系统中内置CNNIC这个流氓的根证书引起了网络上广泛的质疑。

    我在我朝,各种牛鬼蛇神的公司,都强迫你安装他们证书,而且作为根证书,鬼知道他们时候被劫持

    如果没有根证书被信任,浏览器会弹出警告,HSTS会直接拒绝。但是,如果被内地系统 证书管理被 劫持,难就只有等着被宰了

    基于此,如果客户端用户的操作系统中植入木马,就windows平台而言,c++的hook玩好了也能做不少的事情。

    包括一些浏览器插件,很有可能通过各种各样的手段做埋伏,对于这种攻击来说,https协议无能为力,我们唯一能做的是加强web页面自身对客户端环境的嗅探、监控和上报机制,尽量做到对于被劫持的情况能够有所感知。


    参考文章:

    https://fex.baidu.com/blog/2014/08/ssl-frontend-hijack/


    转载本站文章《web安全:中间人攻击》,
    请注明出处:https://www.zhoulujun.cn/html/webfront/SGML/web/2020_0615_8463.html