分组加密算法CBC模式的 Padding Oracle Attack 与 Hash算法的Length Extention Attack 小记

对Padding Oracle Attack与哈希扩展长度攻击想做个精炼总结,故作此记录。

 

  首先,这两个漏洞都与padding有关(不完美的技术细节总是容易出漏洞)。

  其次,这两个漏洞都是算法或算法模式本身的缺陷,但也都需要开发人员其他的一些疏忽才能被利用,例如Padding Oracle需要解密结果错误回显,Length Extention需要可修改的关键信息放在字符串后部。所以也都有开发层面的解决办法。

  最后,Padding Oracle的原因是错误回显的开启导致而已用户可以通过改变IV的方式一步步试出加解密中间值,最后再与真实IV运算得出明文,也可以通过此种方式将密文解密成任意指定明文(修改IV),整个过程不需要知道密钥,这种攻击可以归为旁敲侧击的侧信道攻击范畴。而Length Extention的原因是MD5、SHA-1等使用的Merkle–Damgård construction压缩算法,使得手动在明文后面添加padding之后,可以使用原来明文的hash值作为下一轮运算的输入,从而在不知道明文的情况下,构造出“明文+padding+somethingelse”形式的hash值,进而绕过某些鉴权判断。

 

一点疑惑:padding中的\0会不会被截断从而无法完成攻击?

 解答:一般不会。\0本质上是一个普通的char,只是被c选做字符串终结符了。c的字符串只是逻辑上的一个需求,并不是一个数据类型。因为c没有字符串类型,采用\0结束的字符数组的概念来表示字符串也是权宜之计,称为“c风格字符串”。

高级语言(C++、PHP、Python、Java等)开始有了真正的字符串类型。字符串对象有长度字段,因而不需要终结符(例如python中str="\x00\x00\x00\x00"),从而会将\0当做正常字符处理。

某些高级语言的低版本(PHP)曾经有过以\0作终结符的问题,这导致了上传的0截断问题。如何选取终结符是逻辑处理需要解决的问题,例如http消息格式里的\n,$,&,#等。

 

 

参考:

https://zh.wikipedia.org/wiki/%E9%95%BF%E5%BA%A6%E6%89%A9%E5%B1%95%E6%94%BB%E5%87%BB

 https://segmentfault.com/q/1010000005141633

posted @ 2017-10-16 10:33  rec0rd  阅读(308)  评论(0编辑  收藏  举报