1. 哈希长度扩展攻击实验
本博客内容旨在技术学习交流,仅供学习参考之用,请勿用于任何非法用途,否则后果作者概不负责
本文主要介绍哈希长度攻击的主要流程与具体实现
参照:
2. 原理介绍
- 哈希长度扩展攻击(Hash Length Extension Attack)是指针对某些允许包含额外信息的加密散列函数的攻击手段。该攻击适用于在消息与密钥的长度已知的情形下,所有采取了 $H(secret ∥ message)$ 此类构造的散列函数。MD5和SHA-1等基于Merkle–Damgård构造的算法均对此类攻击显示出脆弱性
- Merkle-Damgård哈希函数首先应用符合MD的填充函数来创建大小为固定数字(例如512或1024)的倍数的输入 。然后,散列函数将结果分解为固定大小的块,并使用压缩函数一次处理一个,每次将输入块与前一轮的输出组合。如图1所示

- 在实践中,服务器依据客户端传输的$Hash$值与$Message$值重新计算$HM’$,并判断$HM$是否等于$HM’$,以此确保信息的真实性与完整性
3. 攻击过程介绍
在哈希长度扩展攻击中,攻击者事先掌握的信息包含:
- 消息被附加了密钥$secret$(密钥长度已知或未知)
- 消息原文$message$
- 哈希函数$H( )$
- 哈希值 $HM=H(secret ∥ message)$
在掌握以上信息的基础上,攻击者只需要根据上一轮输出的链变量($HM$)继续进行一次哈希,得到新的$HM ‘$,具体操作为:
获取新$Message$值:
- 先将$secret||message$段通过长度扩展的方式填充为一个块(block)的大小,此处为64字节(注:此处$secret$并非本值,只是长度填充)
1
2
3
40000 73 65 63 72 65 74 64 61 74 61 80 00 00 00 00 00 secretdata......
0010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0030 00 00 00 00 00 00 00 00 50 00 00 00 00 00 00 00 ........P.......- 再在末尾加上扩展值$append$
1
2
3
4
50000 73 65 63 72 65 74 64 61 74 61 80 00 00 00 00 00 secretdata......
0010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0030 00 00 00 00 00 00 00 00 50 00 00 00 00 00 00 00 ........P.......
0040 61 70 70 65 6e 64 append- 我们知道最后服务器会在我们提交的$Message$前附加$secret$前缀,所以我们去掉前面占位的$secret$,并做$urlencode()$转换,最终得到新的$Message$
获取新$HM ‘$
$HM ‘=H(HM,append)$
对比结果展示:
before | after | |
---|---|---|
$H( )$ | $md5/sha1/sha256$… | $md5/sha1/sha256$… |
$HM$ | $H(secret ∥ message)$ | $H(secret ∥ message |
$Message$ | $message$ | $message |
4. 实验步骤介绍
4.1. 预备——实验工具与环境
实验使用的工具包含:
- Hash_Extender
- Burp Suite
实验环境:cryptOMG的challenge 5
4.2. 发现漏洞
- 根据url中参数hash值的长度(40),可判断其所用的哈希算法(大概率)是$sha1$
- 通过对比计算发现,url中包含的hash参数值并非$H_{sha1}(mesage)$,可以猜测是附加了$secret$值构成的$H_{sha1}(secret ∥ message)$,由此,判断可能可以运用哈希长度扩展攻击
4.3. 利用漏洞
- 运用Hash_Extender:根据Hash_Extender语法,在shell中输入以下命令,得到url中algo、file和hash参数对应值,输出结果如图2所示(注:本处选取的‘ ’../ ‘ 数量并非唯一可能,经测试选用其他数量也可在最终得到passwd结果)
1 | ./hash_extender -f sha1 --data 'test' --s '93e8aee4ec259392da7c273b05e29f4595c5b9c6' --secret-min=10 --secret-max=40 --append '../../../../../../../../../../../../../../etc/passwd' --out-data-format=html --table > hash |

使用Burp Suite工具攻击:
设置代理服务器,设置监听地址与窗口,示例如下
图3:代理地址与端口设置 打开测试页面抓包,示例如下
图4:抓包结果展示 转入intruder,配置攻击方式,如下图所示
图5:攻击目标地址与端口设置 图6:攻击方式与url参数设置 图7:载入参数字符串文本 结果如下图所示
图8:结果展示
使用python脚本攻击
基本原理是使用requests库的GET请求,并判断返回状态码。输出结果显示$secret$长度与成功的url
1 | def test(url, i): |
5. 攻击结果展示
