学习
实践
活动
专区
工具
TVP
写文章

CTF中常见的Web密码学攻击方式

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)特别感谢这位大佬,代码和例子都给的非常详细

其他的文章都放在文中了

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180423G0CGD500?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

关注

腾讯云开发者公众号
10元无门槛代金券
洞察腾讯核心技术
剖析业界实践案例
腾讯云开发者公众号二维码

扫码关注腾讯云开发者

领取腾讯云代金券