哈希长度拓展攻击:哈希长度扩展攻击(hash lengthextensionattacks)是指针对某些允许包含额外信息的加密散列函数的攻击手段。次攻击适用于MD5和SHA-1等基于Merkle–Damgård构造的算法
哈希即为散列值,其中有MD5,SHA256,等算法。以MD5为例
MD5加密:
MD5加密过程中512比特为一组,属于分组加密,而且在运算的过程中,将512比特分为32bit*16块,分块运算
关键利用的是MD5的填充,对加密的字符串进行填充,使之补到448模512同余,即长度为512的倍数减64,最后的64位在补充为原来字符串的长度,这样刚好补满512位的倍数,如果当前明文正好是512bit倍数则再加上一个512bit的一组。
去学习了一波MD5加密原理。大概的过程:
例如字符串"abcde" 对应的16进制编码为0x6162636465 令str=0x6162636465,现在要进行填充补位 使得length(str) % 512 = =418 补位的方式通常为二进制情况下后面添加1个1 然后后面跟多个0 直到满足等式,最后字符为。
0x6162636465000000000000000
0000000000000000000000000000
0000000000000000000000000000
0000000000000000000000000000
002800000000000000
以十六进制表示一共是128个字符,十六进制每个字符能够转换成4位二进制,128*4=512这就是一组,正好是512bit。
MD5拓展攻击:
网上随便找到了一张图可以大概解释一下MD5拓展过程
例如我们现在选定一个字符串 ”hsyhsy“ MD5("hsyhsy")=9468E3A2F1D1CF8D
现在不需要知道具体的字符串是什么,只需要直到长度即可,填充新的字符串:zygzyg,之前得到的“hsyhsy”MD5值作为最后一块加密的初始向量,最后得到的结果和MD5("hsyhsy+zygzyg")是相同的。
实验吧中的一道题可以作为参考:
抓包后
source值改为1
查看源码:
<pre> $flag = "XXXXXXXXXXXXXXXXXXXXXXX"; $secret = "XXXXXXXXXXXXXXX"; // This secret is 15 characters long for security! $username = $_POST["username"]; $password = $_POST["password"]; if (!empty($_COOKIE["getmein"])) { if (urldecode($username) === "admin" && urldecode($password) != "admin") { if ($COOKIE["getmein"] === md5($secret . urldecode($username . $password))) { echo "Congratulations! You are a registered user. "; die ("The flag is ". $flag); } else { die ("Your cookies don't match up! STOP HACKING THIS SITE."); } } else { die ("You are not an admin! LEAVE."); } }
主要源码在这里:
if (!empty($_COOKIE["getmein"])) { if (urldecode($username) === "admin" && urldecode($password) != "admin") { if ($COOKIE["getmein"] === md5($secret . urldecode($username . $password))) { echo "Congratulations! You are a registered user. ";
在抓包的时候已经给出了sample-hash值
代码中提示secret是一个长度为15的字符,这里利用hashpump得出新字符串
最终将将签名getmein为新增加的值,随后添加password为下面的值,post一下就的到了答案。