
一、前言在CTF密码学赛道里哈希Hash函数是仅次于椭圆曲线的高频考点从基础的哈希碰撞、爆破到进阶的长度扩展攻击、哈希截断、加盐哈希破解都是CryptoHack平台的经典题型。很多刚入门的安全学习者只知道 md5() 、 sha1() 用来做加密校验却完全不清楚哈希内部的分组迭代结构而长度扩展攻击正是利用MD5、SHA1这类MD结构哈希的底层特性实现利用也是CryptoHack哈希板块必刷的入门进阶题。本文选用CryptoHack经典哈希题型带大家从零理解哈希长度扩展原理手写Python利用脚本完整复现解题全过程适合CTF新手收藏学习。二、题目背景与已知条件1. 题目场景平台原题考察经典 MD5长度扩展攻击Length Extension Attack这类攻击针对以 MD 结构设计的哈希算法MD4/MD5/SHA0/SHA1核心漏洞在于哈希运算会把上一组的输出状态直接作为下一组运算的初始向量。攻击者在不知道原始密钥的前提下可以追加自定义数据算出合法的新哈希值。2. 题目给出信息1. 后端服务逻辑服务器拼接 secret data 字符串对拼接结果做MD5哈希 hash md5(secret user_input)2. 已知合法原始输入 dataadmin 对应的MD5哈希值为 5f4dcc3b5aa765d61d8327deb882cf993. 我们不知道secret的长度和内容目标在原始字符串尾部追加 flag1 构造出新的合法md5值拿到flag。关键前提MD5会对原始数据进行padding填充这也是长度扩展攻击的核心突破口。三、哈希基础核心知识点3.1 什么是哈希函数哈希函数是单向不可逆函数任意长度输入都会输出固定长度的摘要MD5为128bit32位十六进制字符具备三大特性1. 单向性无法从哈希值反推原始明文2. 雪崩效应明文微小改动哈希结果完全改变3. 定长输出输入长短不一输出长度固定MD5属于Merkle–DamgårdMD迭代结构这也是长度扩展攻击能够实现的根本原因。3.2 MD5填充规则PaddingMD5处理数据时会按照512bit64字节为一组进行分组填充规则固定1. 在明文末尾先补一个二进制 12. 后续全部补 0 直到剩余长度刚好等于448bit3. 最后64bit填入原始明文的二进制长度小端序哪怕我们不知道secret只要知道原始 secretadmin 的最终MD5状态四个32位寄存器值就可以把这个状态当成新的初始IV继续在填充位后面追加新数据计算出正确的新哈希。3.3 长度扩展攻击核心逻辑原始 md5(secret admin) hash1攻击者构造 secret admin [MD5填充字节] flag1我们不需要破解secret只需要提取hash1拆解出MD5寄存器状态直接迭代计算后续分组就能得到新的有效MD5哈希值。四、分步解题思路步骤1拆解MD5哈希值为寄存器状态MD5最终输出的32位十六进制字符串由4个小端序的32位寄存器 A、B、C、D 拼接而成。我们需要把已知哈希 5f4dcc3b5aa765d61d8327deb882cf99 还原成初始状态。步骤2暴力枚举secret长度secret长度是未知的但是长度一般不会太长我们可以循环遍历长度1~30依次尝试构造填充数据生成扩展后的哈希对接平台校验即可。步骤3Python脚本实现攻击Python内置的 hashlib 无法自定义哈希初始状态这里使用第三方库 hashpumpy 专门用来做哈希长度扩展攻击是CTF刷题标配工具。环境安装bashpip install hashpumpy完整利用代码pythonimport hashpumpy# 题目已知参数original_hash 5f4dcc3b5aa765d61d8327deb882cf99 # md5(secretadmin)original_data badminappend_data bflag1# 暴力枚举密钥长度secret长度一般不会超过30位for secret_len in range(1, 31):total_len secret_len len(original_data)try:# 执行长度扩展攻击new_hash, forged_data hashpumpy.hashpump(original_hash, original_data, append_data, total_len)print(f密钥长度:{secret_len})print(f伪造后MD5:{new_hash})print(f完整伪造字节串:{forged_data}\n)except Exception as e:continue代码运行解释1. hashpumpy.hashpump() 四个参数分别为原始哈希、原始后缀数据、需要追加的数据、原始总长度(secretadmin)2. 输出两个结果新的合法MD5哈希、拼接好填充位的完整伪造字符串3. 将输出的 forged_data 作为提交参数搭配对应 new_hash 即可通过服务端校验拿到flag。五、手动验证MD5填充示例举个简单例子明文 admin 5字节二进制长度40bit1. 末尾加 1 剩余需要补0至448bit2. 最后8字节写入数字 40 的小端序64位二进制最终组成完整64字节MD5分组。长度扩展攻击就是复用这个分组结束后的寄存器状态继续计算下一组数据。六、新手高频踩坑点1. 分不清大小端序MD5寄存器是小端存储手动拆分哈希时很容易顺序颠倒优先使用hashpumpy库避免手算错误。2. 混淆哈希算法长度扩展攻击只适用于MD结构哈希SHA256、SHA3、blake2做了修复无法使用该攻击。3. 长度计算错误总长度是密钥原始数据的字节数不是字符数中文、特殊符号会占用多个字节。4. 直接拼接字符串很多新手直接 secretadminflag1 忽略MD5强制填充位哈希结果一定校验失败。七、哈希安全防护方案做完这道题我们可以总结防御长度扩展攻击的方案也是工程开发中的最佳实践1. 优先使用SHA2-256、SHA3、BLAKE3等抗长度扩展哈希算法2. 采用HMAC哈希认证 hmac(secret, data, md5) 通过密钥嵌套彻底阻断状态复用3. 固定数据格式校验数据长度、特殊分隔符阻断恶意追加数据八、知识点延伸CryptoHack后续刷题路线1. 基础哈希哈希爆破字典爆破、暴力穷举弱口令md5、哈希碰撞2. 进阶哈希SHA1长度扩展、自定义IV哈希绕过、哈希截断漏洞3. 工程应用HMAC签名伪造、JWT哈希破解、加盐哈希破解九、总结这道CryptoHack长度扩展攻击题是从“只会调用哈希函数”进阶到“看懂哈希底层结构”的分水岭。哈希看似简单的加密摘要算法底层分组迭代逻辑暗藏高危漏洞也是Web安全、密码学渗透中非常经典的考点。吃透MD5填充规则和长度扩展原理后续面对各类哈希类CTF题目都可以轻松应对。后续会持续更新CryptoHack哈希、RSA、椭圆曲线全系列解题教程欢迎点赞收藏一起通关CTF密码学题库