Padding Oracle

一、补位

常规的对称加密算法如DES或AES使用的是分组加密

8位分成一块,不足的位数补齐,缺n补0xn,如缺2位则补0x2

BLOCK  BLOCK  Ex1(Padded)  Ex2  Ex2(Pad#d)  Ex3  Ex3(Padded)  Ex4  Ex4(Padded)  Ex 5  Ex5(Padded)  0 , 02  0 , 02

二、CBC的初始向量

第一组加密使用的初始向量是随机的,后面的组使用的初始向量为前一组加密后的密文

Plaintext  Initialization (IV)  Block Cipher  Encryption  Ciphertext  Key  Pla in text  Block Cipher  Encryption  Ciphertext  Key  Plaintext  Block Cipher  Encryption  Ciphertext

解密过程则是加密过程反过来

Initialization (IV)  Ciphertext  Block Cipher  Decryption  Plaintext  Key  Ciphertext  Block Cipher  Decryption  Key  Ciphertext  Block Cipher  Dec ryptim  Plaintext

三、padding攻击

假设一个服务的请求如下: http://sampleapp/home.jsp?UID=B216A634951170FF851D6CC68FC9537858795A28ED4AAC6

UID后面的即是密文,是十六进制的形式,前8字节7B216A634951170F则是初始向量

假设要加密的数据为BARIN;12;1

加密过程如下:

BLOCK 1  Initialization Vector  TRIPLE DES  Output (HEX) 0 0 : 0 0 C 0 $ 8 0 ~ 0 ~  BLOCK

解密过程如下

9NIOOVd anvA  LE" 8910  530  LBXO  6bX0 E9XC Y9X0 tZX0  S30  2:30  (popped) d  (EH) Induı paldA13ü3

整个加密过程中初始向量已知,明文及中间值(Intermediary Value)未知,中间值经过3DES加密后的值未知

但是经过3DES加密后的值如果是非法的,比如补齐错误,即缺n补的缺不是n,服务器则会报500错误

可以设置初始向量为000000000000000,即链接为http://sampleapp/home.jsp?UID=0000000000000000F851D6CC68FC9537

一开始,服务器肯定报500错误,因为第二组必须都为0x8才是合法的请求

i.

之后,将初始向量递增1,用http://sampleapp/home.jsp?UID=0000000000000001F851D6CC68FC9537去试探,自然也是报错

Encryped Input  BLOCK lot 1  s5وةوةةو

不断递增测试,必然有一个初始向量,使得最后一位的Padding规则满足条件,如000000000000003C

img

由此可以推出所有中间值,再将中间值与初始向量7B216A634951170F异或,则可以得到明文

四、拓展

当中间值最后两位是0x02 0x00,而我们测试的初始向量最后两位是0x00 0x02时,也就是探测最后一位是0x02时,最终的Padding的最后两位是0x02 0x02,必然也满足Padding规则,服务器当然也会返回200。可见,仅仅依靠我们递增最后一位和测试服务器是否返回200,是没办法确认最终的Padding是0×01的

那么怎么才能确认呢?观察异或的过程,可以看出,如果padding是0×01,那么,倒数第二位是什么,并不会影响服务器测试结果(因为改变倒数第二位,仅仅是改变了解码后的明文,会导致明文验证过程异常,但是解密过程是没有任何异常的),此时服务器还是返回200。但如果Padding是0x02 0x02,则改变倒数第二位,会导致解密异常,服务器返回500。因此,我们通过测试倒数第二位,确认了探测过程中得到的Padding是0×01

五、防御

禁用SSLv3,当有兼容性问题时,

禁用以下CipherSuite

IDEA-CBC-SHA, EXP-DES-CBC-SHA, DES-CBC-SHA, DES-CBC3-SHA, EXP-DH-DSS-DES-CBC-SHA, DH-DSS-DES-CBC-SHA, DH-DSS-DES-CBC3-SHA, EXP-DH-RSA-DES-CBC-SHA, DH-RSA-DES-CBC-SHA, DH-RSA-DES-CBC3-SHA, EXP-DHE-DSS-DES-CBC-SHA, DHE-DSS-CBC-SHA, DHE-DSS-DES-CBC3-SHA, EXP-DHE-RSA-DES-CBC-SHA, DHE-RSA-DES-CBC-SHA, DHE-RSA-DES-CBC3-SHA, EXP-ADH-DES-CBC-SHA, ADH-DES-CBC-SHA, ADH-DES-CBC3-SHA, EXP-RC2-CBC-MD5, IDEA-CBC-SHA, EXP-DES-CBC-SHA, DES-CBC-SHA, DES-CBC3-SHA, EXP-DHE-DSS-DES-CBC-SHA, DHE-DSS-CBC-SHA, DHE-DSS-DES-CBC3-SHA, EXP-DHE-RSA-DES-CBC-SHA, DHE-RSA-DES-CBC-SHA, DHE-RSA-DES-CBC3-SHA, ADH-DES-CBC-SHA, ADH-DES-CBC3-SHA, AES128-SHA, AES256-SHA, DH-DSS-AES128-SHA, DH-DSS-AES256-SHA, DH-RSA-AES128-SHA, DH-RSA-AES256-SHA, DHE-DSS-AES128-SHA, DHE-DSS-AES256-SHA, DHE-RSA-AES128-SHA, DHE-RSA-AES256-SHA, ADH-AES128-SHA, ADH-AES256-SHA