看了好多次,每次总是记不住,所以现在边看边做笔记加深理解。= =
1. MD5加密原理
- 首先是分组。MD5加密将二进制字符串按照512位(也就是64字节)分为一组,然后再把每组分成16个子分组,每组32位。
- 分完组后就要进行填充,填充分为两部。首先使他补充到N*64+56字节。填充的规则(按照二进制)是先填一个1,之后再填0。按照16进制来算,就是先填一个8,然后填0,直到长度满足N*64+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值。
实现原理
接下来我们一道ctf题作为例子,源码如下:
<?php
$secret="XXXXXXXXXXXXXXX"; // This secret is 15 characters long for security!
$username="admin";
$password = $_POST["password"];
if($COOKIE["getmein"] === md5($secret . urldecode($username . $password))){
echo "Congratulations! You are a registered user.\n";
die ("The flag is ". $flag);
}else{
die("Your cookies don't match up! STOP HACKING THIS SITE.");
}
?>
题目里面已知salt的明文长度为15,,并且salt+adminadmin的md5为571580b26c65f306376d4f64e53cb5c7
,它是由salt + 'adminadmin' + 填充数据再经过运算得来的。
由之前介绍的md5算法我们得知对每一个子分组进行运算的时候,都是根据上一轮的abcd来算的,我们把已知的md5分为四组并且按照小端排序:
a = 0xb2801557
b = 0x06f3656c
c = 0x644f6d37
d = 0xc7b53ce5
如果我们想在不知道salt的情况下获得salt加密后的md5,也就是**salt + 'adminadmin' + 填充数据 + 'balabala' **的md5值,就可以利用上面的abcd对'balabala'进行上面所说的md5运算就可以了。
这里可以运用一个HashPump的工具
git安装后,直接命令行输入:
hashpump -s 571580b26c65f306376d4f64e53cb5c7 -d admin -k 20 -a balabala
就可以得到:
e6a87a1dac03d979a507a8b3a3a53f50
admin\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x00\x00balabala