从一个题目到hash扩展攻击
字数 1227 2025-08-25 22:59:09
Hash长度扩展攻击详解
1. 什么是Hash长度扩展攻击
Hash长度扩展攻击是一种利用hash算法生成机制的漏洞,攻击者可以在原始明文基础上添加新的扩展字符,从而控制加密链的最后一节,最终控制hash结果。
1.1 Hash算法简介
Hash算法(散列算法)是一种将任意长度字符串加密为固定长度字符串的加密算法,生成的密文称为散列值。常见的hash算法包括MD5和SHA-1。
特点:
- 单向函数加密
- 生成信息摘要
- 不可逆性
2. MD5算法详解
2.1 MD5算法过程
MD5算法将消息处理分为以下步骤:
- 消息分组:将消息分为n个512位的分组
- 填充最后一个分组:
- 首先补一个1,然后补0直到长度mod 512=448位
- 最后补上原始消息长度的64位表示
- 初始向量运算:使用固定初始向量与分组进行运算
- 输出结果:最后一轮向量经过高低位互换后得到MD5值
2.2 MD5具体实现示例
以明文"0123456789abcdef"为例:
-
转换为二进制:
def text_to_binary(text_str): binary_str = ' '.join(format(ord(x), 'b') for x in text_str) return binary_str -
填充过程:
- 原始消息:16字节(128位)
- 补1和0至448位(56字节)
- 补原始长度0x80(128的十六进制)
-
初始向量:
A: 0x67452301 B: 0xEFCDAB89 C: 0x98BADCFE D: 0x10325476 -
高低位互换:
如最后一轮结果为0xabcdef12,互换后为0x12efcdab
3. Hash长度扩展攻击原理
3.1 攻击场景
已知:
- secret(攻击者未知)
- data(攻击者已知)
- hash(secret + data)
- secret长度(可通过枚举确定)
攻击者可以构造hash(secret + data + padding + extension)
3.2 攻击示例
题目代码:
error_reporting(0);
$flag = getenv("DASFLAG");
if(isset($_GET["md5"]) && isset($_GET["i"]) && isset($_GET["s"])){
$fl4g = substr_replace($flag, $_GET["s"], $_GET["i"], 1);
if($_GET["md5"] === md5($fl4g)){
echo $flag;
}
}
else{
highlight_file(__FILE__);
echo md5($flag."yusa"); // 已知hash值
}
已知:
- flag长度为38位
- data为"yusa"
- 已知hash(flag + "yusa") = 1c3de59d2f68788cc792e0eb7d604710
3.3 攻击步骤
-
构造填充:
yusa\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00a -
URL编码:
yusa%5Cx80%5Cx00%5Cx00%5Cx00%5Cx00%5Cx00%5Cx00%5Cx00%5Cx00%5Cx00%5Cx00%5Cx00%5Cx00%5Cx00%5Cx00%5Cx17%5Cx00%5Cx00%5Cx00%5Cx00%5Cx00%5Cx00%5Cx00a -
使用已知hash作为初始向量:
9d e5 3d 1c 8c 78 68 2f eb e0 92 c7 10 47 60 7d
3.4 攻击脚本
# 完整攻击脚本见原文
def md5_lea(suffix, res, len_m):
# 实现hash长度扩展攻击
pass
# 使用示例
res = '1c3de59d2f68788cc792e0eb7d604710'
extend = '}'
for i in range(45):
print('[%d]'%i, md5_lea(extend, res, i))
3.5 最终Payload
?md5=d9671633e3723203bc2a1479c8412307&i=-1&s=}yusa%80%00%00%00%00%00%00%00%00%00%00%00%00%00%50%01%00%00%00%00%00%00a
4. 实际危害
- 绕过认证:如登录界面使用MD5(passwd+data)进行校验,可绕过
- 信息泄露:通过响应时间差异可推断secret长度
- 广泛影响:影响MD4, MD5, RIPEMD-160, SHA-0, SHA-1, SHA-256, SHA-512等算法
5. 防御措施
- 双重hash:hash(hash(secret + data))
- HMAC:hash(secret + hash(secret + data))
- 使用更安全的算法:如SHA-3
6. 工具推荐
- hashpump:快速生成攻击payload
- 自定义脚本:根据特定场景调整
7. 总结
Hash长度扩展攻击利用hash算法的分组处理机制,通过已知hash值和数据长度,构造特定填充和扩展,实现对hash结果的控制。防御关键在于打破算法的可预测性,采用更复杂的hash组合方式。