从一个题目到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算法将消息处理分为以下步骤:

  1. 消息分组:将消息分为n个512位的分组
  2. 填充最后一个分组
    • 首先补一个1,然后补0直到长度mod 512=448位
    • 最后补上原始消息长度的64位表示
  3. 初始向量运算:使用固定初始向量与分组进行运算
  4. 输出结果:最后一轮向量经过高低位互换后得到MD5值

2.2 MD5具体实现示例

以明文"0123456789abcdef"为例:

  1. 转换为二进制

    def text_to_binary(text_str):
        binary_str = ' '.join(format(ord(x), 'b') for x in text_str)
        return binary_str
    
  2. 填充过程

    • 原始消息:16字节(128位)
    • 补1和0至448位(56字节)
    • 补原始长度0x80(128的十六进制)
  3. 初始向量

    A: 0x67452301
    B: 0xEFCDAB89
    C: 0x98BADCFE
    D: 0x10325476
    
  4. 高低位互换
    如最后一轮结果为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 攻击步骤

  1. 构造填充:

    yusa\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00a
    
  2. 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
    
  3. 使用已知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. 实际危害

  1. 绕过认证:如登录界面使用MD5(passwd+data)进行校验,可绕过
  2. 信息泄露:通过响应时间差异可推断secret长度
  3. 广泛影响:影响MD4, MD5, RIPEMD-160, SHA-0, SHA-1, SHA-256, SHA-512等算法

5. 防御措施

  1. 双重hash:hash(hash(secret + data))
  2. HMAC:hash(secret + hash(secret + data))
  3. 使用更安全的算法:如SHA-3

6. 工具推荐

  1. hashpump:快速生成攻击payload
  2. 自定义脚本:根据特定场景调整

7. 总结

Hash长度扩展攻击利用hash算法的分组处理机制,通过已知hash值和数据长度,构造特定填充和扩展,实现对hash结果的控制。防御关键在于打破算法的可预测性,采用更复杂的hash组合方式。

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"为例: 转换为二进制 : 填充过程 : 原始消息:16字节(128位) 补1和0至448位(56字节) 补原始长度0x80(128的十六进制) 初始向量 : 高低位互换 : 如最后一轮结果为0xabcdef12,互换后为0x12efcdab 3. Hash长度扩展攻击原理 3.1 攻击场景 已知: secret(攻击者未知) data(攻击者已知) hash(secret + data) secret长度(可通过枚举确定) 攻击者可以构造hash(secret + data + padding + extension) 3.2 攻击示例 题目代码: 已知: flag长度为38位 data为"yusa" 已知hash(flag + "yusa") = 1c3de59d2f68788cc792e0eb7d604710 3.3 攻击步骤 构造填充: URL编码: 使用已知hash作为初始向量: 3.4 攻击脚本 3.5 最终Payload 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组合方式。