真理教教会

学习是美德,知识是财富,求道是目的

0%

md5-extension-attack

请看如下网页源码

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
// $random = random();

echo md5($random);
$extension=$_POST['extension'];
$md5 = $_POST['md5'];

if (md5($random . $extension) !== $md5) {
echo "被打穿了呜呜";
}

?>

如何使以上的条件判断成立?
明白这个问题需要知道md5这个算法的结构

Merkle-Damgård结构

该结构,会将输入的数据进行填充并分割成压缩函数f能处理的长度,然后处理分割后的数据
hash的计算方式如下
wiki上截的
一开始的压缩函数以一个固定的向量和第一个分组数据为输入
产生的结果为下一次压缩函数调用需要的向量,与下一组数据同时作为输入进行计算

通过长度拓展劫持加密过程

一个hash的输入必须被填充为512bits的倍数+448bits
即 输入的长度(单位bit)和448关于512同模

再次回顾上面的代码
random的md5实际上是填充后的结果
如果将md5和extension作为输入,再算一次,就能得到random+padding+extension的md5值

1
2
3
$md5 = $_POST['md5'];

if (md5($random . $extension) !== $md5)

代码的这一部分
只要构造extension=padding+extension,就能控制靶机网页的md5计算过程,使其计算出计划中的新md5值

工具

https://github.com/iagox86/hash_extender

参考

https://luoingly.top/post/md5-length-extension-attack/

一杯咖啡钱能温暖一个人的心