哈系长度扩展攻击-hashpumpy
工具
1 | git clone https://github.com/bwall/HashPump |
至于想在python里实现hashpump,可以使用hashpumpy这个插件:
(注意还是得先安装了libssl-dev)
1 | pip install hashpumpy |
推荐在linux里使用,使用方法可以这样获取:
1 | python |
HashPump用法
这里以一个实验吧题目为例,关键的代码大概如下:
[](javascript:void(0);)
1 | <?php |
[](javascript:void(0);)
在题目里可以得到:
1 | md5($secret."adminadmin")的值为571580b26c65f306376d4f64e53cb5c7 |
稍微整理下我们已经知道的:
1 | $secret是密文,长度为15,如果再算上后面第一个admin,长度就是20 |
这时候我们使用HashPump,附加数据至少1位以上:
1 | # hashpump |
或者直接
1 | hashpump -s 571580b26c65f306376d4f64e53cb5c7 -d admin -k 20 -a pcat |
就会得到
1 | 3e67e8f0c05e1ad68020df30bbc505f5 |
第一个是新的签名,把它设置到cookies的getmein里。
第二个先把\x
替换为%后,post提交
1 | password=admin%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%c8%00%00%00%00%00%00%00pcat |
就可以通过了。
原理
1. MD5加密原理
- 首先是分组。MD5加密将二进制字符串按照512位(也就是64字节)分为一组,然后再把每组分成16个子分组,每组32位。
- 分完组后就要进行填充,填充分为两部。首先使他补充到N64+56字节。填充的规则(按照二进制)是先填一个1,之后再填0。按照16进制来算,就是先填一个8,然后填0,直到长度满足N64+56为止。
- 填充的第二步。之前的长度已经是N*64+56字节了,接下来我们还要填充8字节,用来描述原始二进制字符串的长度。这样最后的数据就是(N+1)*64字节。例如,'abcd’这四个字母,他的长度是4个字节也就是32bit,用十六进制来描述其长度的话就是20,这样最后最后八个字节就是20000000。(为什么是20000000而不是00000020呢,因为md5中存储都是用的小端方式)。如果原始二进制字符串的长度超出了64位(8字节)所能表示的,就只取低长度的低64位。
- MD5算法中有四个被称作链接变量(魔数,向量)的整数参数,他们的长度都是32位,分别是:A=0x01234567,B=0x89abcdef,C=0xfedcba98,D=0x76543210。(但是在md5中要按照上面说的小端方式)
- 把ABCD的值赋值给abcd,用abcd对一个分组的子分组进行一系列神奇的运算,得出新的abcd,然后这个新的abcd又和下一个分组进行神奇的运算,以此类推,最后就会得出一个128位加密后的值,用16进制来表示也就是我们看到的32位的md5。
2. 加盐措施介绍
以往网站开发人员常常把用户密码的md5值存储在数据库,但攻击者常常把一些常用字符串生成md5字典,通过比较网站数据库密码的md5值得到真正的密码。为了加强安全,开发人员又通过加盐(salt)的方式来存储密码数据,具体措施是自定义一个字符串,这个字符串谁都看不到。当用户进行注册的时候,把md5(salt+密码)的值进行存储,以后用户每次登陆都在后台把用户输入的密码加盐再md5加密与数据库进行比较。由于攻击者不知道盐是什么,很难通过爆破的方式来获取密码。
3. MD5拓展攻击
MD5拓展攻击正是针对加盐措施的一种升级后的攻击手段,我们可以在不知道盐的情况下得出加盐后的md5的值。但需要在以下条件才能实现:
- 我们要知道salt的长度。
- 要知道任意一个由salt加密后的md5值,并且知道没有加盐的明文。
- 用户可以提交md5值。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Rick!
评论