Web中的密码学攻击--CBC
in 各种姿势 with 0 comment

Web中的密码学攻击--CBC

in 各种姿势 with 0 comment

之前看了钦师父的文档,觉得师父能把这道题做出来实在是太强了。学了好久才理解了攻击的原理,在这里记录一下。

钦师父的原文档

CBC的加密解密模式

CBC不是专门指一种加密,而是一种加密的方法。在这种方法中,每个密文块都依赖于它前面的所有明文块。同时,为了保证每条消息的唯一性,在第一个块中需要使用初始化向量。

这样说有点复杂,直接贴图,所有图片来源是文末的参考资料。

这里的IV指的是初始化向量,一般是可控的。Plaintext是明文,每次加密获得的Cliphertext也就是密闻会作为下一次加密使用的类似IV的东西,与Plaintext异或后带入加密。这样一步步加密就会像滚雪球一样让密文越来越乱。

之后是解谜过程

解谜就是反向的过程,只是把加密的图上下颠倒一下了。

Padding Oracle Attack

Padding Oracle Attack的最终目的是在不知道key的前提下获取明文。

而这里最重要的就是CBC的填充机制,因为CBC是分块加密,所以就会经常出现明文的长度不够加密的位数的情况,所以就会对明文进行一个填充,填充方式如下:

有填充的加解密方式如下:

下面是攻击原理:

实施Padding Oracle Attack需要几个条件:

攻击是利用明文的填充进行攻击的,因为CBC是分组加密的,所以也是对应着一组一组进行攻击的。

这里的Intermediary Value是不知道的,也是我们要找出来的,写在这里是为了更加直观的展现攻击方式。

虽然我们不知道明文是什么,有没有进行填充,但是Intermediary Value是原来的明文加密所得到的,所以我们通过改变IV的值,得到有填充的明文(并不是原先的明文,只是为了得到Intermediary Value编造出来的有填充的东西),再反向计算就可以得到Intermediary Value对应的最后一位,再填入正确的IV,这样就可以正向得到明文的值。

首先传入了全是0的IV,可以看到解出的明文最后一位不是0x01,然后就一步步加IV的值,直到最后一位的明文是0x01。

现在,通过反向计算,可以得到Intermediary Value的最后一位。现在固定这已经得到的最后一位的值,改变IV的最后一位的值,使明文最后一位变为0x02。之后像得到0x01那样把倒数第二位跑成0x02。

这样就得到两位Intermediary Value了,于是继续这样跑,直到明文都变成0x08,得到全部正确的Intermediary Value,再输入正确的,也就是攻击目标用的IV,就可以得到原来的明文了。

Code

研究好了再发上来

Bit Flipping Attack

原题NJCTF 2017的be admin中,不只需要得到明文,还需要使ID解出来是admin\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b才行,所以这里需要用到比特翻转攻击

上文涉及到的异或都带过了,其实这里会用到比特翻转攻击。

比特翻转攻击的原理还是很好理解。就是如果知道C = A xor B的话,那么A,B,C这三者中的任意两个进行异或就必然可以得到第三个的值。

假设C为上面提到的中间值,A为初始向量,B为解密后的明文。

现在想把明文A给替换成D,那么只要改变A = C xor B就行了,也就是A = A xor B xor D。

这时候修改A为A = A xor B xor D,就可以干扰解密过程,把明文解密成我们想要的样子,比如把user解密成admin。(这里还需要记得对填充信息进行异或处理)

实施这个攻击需要两个先决条件:

参考

http://blog.gdssecurity.com/labs/2010/9/14/automated-padding-oracle-attacks-with-padbuster.html

Responses