哈希长度拓展攻击
SECURITY CLEARANCEAUTHORIZED
0x01
做个笔记,有需要了再翻出来看看
0x02.原理
在加密链最后一环添加新的拓展字符,通过控制加密链最后一节控制最终结果。
0x03.流程
0x03.01.md5算法流程
参考图片

对于md5有一串初始向量如下
A=0x67452301
B=0xefcdab89
C=0x98badcfe
D=0x10325476
这一串初始向量和第一个数据块进行运算,得到的值和第二个数据块再次运算,然后以此类推得到最后的一串向量
eg.
A=0xab45bc01
B=0x6a64bb53
C=0x23ba8afe
D=0x46847a62
进行两两合一分组可以得到一组数据
ab 45 bc 01
6a 64 bb 53
23 ba 8a fe
46 84 7a 62
在这之后进行高低位互换,得到如下的一组数据
01 bc 45 ab
53 bb 64 6a
fe 8a ba 23
62 7a 84 46
把这一组数据进行拼接得到md5值 01bc45ab53bb646afe8aba23627a8446
0x03.02.攻击流程
简单点说就是把得到的hash值变换为向量形式,然后再添加拓展字符进行一次额外的加密,通过控制额外加密的拓展字符来实现控制最终结果。
0x04.例题
0x04.01.题目
<?php
include "flag.php";
$secretKey = 'xxxxxx'; #xxx为未知内容,但长度已知为6。
$v1 = $_GET['str'];
$sign = $_GET['sign'];
$token = md5($secretKey.$v1);
if($v1 === 'test') {
die($token); #token=2df51a84abc64a28740d6d2ae8cd7b16
} else {
if($token === $sign) {
die($flag);
}
}
?>
0x04.02.分析
需要实现 $token 的值和 $sign 的值相同且 $v1 === ’test'
而且 $secretKey 是一个未知的数值,所以需要使用拓展攻击
这个时候已知hash值,然后控制着 $v1 == ’test’,得到token值
然后就是这个token值我们在不知道 $secretKey 时没有办法得到这个正确的token值,这里由于这个 $secretKey 只有6位所以可以考虑爆破获取 $secretKey 的值
另一个方法就是用哈希长度拓展攻击来实现 $token === $sign
0x05.拓展知识点
如同MD5算法那般分组后与向量运算的流程被统称为Merkle–Damg?rd结构。
eg.sha1,sha2
除此之外还有一个结构叫海绵结构(找个时间看看)。
eg.sha3
