HTTPS 协议降级攻击原理
0x00 HTTPS
在传统流行的web服务中,由于http协议没有对数据包进行加密,导致http协议下的网络包是明文传输,所以只要攻击者拦截到http协议下的数据包,就能直接窥探这些网络包的数据。
HTTPS 协议就是来解决这个问题的,关于HTTPS协议的原理由于不是本文的主要讨论内容,所以大家可以到大型网站的 HTTPS 实践(一)—— HTTPS 协议和原理这里查看。
简而言之,HTTPS协议在应用层的http协议和以及传输层TCP协议之间的会话层加入了 SSL/TLS协议,用作加密数据包。会话层的这个加密协议,在真正数据传输之前,进行握手通信,握手的信息交换主要包括:双方确认加密协议的版本,确认身份(其中浏览器客户端的身份有时是不需要确认的),确认传输真正数据的加密密码(对称加密)。
在用作信息传输的加密密码确认之后,接下来的通信数据都会加密后再传输,从而达到防窃取的作用。
0x01 HTTPS 协议降级
那么使用了https就能确保安全传输了吗?
可以说理想上是的,现实却不是。
原因简单来说就是:设计和实现SSL/TLS协议出现了漏洞,导致攻击者同样可以攻击一些旧版本的SSL/TLS协议。当SSL/TLS加密协议漏洞爆出来之后,最新版本的SSL/TLS协议修复了已知漏洞,但旧版本的加密协议却变得不安全了。
那么什么又是“HTTPS协议降级”?
在上一小节我们提到SSL/TLS协议通过握手来确定通信信息,其中握手双方要统一加密协议版本。
在握手过程中这样确认加密协议版本:
由客户端(如浏览器)发送第一个数据包 ClientHello,这个数据包中保存着客户端支持的加密协议版本。
服务器收到这个ClientHello数据包,查看里面客户端支持的加密协议版本,然后匹配服务器自己支持的加密协议版本,从而确认双方应该用的加密协议版本。
服务器发送ServerHello数据包给客户端,告诉客户端要使用什么加密协议版本。
在上述过程中,如果客户端发送给服务器的ClientHello数据包中说自己仅支持某个有漏洞的旧版本加密协议(比如仅支持SSLv3.0),服务器有两种可能:
服务器支持很多版本,其中包括有漏洞的旧版本和新版本(包括了SSLv3.0协议),那么服务器会认可使用有漏洞的旧版本协议,从而告诉客户端使用有漏洞的旧版本(可以使用SSLv3.0)。
服务器不支持有漏洞的旧版本,拒绝客户端的这次请求,握手失败。
对于攻击者,作为中间人只能监听到加密过的数据,如果这些数据通过没有漏洞的加密版本加密,攻击者并不能做什么。
但是,如果服务器提供有漏洞的旧版本加密协议的支持,而同时攻击者又能作为中间人控制被攻击者的浏览器发起漏洞版本的HTTPS请求,那虽然攻击者监听到的也是加密过的数据,但因为加密协议有漏洞,可以解密这些数据,所以数据就和明文传输没有什么差别了。
这就是HTTPS协议降级。
0x02 SSLv3.0 的AES加密原理
攻击者通过握手将HTTPS通信协议降低到SSLv3.0之后,将会拦截到经过SSLv3.0加密过的数据,Padding Oracle攻击可以解密这些数据。
为什么叫 Padding,我们从SSLv3.0的加密原理说起。
也是在第一小节,HTTPS握手过程中,通信双方还确认了一个“加密密码”,这个密码是双方在握手过程中使用非对称加密的方式协商出来的对称加密密码。攻击者能拦截到的数据就是被这个密码加密的。
这个对称加密使用AES加密,AES块密码会把要加密的明文切分成一个个整齐的块(如将明文以16个字节为一块分成很多块),如果最后一块不足一块,则会填充(Padding)满一块,再进行加密。这个填充就是Padding Oracle攻击的关键。
AES是典型的块密码,块密码的加密方式有很多种,如果你不了解,可以查看块密码的工作模式。
SSLv3.0中使用AES-CBC模式加密,我们来看加密和解密流程:
加密过程图示:
HTTPS 协议降级攻击原理
解密过程:
将密文内容分为若干个密文块,每个密文块和加密时的明文块长度一样,此时由于加密时经过了填充,密文内容肯定能整齐的分割成整数个密文块。
对于第一个密文块,使用加密key解密之后,与加密时的初始化响亮异或获得第一个明文块。
对于其他的密文块,如第N个,使用加密key解密之后,与第N-1个密文块异或,获得相应的明文。
这就是SSLv3.0的加密原理过程。
0x03 CBC模式加密 的 Padding Oracle攻击
上一节我们解释了CBC模式加密过程,这种模式使用不当会遭到针对于Padding的攻击。
对于SSL协议,需要加密的数据包括信息本身和信息的MAC摘要值,在协议设计初期,由于大家考虑不周,使用了“先做信息摘要MAC DATA,再做加密”的方式(MAC-then-encrypt)。
MAC-then-encrypt,这种方式可能遭到Padding Oracle攻击。SSL协议在这种方式下,数据格式如图:
解密过程:
将密文内容分为若干个密文块,每个密文块和加密时的明文块长度一样,此时由于加密时经过了填充,密文内容肯定能整齐的分割成整数个密文块。
对于第一个密文块,使用加密key解密之后,与加密时的初始化响亮异或获得第一个明文块。
对于其他的密文块,如第N个,使用加密key解密之后,与第N-1个密文块异或,获得相应的明文。
这就是SSLv3.0的加密原理过程。
0x03 CBC模式加密 的 Padding Oracle攻击
上一节我们解释了CBC模式加密过程,这种模式使用不当会遭到针对于Padding的攻击。
对于SSL协议,需要加密的数据包括信息本身和信息的MAC摘要值,在协议设计初期,由于大家考虑不周,使用了“先做信息摘要MAC DATA,再做加密”的方式(MAC-then-encrypt)。
MAC-then-encrypt,这种方式可能遭到Padding Oracle攻击。SSL协议在这种方式下,数据格式如图:
加密过程:
明文首先被分成很多明文块,所有明文块的字节长度都一样,其中最后一个明文块经过了填充,若假设最后一个填充字节值为L,则填充内容为值为L的字节重复L次(不包括最后一个字节本身) 。
加密从第一个明文块开始链式依次进行,其中,第一个明文块先和初始化的向量进行异或,之后使用加密key加密,生成第一个密文块。
将第一个密文块与第二个明文块异或,然后使用加密key加密,生成第二个密文块。
以此类推,第N个密文块,由第N-1个密文块和第N个明文块异或,然后使用加密key加密获得。
将所有获得的密文块依次拼接起来,就得到了最后的加密数据,这个数据是暴露在网络流量中的数据,也是攻击者可能截获的数据。
解密过程图示:
HTTPS 协议降级攻击原理
解密过程:
将密文内容分为若干个密文块,每个密文块和加密时的明文块长度一样,此时由于加密时经过了填充,密文内容肯定能整齐的分割成整数个密文块。
对于第一个密文块,使用加密key解密之后,与加密时的初始化响亮异或获得第一个明文块。
对于其他的密文块,如第N个,使用加密key解密之后,与第N-1个密文块异或,获得相应的明文。
这就是SSLv3.0的加密原理过程。
0x03 CBC模式加密 的 Padding Oracle攻击
上一节我们解释了CBC模式加密过程,这种模式使用不当会遭到针对于Padding的攻击。
对于SSL协议,需要加密的数据包括信息本身和信息的MAC摘要值,在协议设计初期,由于大家考虑不周,使用了“先做信息摘要MAC DATA,再做加密”的方式(MAC-then-encrypt)。
MAC-then-encrypt,这种方式可能遭到Padding Oracle攻击。SSL协议在这种方式下,数据格式如图:
HTTPS 协议降级攻击原理
这是一次请求要传递的数据结构示意,其中Data为最重要的数据,包括 cookie甚至用户名密码等信息,HMAC 如图示是Data以及其他一些序列数据的MAC摘要,最后是补充字节的Padding。
在这种数据结构下,加密数据传输到接收者手里,会解密然后依次验证Padding数据和HMAC数据,来确认数据是正确的。
因此,接收者解密验证时主要有三种可能发生的情况:
Padding数据错误,拒绝,返回。
HMAC数据错误,拒绝,返回。
正确接收。
这3种返回给予了攻击者启示,我们再来看解密过程:
HTTPS 协议降级攻击原理
留意最后一个密文块,这个密文块首先会用加密key进行解密,然后与倒数第二个密文块进行异或。
攻击者是能够截获到所有的密文内容的。
我们提到过Padding数据的规则是:若假设最后一个填充字节值为L,则填充内容为值为L的字节重复L次(不包括最后一个字节本身) 。而验证padding的过程也是按照规则来的:读取最后一个字节的值,并移除最后一个字节,然后验证剩下的padding为L个值为L的字节。
也就是说,当最后一个字节值为 0x00 的时候,padding验证会直接通过。
假设:
倒数第二个密文块的最后一个字节值为 x(攻击者可见的)。
最后一个密文块,解密后最后一个字节值为 a (攻击者不可见)。
最后一个明文块最后一个字节为 m (攻击者不可见)。
HTTPS 协议降级攻击原理
可知, a = x 异或 m 并且 m = x 异或 a。
然后攻击者不断修改x的值,发送给接收者,那么m的值也会不断变化,并发生padding数据验证失败返回。除非 m 变成 0x00, 此时不会返回padding数据验证失败,而会返回HMAC数据验证失败。假设此时, m 的值被改为了 c,如图。
HTTPS 协议降级攻击原理
可知, a = c 异或 0x00。
由于 a = x 异或 m 并且 m = x 异或 a。
所以 m 也就是明文, m = x 异或 c 异或 0x00。其中, x攻击者已知, c通过不同的返回获知。 从而破解了明文中的最后一个字节。
有了 m 的值,也同时得到了 a 的值, 可以通过修改 x 的值控制m,比如修改 x 的值使
m = 0x01 = x 异或 a。
将 m 设置成 0x01 的时候,遍历倒数第二个密文块的倒数第二个字节(最多256次),通过判断是否通过padding验证,就能同理求出另外一个字节了。
以此类推可以解密整个数据包。
0x04 Padding Oracle攻击的防范
通过上一节可以看到攻击者是通过padding验证返回 和 mac验证返回结果不同来获得信息的,实际上,即使padding验证失败和mac验证失败都返回同样结果,攻击者也可以通过响应时间的不同通过 timing的方式获得信息。
所以在协议中将验证失败的响应时间和响应结果统一,使攻击者不能区分能防范这种攻击。
而对于SSL/TLS协议的使用者,我们可以响应号召在自己服务器的加密协议支持列表上去掉SSLv3.0 。
0x05 参考资料
Padding oracles and the decline of CBC-mode cipher suites
The Cryptographic Doom Principle
POODLE attacks on SSLv3
SSL v3 Poodle安全漏洞修复建议
稿源:微信开发www.5.qixoo.com
HTTPS 协议降级攻击原理的更多相关文章
- 浅谈HTTPS以及Fiddler抓取HTTPS协议
最近想尝试基于Fiddler的录制功能做一些接口的获取和处理工作,碰到的一个问题就是简单连接Fiddler只能抓取HTTP协议,关键的登录请求等HTTPS协议都没有捕捉到,所以想让Fiddler能够同 ...
- fidder https以及Fiddler抓取HTTPS协议
一.浅谈HTTPS 我们都知道HTTP并非是安全传输,在HTTPS基础上使用SSL协议进行加密构成的HTTPS协议是相对安全的.目前越来越多的企业选择使用HTTPS协议与用户进行通信,如百度.谷歌等. ...
- 浅谈HTTPS以及Fiddler抓取HTTPS协议(摘抄)
一.浅谈HTTPS 我们都知道HTTP并非是安全传输,在HTTPS基础上使用SSL协议进行加密构成的HTTPS协议是相对安全的.目前越来越多的企业选择使用HTTPS协议与用户进行通信,如百度.谷歌等. ...
- 浅谈HTTPS协议
前言 理解协议是做接口测试的前提.本文主要向大家展示博主对HTTPS协议的理解,网上有诸多资料,有些写得过于晦涩难懂,尤其是需要密码学的一些知识.我做了一下简单的整理,刨除复杂的底层实现,单从理解SS ...
- 【转载】浅谈HTTPS以及Fiddler抓取HTTPS协议
最近想尝试基于Fiddler的录制功能做一些接口的获取和处理工作,碰到的一个问题就是简单连接Fiddler只能抓取HTTP协议,关键的登录请求等HTTPS协议都没有捕捉到,所以想让Fiddler能够同 ...
- Https协议简析及中间人攻击原理
1.基础知识 1.1 对称加密算法 对称加密算法的特点是加密密钥和解密密钥是同一把密钥K,且加解密速度快,典型的对称加密算法有DES.AES等 ...
- 【百度】大型网站的HTTPS实践(一)——HTTPS协议和原理
大型网站的HTTPS实践(一)——HTTPS协议和原理 原创 网络通信/物联网 作者:AIOps智能运维 时间:2018-11-09 15:07:39 349 0 前言 百度于2015年上线了全站 ...
- HTTPS 协议和原理
1 HTTPS 协议概述 HTTPS 可以认为是 HTTP + TLS.HTTP 协议大家耳熟能详了,目前大部分 WEB 应用和网站都是使用 HTTP 协议传输的. TLS 是传输层加密协议,它的前身 ...
- 大型网站的 HTTPS 实践(1):HTTPS 协议和原理
转自:http://op.baidu.com/2015/04/https-s01a01/ 1 前言 百度已经于近日上线了全站 HTTPS 的安全搜索,默认会将 HTTP 请求跳转成 HTTPS.本文重 ...
随机推荐
- 让input框只能输入数字
var oInput = document.querySelector("input");oInput.onkeyup = function () { var value = th ...
- openstack常规操作命令梳理
之前顺利部署了openstack+kvm的虚拟化云平台管理环境,其中,涉及到不少openstack操作命令,记录如下: 查看rabbitmq 队列[root@openstack ~]#rabbitmq ...
- [Elixir009]像GenServer一样用behaviour来规范接口
1.Behaviour介绍 Erlang/Elixir的Behaviour类似于其它语言中的接口(interfaces),本质就是在指定behaviours的模块中强制要求导出一些指定的函数,否则编译 ...
- 从log4j日志无缝迁移至logback
ogback对比log4j的有点在此就不赘述了. 由于在项目的原有代码中,大量的日志生成是通过log4j实现的,新的代码希望通过logback的方式生成日志,同时希望将老的代码在不修改的情况下直接将日 ...
- PHP基础20:创建文件
<?php /* 1.PHP 创建文件 - fopen() fopen() 函数也用于创建文件.也许有点混乱,但是在 PHP 中,创建文件所用的函数与打开文件的相同 如果您用 fopen() 打 ...
- iBatis.net入门指南
iBatis.net入门指南 - 1 - 什么是iBatis.net ? - 3 - iBatis.net的原理 - 3 - 新人指路 - 3 - iBatis.net的优缺点 ...
- JQuery学习笔记——JQuery基础
#,JQuery避免名称冲突的方法 var jq = jQuery.noConfilct(); jq.ready( function(){ jq("p").hidden() ...
- Activiti系列: 如何添加自定义表单引擎
这个功能挺有意思的,有了它,就可以不适用html的方式来展示表单了,比如可以用swing对象了 class MyFormEngine implements FormEngine { @over ...
- [CareerCup] 9.2 Robot Moving 机器人移动
9.2 Imagine a robot sitting on the upper left corner of an X by Y grid. The robot can only move in t ...
- Linux基础与Linux下C语言编程基础
Linux基础 1 Linux命令 如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 登录Linux后,我们就可以在#或$符后面去输入命令,有 ...