CTF中Web题目一般会有一个或多个包含密码学的题目,这块一直是弱项,这几天恶补了一波,总结一下,方便之后复习、寻找思路。
写到最后发现有点多了,做个目录。
ECB
CBC
Padding Oracle Attack
CFB
hash长度扩展攻击
(PS:温馨提示,本文涉及代码均可左右滑动查看哦~)
ECB
参考:分组密码模式: ECB模式(电子密码本模式) (http://www.cnblogs.com/dacainiao/p/5521646.html)
加、解密过程如图:
可以看到明文分组和密文分组是一一对应的,且每一对分组都是单独加密的。那么攻击方式就很明显了,我们对某个密文分组进行修改,与之对应的明文在解密时就会被修改,由于每个分组是单独加密的,所以对其他的分组是没有影响的。
例题: 直接上代码吧
简单分析一下,只要 ,就可以得到flag。而在前面将uid设置为9并加密,而且将注册的username也进行了加密,两者都使用了ebc加密。username是可控的,可以通过注册一个特殊的用户名来获得uid的密文进行替换。 首先我们通过fuzz来获取分组的长度,代码如下:
通过查看username即密文的长度即可判断分组的长度
可以看到分组的长度为16,根据分析写出利用代码:
CBC
参考:分组密码模式: CBC模式(密码分组链接模式) (http://www.cnblogs.com/dacainiao/p/5521866.html)
cbc加密方式同样是先进行分组,区别在于将上一组的密文先与下一组的明文进行XOR,然后再进行加密,解密过程类似。cbc字节翻转攻击 (http://www.tuicool.com/articles/vEVFZz)在ctf中非常常见,一般有两种攻击方式:
iv向量,影响第一个明文分组
第n个密文分组,影响第n+1个明文分组
其中第二个尤为常见,网上有很多题目,这里就不举例子了。放一个比较特殊的,上面两个攻击点都有利用,代码如下:
大体流程就是注册一个用户,将数据序列化后加密,保存到cookie中。注册的用户不能是admin,但只有admin才能看到flag。iv和cipher都放在cookie中,就是可控的,我们可以注册一个 用户,然后通过修改密文进行字节翻转将1翻转为a。但是这样做必然会将前一组数据破坏掉,导致解密出来的是数据乱码。注意看check_login这个函数中的这行代码
如果数据被破坏,unserialize是无法执行成功的,我们就拿不到flag。还记得cookie里的iv吗?它并不是没有用的,我们需要再对iv进行翻转来保证第一个明文分组数据的正确性。不知道说的清不清楚,上个脚本吧。
cbc就介绍这么多
padding oracle attack
padding oracle attack其实也是对cbc模式加密的一种攻击,具体分析下面这篇文章介绍的很详细,不再赘述。我对Padding Oracle攻击的分析和思考(详细) (http://www.freebuf.com/articles/web/15504.html)这里截取一些重要的部分(划个重点~)
攻击成立的两个重要条件
1.攻击者能够获得密文(Ciphertext),以及附带在密文前面的IV(初始化向量)
2.攻击者能够触发密文的解密过程,且能够知道密文的解密结果
padding只有可能在0x01~0x08之间
还有一些我们看着测试代码来分析,代码取自下面两位大佬的blog。
从DES加密到Padding Oracle Attack (http://www.bertramc.cn/2017/03/25/19.html)
如果代码运行不了的话应该是没有安装或php没有开启 扩展。 首先什么参数也不加,获取iv及密文,满足攻击所需的两个条件。
接着我们将密文取出,并将iv置为
下面就是不断调整iv直到算出正确的padding
这里个人认为还是要把这个图解释一下,图中的 是中间值, 才是初始化的iv。 以测试代码为例,padding 0x01的结果为
同理padding 0x02,需要再次调整iv(0x98 ^ 0x02 = 0x9a),这地方可能有点绕,靠个人理解吧。。。 利用脚本如下:
只测试了第一轮,运行结果如下:
如果想测试下一分组,根据cbc加密的原理,只要把iv换为第一分组的密文即可。
利用工具:
https://github.com/mpgn/Padding-oracle-attack/blob/master/exploit.py
https://github.com/GDSSecurity/PadBuster
实战:Padding Oracle Attack 笔记 (https://www.secpulse.com/archives/3537.html)
CFB
参考:分组密码模式: CFB模式(密文反馈模式) (http://www.cnblogs.com/dacainiao/p/5521930.html)
cfb的题目比较少,在这里找到了一个Hitcon 2015的题目https://nusgreyhats.org/write-ups/HITCONCTF-Quals-2015-Simple-(Crypto-100)/原题是用ruby写的,这里转化为php。
套路和上面的都差不多,注册一个用户,将username和password json一下,然后加密存到cookie中,json_decode之后 即可。但是正常情况下应该只有info['username']和info['password']。 利用脚本如下:
具体分析代码中写的很详细了,但是这个题目没有体现cfb最典型的攻击——重放攻击,关于这种攻击的一个题目见:cfb重放攻击 (http://www.ifuryst.com/archives/AESCFBAttack.html)
hash长度扩展攻击
详细介绍见另一篇博文:hash长度扩展攻击研究 (http://seaii-blog.com/index.php/2017/05/12/56.html)
参考资料
常见的Web 密码学攻击方式汇总 (http://bobao.360.cn/learning/detail/3100.html)特别感谢这位大佬,代码和例子都给的非常详细
其他的文章都放在文中了
领取专属 10元无门槛券
私享最新 技术干货