上一篇:零门槛学习https–(4)https协议详解

看似毫无破绽的TLS协议,其实也存在着诸多漏洞,主要因为TLS协议太复杂了,复杂的东西必然会出现漏洞,下面我们来看看一些常见的攻击手段有哪些。

伪造证书

攻击原理

这是一种中间人攻击,就是伪造网站证书,虽然浏览器会提示访问了不安全的网址,但是大部分对https没什么了解的人基本都会选择忽略问题继续浏览,这是一种简单,成本低,且效果还可以的攻击方式。

防御方法

打开浏览器设置,如果证书不可信,那么就直接不能访问。这个其实也不能算是TLS的漏洞,只能说是浏览器为了做兼容而没有采取一些强制性措施,或许不久的将来,浏览器默认就会直接拒绝无效证书的连接。

POODLE

攻击原理

上一章看TLS协议的时候,我们看到,因为要处理兼容性问题,客户端和服务端不得不支持很多种加密套件和TLS或者SSL版本,由此,衍生一个问题就是:一些老久的加密套件或者SSL版本通常在现在的计算能力下安全性没那么高,或者早先的协议是有安全漏洞的,所以,针对SSL降级,还有加密降级攻击就成了一种主流的攻击方式。

POODLE的全称是Padding Oracle On Downgraded Legacy Encryption,由谷歌的工程师在2014年发现了这个问题,问题的主要原因在于分块加密。其原理是:

AES 分块加密在原文内容长度不满足时,会在原文后面填充一些内容,保证每个分块的长度一致,这就是Padding Oracle,也是攻击的关键,因为新版TLS不存在这个问题,所以我们需要对协议进行降级,而降级就是Downgraded Legacy Encryption,所以这也是这个漏洞名称的由来。

协议降级很简单,只要在客户端发送Client Hello消息的时候,把客户端支持的加密套件替换成SSL3.0,如果服务端支持,那么后续连接就会使用SSLV3来进行连接,具体的Padding Oracle攻击原理可以看一下这篇文章,写得非常详细。

防御方法

客户端禁用SSLV3协议,服务端也关闭SSLV3的连接。

FREAK

这个攻击方式可以说到一个很有意思的事情,目前基本主流的加密算法都是由美国开发的,90年代的时候,NSA为了能够监听世界上所有的网络通信,出台了对于软件出口规定,规定只有美国境内能够使用高强度的RSA加密,对于出口国外的软件,最高允许512密钥长度的RSA,高安全级别的加密算法被认为是战争武器而禁止对外出口。2000年之后,美国逐渐放宽了这个限制,目前美国任然有一些带有加密算法和函数的软硬件受到出口管制。

攻击原理

由于历史遗留原因,IE6,网景,甚至是手机上的安卓和iOS Safari 浏览器,都支持512密钥长度的RSA加密,这在2015年的时候才被法国工程师发现。据说在当时任然有38%的服务器还支持512长度的密钥,而且讽刺的是,美国一些政府部门网站也存在此漏洞。

攻击者在Client Hello的时候,把高强度的密钥加密算法都剔除掉,留下低强度的算法,如果服务端也支持低强度的加密算法,那么就会选择这一算法。虽然在90年代一般的PC还无法破解512长度密钥,但是目前个人已经完全有能力破解了。

防御方法

苹果已经在当时推出相应补丁,而安卓也在后续版本进行了升级。服务端应该禁止低强度加密算法。

HTTPS Strip

也称为SSLStrip,是一种基于社会学的攻击方法,也是中间人攻击的一种,和任何加密方式都无关,和SSL也无关,也是目前为止我成功实施的一种攻击方式。

攻击原理

通常,我们在浏览器访问一个网址的时候,会直接输入网址,而不会关注协议,比如我要访问天猫,那么我就会输入:tmall.com,而此时浏览器默认会使用http协议访问,因为浏览器并不知道服务端是否开启了https,所以,攻击者直接劫持http访问,然后自己去访问https://www.tmall.com,并把内容通过http协议返回给浏览器,浏览器成功收到数据,就直接开始渲染页面,浏览器端完全就是访问一个http站点。所以,这种攻击方式就叫做SSL剥离攻击。除了浏览器之外的场景,基本不会受到此攻击的影响。

防御方法

HSTS(HTTP Strict Transport Security),这是一种浏览器技术,在客户端访问站点的时候,如果检测到当前域名在HSTS列表中,那么直接使用https协议访问,也就不会被攻击者劫持了。那么如何加入HSTS列表呢?在浏览器第一次访问站点的时候,站点可以在http返回头里面来标示是否启用HSTS,还有过期时间。

这是第一次访问www.taobao.com的场景,http返回头有个:Strict-Transport-Security属性,过期时间是一年。

这是第二次访问www.taobao.com时候,因为已经在HSTS列表中,就直接是一个Internal Redirect,不会请求服务端。

