CBC…
Padding_Oracle_Attack
0x01
Padding Oracle是针对分组加密的CBC模式,Attack针对的Padding模式为PKCS#5/PKCS#7
.
What’s CBC?
以上清楚的表达了CBC的工作模式流程. 其中:
Plaintext表示被填充后的明文块
IV表示初始向量
Key表示加密密钥
Ciphertext表示加密后的密文块
各种分组加密算法块大小
Cipher | Block Size |
---|---|
AES | 16 Bytes |
ARC2 | 8 Bytes |
Blowfish | 8 Bytes |
CAST | 8 Bytes |
DES | 8 Bytes |
DES3 | 8 Bytes |
IDEA | 8 Bytes |
RC5 | 8 Bytes |
Why Can Attack?
PKSC#5 填充
填充方式:明文最后一个数据块填充N个字节的数据.(N却决于最后剩余的空字节数)
如下图:
以数据块长度是8个字节为例,可填充的值范围是0x01~0x08
,可以看出填充的规则就是填充值是可填充个数.
由于解密的过程中,如果最后的明文数据块不符合填充规则,大部分的解密程序会抛出异常,而这个异常就作为是验证Padding Oracle Attack的基础.
How?
条件
- 初始变量
IV
可控[已知] - 加密后的密文已知并可控
应用程序接受到密文,返回情况:
- 密文正确,填充正确,明文正确,返回200
- 密文非法,填充错误,返回500
- 密文合法,填充正确,返回200
以上返回状况针对不同的解密程序而不同. 第2/3种情况是利用所需要的.
CBC加/解密模式详解:
接下以"BRIAN;12;2"作为明文给出加密以及解密过程图示
其中IV
会通过例如?en=7B216A634951170FF851D6CC68FC9537858795A28ED4AAC6
给出
填充以及加密
加密
解密
可以从图中看出解密得出最后的数据块是正确的填充序列.
其中的Intermediary Value下面用IVa
来表示
Two Ways
1.通过Padding Oracle Attack获取明文的方式. 2.Padding Oracle Attack还可以用来构造指定明文的密文.
获取明文
由于初始变量的可控,修改初始变量并且对第一块密文进行单独解密.
2.
不同于获取明文,构造密文最重要的是获取IV
,并且还要利用之前获取的IVa
.
要求第一个数据块解密为’TEST',可以从CBC的解密模式中得出,只需要明文字节异或对应的IVa
即可得到IV
.
当然这是填充一个数据块的方式,如果填充的数据块更多怎么办?
这个时候仔细研究CBC的解密模式,你就会发现一个数据块获得的IV
可以当作上个数据块的密文.
这样就能使用之前推算IVa
的方式,不同的是这次需要获取的值就是攻击者自己传入的IV
.
然后用获取的IV
在进行此类的推算,最后获取完整的密文和初始变量IV
.
0x02
Eg: 攻击的演示:
Plain = 'BRIAN;12;2'
iv = '12346578'
Plain = 'S_Dante'
key = 'abcdefgh'
cipher = 'des'
0x03
Padding Oracle Attack 最为巧妙的地方是不用获取密钥而就可以利用程序获取想要的东西.
0x04 实例-Shiro
(ง •_•)ง 2017-07-21 14:49:08 星期五