CBC…
Padding_Oracle_Attack
0x01
Padding Oracle是针对分组加密的CBC模式,Attack针对的Padding模式为PKCS#5/PKCS#7
.
What’s 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却决于最后剩余的空字节数)
如下图:
0x01~0x08
,可以看出填充的规则就是填充值是可填充个数.
由于解密的过程中,如果最后的明文数据块不符合填充规则,大部分的解密程序会抛出异常,而这个异常就作为是验证Padding Oracle Attack的基础.
How?
条件
- 初始变量
IV
可控[已知] - 加密后的密文已知并可控
应用程序接受到密文,返回情况:
- 密文正确,填充正确,明文正确,返回200
- 密文非法,填充错误,返回500
- 密文合法,填充正确,返回200
以上返回状况针对不同的解密程序而不同. 第2/3种情况是利用所需要的.
CBC加/解密模式详解:
接下以"BRIAN;12;2"作为明文给出加密以及解密过程图示
其中IV
会通过例如?en=7B216A634951170FF851D6CC68FC9537858795A28ED4AAC6
给出
填充以及加密
IVa
来表示
Two Ways
1.通过Padding Oracle Attack获取明文的方式. 2.Padding Oracle Attack还可以用来构造指定明文的密文.
获取明文
由于初始变量的可控,修改初始变量并且对第一块密文进行单独解密.
2.
不同于获取明文,构造密文最重要的是获取IV
,并且还要利用之前获取的IVa
.
要求第一个数据块解密为’TEST',可以从CBC的解密模式中得出,只需要明文字节异或对应的IVa
即可得到IV
.
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 星期五