初识Padding Oracle Attack

Nov 22, 2017 23:54 · 113 words · 1 minute read ctf

Lctf见到了这种攻击方式,学习学习。。

简介

Padding Oracle Attack是一种针对CBC模式分组加密算法的攻击,可以自己构造密钥,去构造出任意的明文。

CBC加密原理

在密码学中,分组加密(Block cipher),又称分块加密或块密码,是一种对称密钥算法。它将明文分成多个等长的模块(block),使用确定的算法和对称密钥对每组分别加密解密,block的大小常见的有64bit、128bit、256bit等。在分组加密的CBC模式中,每个明文块先与前一个密文块进行异或后,再进行加密。加密过程大致如下图所示:

Markdown

在这个过程中,如果最后一个分组的消息长度没有达到block的大小,则需要填充一些字节,被称为padding。以16个字节一个block为例,如果明文是I_am_Bob,长度为八个字节,则剩下的八个字节被填充了0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08这八个相同的字节,每个字节的值等于需要填充的字节长度。

网上的师傅提到如果最后的一个分组的字节数刚好是每个block的字节数,那么在填充一整个分组,即:如果每个分组是8个bit,最后一个分组也是8bit,那么再填充8个0x00,具体原理没有看懂。算法如下

add = length - (count % length)
plaintext = plaintext + ('\0' * add) #填充

以aes-128-cbc加密模式为例,加密I_am_Bob的过程大致如下:

Markdown

解密过程

Markdown

加密过程

  • 首先将明文分成每X位一组,位数不足的是用特殊字符填充!!!!!!! X常见的为16位,也有32位 这里要注意,CBC的填充规则(有PKCS5和PKCS7,区别这里使用的是PKCS7 图解如下)是缺少N位,就用 N 个 ‘\xN’填充,如缺少10位则用 10 个 ‘\x10’填充
  • 然后生成初始向量IV(这里的初始向量如果未特定给出则随机生成)和密钥
  • 将初始向量与第一组明文异或生成密文A
  • 用密钥加密密文A 得到密文A_1
  • 重复3 将密文A_1与第二组明文异或生成密文B
  • 重复4 用密钥加密密文B_1
  • 重复3-6 直到最后一组明文
  • 将IV和加密后的密文拼接在一起,得到最终的密文(也可以不拼接)

解密过程

  • 首先从最终的密文中提取出IV (IV为加密时指定的X位) //如果加密时没有加入IV则不用提取
  • 将密文分组
  • 使用密钥对第一组密文解密得到密文A,然后用IV进行异或得到第一组明文
  • 使用密钥对第二组密文解密得到密文B,然后用A与B进行异或得到第二组明文
  • 重复3-4 直到最后一组密文

攻击条件

1.异或用的向量(IV)可控

2.padding oracle异常错误反馈到了页面,

padding只能为

data 0x01 或
data 0x02 0x02 或
data 0x03 0x03 0x03 或
data 0x04 0x04 0x04 0x04 或
data 0x05 0x05 0x05 0x05 0x05 或
......

如果出现data 0x05 0x05,那解密之后的检验就会出现错误,因为padding的位数和padding内容不一致 如果这个服务没有catch这个错误的话那么程序就会中途报错退出,表现为,如http服务的status code为500

攻击手法

由于秘钥(key)可控, - 假设明文填充的字节是0x01,然后我们可以构造key,在==0x00到0xFF==中只有一个值和密文异或后是0x01,这样就可以爆破出密文的最后一位 - 接下来就可以继续推测倒数第二位,这时需要假设明文填充的字节是0x02 0x02, - 这时候还要根据上一步推测出的密文的最后一位和明文的最后一位0x02去异或去得到key的最后一位。 - 以此类推可以推测出密文的其他内容

  • 但是在解密第二组及其以后的组的时候有一个注意的地方,经过aes解密之后的middle要异或的不再是IV了,而是前一组密文!!

注意

  • 首先记得查看加密的初始IV是多少位,再根据这个位数将密文分组!按组爆破!
  • 其次是IV是每爆破出一位最好都要重新根据middle生成爆破位后面的位数

参考链接

http://www.jianshu.com/p/ad8bdd87e131

http://f1sh.site/2017/08/04/%E5%88%9D%E5%AD%A6padding-oracle-attack/

http://www.blogsir.com.cn/safe/498.html

tweet Share