SHA1¶
CRYPTO · 知识域。SHA-1/SHA-2 系列哈希攻击,核心是长度拓展与选择性前缀碰撞。标签:哈希长度拓展攻击。
触发特征¶
sha1(MAC = SHA1(SECRET ‖ data))结构的 token/签名。- 40 位十六进制哈希;git 对象校验、证书链题目。
哈希长度拓展攻击¶
- 原理:Merkle-Damgård 结构输出即内部状态;已知
SHA(secret‖msg)与len(secret),可计算SHA(secret‖msg‖padding‖append)不需知道 secret。 - 步骤:
hashpumpy.hashpump(known_sig, known_data, append, keylen)枚举 keylen;- 新 data =
msg + glue_padding + append带新 sig 发送; - 服务端重算哈希恰好等于新 sig。
- 工具:
hashpump(CLI)、hashpumpy(Python)、Hash_Length_Extension脚本族。 - UTF-8 高位字节绕过:拓展时 padding 字节用高位变体绕服务端校验(2018 CTF 变体)。
- 组合利用:长度拓展 + AES-CBC cookie 伪造(签名过了再用 CBC 位翻转改权限,2018)。
- 原题:PlaidCTF 2014、ASIS CTF 2017、SHA-256 变体(CryptoCat 套路)。
SHA-1 碰撞¶
- 等价前缀碰撞(SHAttered,2017):PDF 两文件同 SHA-1;CTF 中用于绕过"上传文件哈希唯一"校验。
- 选择性前缀碰撞(2020):构造任意前缀的两消息同哈希 → polyglot 证书/文档(CTF 出题复刻成本高,识别为主)。
- 碰撞生成成本高时,题目实际考"碰撞检测缺陷":比较前 N 字节、大小写、截断。
SHA-2 系攻击¶
- SHA-256 基向量攻击:XOR 聚合哈希
⊕SHA256(x_i)中选基向量绕过(2019)。 - 海绵结构 MITM:rate < state 时未受控字节可做中间相遇,2^48 → 2^24(BKP 2017)。
- 哈希环回(Floyd/Brent 判圈):哈希链迭代中找环恢复前像(2018)。
- 迭代 SHA-256 逐字符时间差 oracle:字符匹配多迭代一轮 → 时间侧信道逐位恢复(2019)。
工具速查¶
hashpump -s <sig> --data <known> -a '&admin=1' -k 8 # 逐个试 keylen
hashcat -m 100 sha1.txt rockyou.txt
# SHA-1 碰撞样本:https://shattered.io
转向¶
例题¶
hashpump / hashpumpy 实战(PlaidCTF 2014)¶
sig = SHA1(SECRET ‖ data),追加 ;admin=true 重签:
hashpump --keylength 8 \
--signature 'ef16c2...ed5c3' \
--data 'original_data' \
--additional ';admin=true'
# 输出新签名与新 data(含 glue padding 字节)
import hashpumpy
new_hash, new_data = hashpumpy.hashpump(original_hash, original_data, append_data, secret_length)
# secret 长度未知时 1~32 逐个枚举,发过去看哪个通过校验
关键认知:MD5/SHA1/SHA256 的输出**就是**内部状态——从已知输出继续哈希即可续算;只有 HMAC(H(K⊕opad ‖ H(K⊕ipad ‖ msg)))免疫此攻击。