其实你会发现,浏览器第一次访问网站的时候,也是有可能被劫持的,所以现在有些网址会内置在浏览器的HSTS列表中,防止第一次访问被劫持的情况发生。不久的将来,也许浏览器就默认使用https访问,这种攻击方式也就无法发挥作用了。

攻击实例

写个脚本可以检测网站是否开启了HSTS,对于没有开启HSTS的网站都可以发动攻击。以下是我对tmall.com发起的一次http strip的攻击实例。

1
上图中看到访问tmall.com的跳转逻辑是:
	tmall.com --302--> www.tmall.com --301--> https://www.tmall.com。

301还好,现代浏览器几乎会作为永久缓存,这种情况下如果不清楚缓存,其实跟HSTS效果差不多。
302就坑了,基本是不会缓存的。

1
从上图中我们可以看到返回头中虽然包含了STS头,但是过期时间为0

也就是不开启HSTS,用了一个301跳到了https站点

下面我开始准备需要的东西,当然一个前提是你要能捕获流量:

  1. 为了方便我使用本机测试,可以建个DNS服务器,也可以使用更简单的host文件,我选择使用host文件,把tmall.comwww.tmall.com指向127.0.0.1
  2. 在本机建立一个web server,具体的代码就不贴了,贴一些关键代码。

好,我们可以开始攻击了,具体步骤如下。

  1. 首先使用浏览器访问tmall.com,因为没有开启HSTS,浏览器开始用http方式请求tmall.com
  2. 然后使用IP地方访问真实的tmall.com,这里不能用域名,因为域名已经指向本机了,并且要选择忽略证书验证,因为访问的是IP,而证书里的是域名,证书验证过不了。
  3. 拿到真实tmall.com的返回之后,添加如下代码:

    1
    body += '<script>alert( 'hello' )</script>';
  4. 返回给浏览器,此时,浏览器看起来是这个样子,弹出了hello,并且仔细看会发现https标示没有了,如果不弹出alert,那么一般人是很难发现https没有了。

  5. 再进一步看看,点击登陆按钮的跳转逻辑是:<a href="//:login.tmall.com">登陆</a>,没有写死协议,如果写死了协议,在返回内容的时候,手动替换为http即可。同样没有开启HSTS,我们试试看能不能拿到账号密码。简单分析一下天猫登录页,真正账号密码的输入框采用的是login.taobao.com提供的iframe登录框,有二维码和手动输入账号密码两个选项,二维码我们放一边,看看能不能拿到手动输入账号密码时的内容。
  6. 看了看login.taobao.com,没有写死协议,并且发现同样没有开启HSTS,这就好办了,和tmall.com一样,拦截请求,并在返回内容添加如下代码,插入一个jQuery,并在在输入密码的时候获取输入事件:

    1
    body += `<script src="https://code.jquery.com/jquery-latest.js"></script><script>$( '#TPL_username_1' ).on( 'input', function () {console.log( this.value )  } ); $( '#TPL_password_1' ).on( 'input', function () {console.log( this.value )  } )</script>`;
  7. 运行脚本,看看效果:

    login.taobao.com竟然是GBK编码的,导致乱码了,这里我懒得转编码了,可以看到左上角其实浏览器已经显示了不安全三个字,同样估计很少有人会看到这几个字。我们尝试输入一下账号密码试试看:

    已经打印出账号密码,发个请求就能发送到我自己的服务器了,后面再跳回到https站点就神不知鬼不觉了。

  8. 总的来说,本次攻击的需要的条件其实是比较多的,首先因为http://www.tmall.com跳转到https://www.tmall.com是301跳转,而chrome等浏览器把301几乎是当做永久缓存来处理的,除非手动清理缓存,当然很多浏览器对301也不缓存,或者重启就没了。其次,默认的登陆方式是二维码登陆,二维码登陆就无法实施此次攻击了。不过基于天猫访问量巨大,符合条件的流量估计也不少,而且http://login.taobao.com跳往https站点是302,也就是不会缓存了,这个有安全隐患。如果某天天猫开启了HSTS,那么这类攻击就几乎无法生效了,毕竟这对天猫来说也就是一个配置项的事。

其他漏洞

  1. 完全信任证书漏洞。很多android APP采取了不校验证书的方式,导致中间人攻击非常容易,比如早先的亚马逊官方APP、携程APP等。
  2. Heartbleed。OpenSSL在实现心跳的扩展没有对输入进行适当验证,导致过读,可以读取服务器内存中的内容,即使协议没问题,实现有问题同样也会造成漏洞的产生。

总结

TLS因为比较复杂,所以或多或少总会有些漏洞,TLS也在慢慢地不断完善,因为很多东西基于数学原理,或者某天出现了快速因式分解等的方法,瞬间就可以破解TLS,也有人说美国安全局其实早就已经掌握某些技术能够监听全世界的加密流量了,加密和破解总是在不断地博弈,在博弈过程中进行自我升级。目前和我们密切相关的https,因为是用浏览器访问,所以浏览器或许也带来了很多漏洞,比如http strip之类的攻击,相信我们的网络环境一定会变得越来越安全。