做一道 ctf 题的时候遇到了 aes-128-cbc 加密方式,没有思路结果翻到了关于cbc翻转攻击的文章,就进去学习了一下,有点难以理解,不过先记录下来总是好的,传送门

0x01 可以干嘛?

通过损坏密文字节来改变明文字节。(注:借助 CBC 内部的模式)借由此可以绕过过滤器,或者改变用户权限提升至管理员,又或者改变应用程序预期明文搞事情

0x02 过程图片

  • Plaintext:待加密的数据。
  • IV:用于随机化加密的比特块,保证即使对相同明文多次加密,也可以得到不同的密文。
  • Ciphertext:加密后的数据。

在这里重要的一点是,CBC 工作于一个固定长度的比特组,将其称之为块。在本文中,我们将使用包含 16 字节的块。

0x03 加密过程

  1. 首先将明文分组 (常见的以 16 字节为一组),位数不足的使用特殊字符填充。
  2. 生成一个随机的初始化向量 (IV) 和一个密钥。
  3. 将 IV 和第一组明文异或。
  4. 用密钥对 3 中xor后产生的密文加密。
  5. 用 4 中产生的密文对第二组明文进行xor操作。
  6. 用密钥对 5 中产生的密文加密。
  7. 重复 4-7,到最后一组明文。
  8. 将IV和加密后的密文拼接在一起,得到最终的密文。

从第一块开始,首先与一个初始向量 iv 异或(iv 只在第一处作用),然后把异或的结果配合 key 进行加密,得到第一块的密文,并且把加密的结果与下一块的明文进行异或,一直这样进行下去。因此这种模式最重要的特点就是:前一块的密文用来产生后一块的密文。

0x04 解密过程

解密的过程其实只要理解了加密,反过来看解密过程就也很简单了,同样的,前一块密文参与下一块密文的还原。

  1. 从密文中提取出 IV,然后将密文分组。
  2. 使用密钥对第一组的密文解密,然后和 IV 进行 xor 得到明文。
  3. 使用密钥对第二组密文解密,然后和 2 中的密文 xor 得到明文。
  4. 重复 2-3,直到最后一组密文。

0x05 攻击原理

这里可以注意到前一块 Ciphertext 用来产生下一块明文,如果我们改变前一块 Ciphertext 中的一个字节,然后和下一块解密后的密文 xor,就可以得到一个不同的明文,而这个明文是我们可以控制的。利用这一点,我们就欺骗服务端或者绕过过滤器。

具体怎么翻转呢,因为涉及到异或,这里稍微介绍下异或的概念:

当我们的一个值 C 是由 A 和 B 异或得到
C = A XOR B
那么
A XOR B XOR C 很明显是 =0 的
当我们知道 B 和 C 之后,想要得到A的值也很容易
A = B XOR C
因此,A XOR B XOR C 等于 0。有了这个公式,我们可以在 XOR 运算的末尾处设置我们自己的值,即可改变。


本网站博主