1.长度延展攻击
-
定义:长度扩展攻击(length extension attack),是指针对某些允许包含额外信息的加密散列函数的攻击手段。
-
对于满足以下条件的散列函数,都可以作为攻击对象:
① 加密前将待加密的明文按一定规则填充到固定长度(例如512或1024比特)的倍数;
② 按照该固定长度,将明文分块加密,并用前一个块的加密结果,作为下一块加密的初始向量(Initial Vector)。
-
满足上述要求的散列函数称为Merkle–Damgård散列函数(Merkle–Damgård hash function),下列散列函数都属于Merkle–Damgård散列函数:MD4、MD5、RIPEMD-160、SHA-0、SHA-1、SHA-256、SHA-512、WHIRLPOOL
-
这里有两种类型的长度扩展攻击。符号||表示链接。
- 类型一:如果Digest(Msg1)=Digest(Msg2),并且Len(Msg1)= Len(Msg2),消 息 Msg1 ¹ Msg2,则 Digest(Msg1 ‖ Sufx)= Digest(Msg2‖Sufx)。
- 类型二:假设一个原始消息Msg,攻击者不知道消息的内容,给定Len(Msg),填充消息 X,Digest(Msg),对于一个适当的后缀,攻击者可以计算出Digest(Msg‖Sufx)。
-
通过消息的填充可以抵抗第一类型的攻击;第二类的攻击可以通过大的内部状态来预防。链接变量循环的Hash结构 中使用了消息填充,可以抵抗第一类型的攻击;链接变量长度 n 远大于Hash值长度 l(n>2l) ,也就是说Hash值长度小于链接 变量长度,使得计算 Msg‖Sufx 的 Hash 值时,无法连接。因此,可以抵抗第二类长度扩展攻击。
-
对于H(salt+data)形式的加密,在以下条件满足的情况下,攻击者可以通过该方法获取H(salt+一定规则构造的data):
① 知道密文的加密算法且该算法满足Merkle–Damgård散列函数特征;
② 不知道salt,但知道salt的长度,并可控制data的值;
③ 可以得到一个H(salt+data)的值。
下面以MD5算法为例,讲述该攻击方式如何进行攻击,具体过程如下:
① 填充
-
拿到明文后,MD5先将明文转为二进制文件,然后将二进制文件的长度除以512比特(即64字节),如果余数等于448比特(即64-8字节),那么直接在后面加上八个字节的长度标识,使之成为512比特的倍数。否则则在明文后填一个1,再填充0直至其长度除以512等于448,再加上8位的长度标识。长度是使用大端序(big Endian)来存储,即低字节放在高地址位上。
-
比如加密的明文是admin,其二进制文件以16进制表示是0x61646d696e,长度是40比特(5字节),那么需要补充408比特(51字节)的填充符,填充内容第一位是1,其余全部是0。16进制表示是
0x800000000000000000000000000000000000000000000000000
。然后再添加8个字节的长度标识,admin长度为40比特,16进制是0x28,这个28要放在高位,就是0x280000000000000
。结果如下所示:
② 分块运算
-
填充完毕后,函数就将填充后的明文以512比特的长度分块,进行运算。在运算中会用到四个初始向量(MD5中称作链变量,Chaining Variable),分别是A=
0x67452301
,B=0xefcdab89
,C=0x98badcfe
,D=0x10325476
。经过一系列复杂的数学运算,函数会得到第一块的MD5值,然后将该MD5值分成四块,以大端序形成新的链变量,投入到第二块的运算,形成新的MD5值……以此类推,直到算出最后一块的MD5值,就是整个数据块的MD5值。 -
例如加密的明文是
adminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadmin
,首先根据①的描述的算法填充后,分成两块进行运算,第一块是adminadminadminadminadminadminadminadminadminadminadminadminadmi,其MD5码是e7d6ca05773d038378f5e2674850be25
,分成四块并以大端序存储,则A=0x05cad6e7
,B=0x83033d77
,C=0x76e2f578
,D=0x25be5048
。将这四个变量作为链变量投入运算,再将第二部分加密,得到最终的MD5值是9ea2d490481dbcdadf61e7e404b99585
。
2.实验具体过程
HashPump安装
git clone https://github.com/bwall/HashPump
apt-get install g++ libssl-dev
cd HashPump
make
make install
- 在执行make的时候可能会出现openssl/sha.h没有文件的错误
那么
sudo apt-get install openssl
sudo apt-get install libssl-dev
- 然后make 和make install即可
插件安装
-
hackbar 简介:
- firefox 浏览器的一个插件,可以协助渗透测试者完成 sql 注入、xss 漏洞注入。 -
上传 hackbar 插件包到 kali 系统上:
root@kali:~# unzip hackbar2.1.3-master.zip
root@kali:~# ls hackbar2.1.3-master #查看获得的内容
{4c98c9c7-fc13-4622-b08a-a18923469c1c}.xpi img README.md
- 或在 kali 主机上直接下载
root@kali:~# git clone https://github.com/HCTYMFF/hackbar2.1.3.git
-
Kali 中打开 Firefox 浏览器点击插件
-
点击那个工具栏按钮
-
点击从这里添加
-
打开你下载的位置,点击.xpi文件
-
可以看到这个界面,说明成功了。
-
最后,把快照做好即可
参考链接:https://blog.csdn.net/qq_44930903/article/details/111603033
具体攻击题目
- 其中$secret="1234567890abcde";给玩家不可见,计算也不能使用这个数据,这里展示出来只是为了本地操作
<?php
$secret="1234567890abcde"; // This secret is 15 characters long for security!
$username="admin";
$flag="flag{test}";
$password = $_POST["password"];
if($_POST["getmein"] === md5($secret . urldecode($username . $password))){
echo "Congratulations! You are a registered user.\n<br>";
die ("The flag is ". $flag);
}else{
die("Your cookies don't match up! STOP HACKING THIS SITE.");
}
// md5(1234567890abcdeadminadmin)=93a5e7bea9c040065617b1a62ffc3d72
?>
-
题目中能得到信息
- md5($secret."adminadmin")的值为93a5e7bea9c040065617b1a62ffc3d72
-
稍微整理下我们已经知道的
- $secret是密文,长度为15,如果再算上后面第一个admin,长度就是20
- 而数据是admin
- 签名(哈希值)是93a5e7bea9c040065617b1a62ffc3d72
-
第一步计算payload
-
换一下编码
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%00st4ck&getmein=bf3722a5e102e94a83adef7cbf34a30b
-
由于自带urldecode,所以可以直接使用
-
成功登录