从零学习哈希长度扩展攻击

哈希长度扩展攻击,利用了md5、sha1等加密算法的缺陷,可以在不知道原始密钥的情况下来进行计算出一个对应的hash值。


引言

最开始出现好像是在PCTF2014上
最近做题突然看见了
先来看下代码


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24


<?php

$auth = false;

$role = "guest";

$salt =

if (isset($_COOKIE["role"])) {

$role = unserialize($_COOKIE["role"]);

$hsh = $_COOKIE["hsh"];

if ($role === "admin" && $hsh === md5($salt.strrev($_COOKIE["role"]))) {

$auth = true;

} else {

$auth = false;

}

} else {

$s = serialize($role);

setcookie(‘role‘,$s);

$hsh = md5($salt.strrev($s));

setcookie(‘hsh‘,$hsh);

}

if ($auth) {

echo "<h3>Welcome Admin. Your flag is";

} else {

echo "<h3>Only Admin can see the flag!!</h3>";

}

?>

简单了解hash函数

hash函数补位

当hash函数拿到需要被hash的字符串后,先将其字节长度整除64,取得余数。如果该余数正好等于56,那么就在该字符串最后添加上8个字节的长度描述符(具体用bit表示)。如果不等于56,就先对字符串进行长度填充,填充时第一个字节为hex(80),其他字节均用hex(00)填充,填充至余数为56后,同样增加8个字节的长度描述符(该长度描述符为需要被hash的字符串的长度,不是填充之后整个字符串的长度)。以上过程,称之为补位

hash计算

补位完成后,字符串以64位一组进行分组(因为上面的余数为56,加上8个字节的长度描述符后,正好是64位,凑成一组)。字符串能被分成几组就会进行多少次“复杂的数学变化”。每次进行“复杂的数学变化”都会生成一组新的registers值供下一次“复杂的数学变化”来调用。第一次“复杂的数学变化”会调用程序中的默认值。当后面已经没有分组可以进行数学变化时,该组生成的registers值就是最后的hash值。
在sha1的运算过程中,为确保同一个字符串的sha1值唯一,所以需要保证第一次registers的值也唯一。所以在sha1算法中,registers具有初始值。如上图中的registers值0。
Hash值的随机性完全依赖于进行“复杂的数学变化”时输入的registers值和该次运算中字符串分组的数据。如果进行“复杂数学变化”时输入的registers值和该次运算的字符串分组相同,那么他们各自生成的新的registers值也相同。

如何攻击

了解题意

哈希长度扩展攻击适用于加密情况为: hash($salt . $message) 的情况,其中 hash 最常见的就是 md5、hash1。我们可以在不知道 $salt 的情况下推算出另外一个匹配的值。
如以上代码中我们已知的有:
1.$hsh = $_COOKIE[“hsh”]
2.$role = unserialize($_COOKIE[“role”])
题目要求是我们需要通过构造使得$role === “admin” 时 $hsh === md5($salt.strrev($_COOKIE[“role”]

md5的实现

先将字符串转化为16进制

补位

消息必须进行补位,即使得其长度在对512取模后的值为448。也就是说,len(message)%512==448。当消息长度不满448bit时(注意是位,而不是字符串长度),消息长度达到448bit即可。当然,如果消息长度已经达到448bit,也要进行补位。补位是必须的。
补位的方式的二进制表示是在消息的后面加上一个,后面跟有限个hex(00),直到len(message)%512==448。如下,将字符串补位到448bit,也就是56byte。

补长度

补位过后,第57个字节储存的是补位之前的消息长度。cccc是4个字母,也就是4个字节,32bit。换算成16进制为0x20。其后跟着7个字节的0x00,把消息补满64字节。

计算消息摘要

计算消息摘要必须用补位已经补长度完成之后的消息来进行运算,拿出512bit的消息(即64字节)。计算消息摘要的时候,有一个初始的链变量,用来参与第一轮的运算。MD5的初始链变量为:


1

2

3

4


A=0x67452301

B=0xefcdab89

C=0x98badcfe

D=0x10325476

我们不需要关系计算细节,我们只需要知道经过一次消息摘要后,上面的链变量将会被新的值覆盖,而最后一轮产生的链变量经过高低位互换(如:aabbccdd->ddccbbaa)后就是我们计算出来的md5值。

Attack

简化代码

为了看起来方便,简化代码如下


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18


<?php

$auth = "guest";

$salt = "c014hashtest";

if (isset($_COOKIE["auth"])) {

$hsh = $_COOKIE["hsh"];

if ($hsh === md5($salt . $_COOKIE["auth"])) {

die("Welcome, admin!");

}

else{

die("You are not admin!");

}

} else {

setcookie("auth", $auth);

setcookie("hsh", md5($salt . "test"));

die("You are not admin!");

}

?>

扩展攻击

本来准备手动一步步改hex值的,结果发现了python有个HashExtender库..
那就贼简单了

不过文档上的库我没装成功。。
又发现了hashpumpy
假设已知salt长度为12和”test”但是不知道salt的值

把\x改成%直接复制进cookie
刷新

时间: 2024-08-07 03:42:17

从零学习哈希长度扩展攻击的相关文章

hash哈希长度扩展攻击解析(记录一下,保证不忘)

起因 这是 ISCC 上的一道题目,抄 PCTF 的,并且给予了简化.在利用简化过的方式通过后,突然想起利用哈希长度扩展攻击来进行通关.哈希长度扩展攻击是一个很有意思的东西,利用了 md5.sha1 等加密算法的缺陷,可以在不知道原始密钥的情况下来进行计算出一个对应的 hash 值. 这里是 ISCC 中题目中的 admin.php 的算法: $auth = false; if (isset($_COOKIE["auth"])) { $auth = unserialize($_COOK

哈希长度扩展攻击的简介以及HashPump安装使用方法

哈希长度扩展攻击(hash length extension attacks)是指针对某些允许包含额外信息的加密散列函数的攻击手段.该攻击适用于在消息与密钥的长度已知的情形下,所有采取了 H(密钥 ∥ 消息) 此类构造的散列函数.MD5和SHA-1等基于Merkle–Damgård构造的算法均对此类攻击显示出脆弱性. 如果一个应用程序是这样操作的: 准备了一个密文和一些数据构造成一个字符串里,并且使用了MD5之类的哈希函数生成了一个哈希值(也就是所谓的signature/签名) 让攻击者可以提交

hash长度扩展攻击

这里面就放一张百度百科的解释吧,emmm 反正我是看不懂还是做一下题来巩固一下吧 CTF中的hash长度攻击 进入网页你会发现页面显示 ?? 我这里没有看到什么可以利用的,抓了一下包也没有什么有可以利用的东西,扫一下目录看看,这里面我用的是一个专门扫描敏感文件的工具.有兴趣的同学可以去看一下. 工具在这里 使用方法:python3 1.py url 16 32 OK通过扫描我们发现一个index.php~的文件,下载下来其实就是一个linux意外退出的一个交换文件,emmmmm. ? 在linu

实验吧——让我进去(hash长度扩展攻击)

题目地址:http://ctf5.shiyanbar.com/web/kzhan.php 在页面源码没发现什么,于是用burp进行抓包重放 看到有setcookie,于是重新刷新页面拦截数据包(这次才会带上cookie) 这个source=0 一看就很可疑,改成source=1,就得到了源码 1 <?php 2 $flag = "XXXXXXXXXXXXXXXXXXXXXXX"; 3 $secret = "XXXXXXXXXXXXXXX"; // This s

Md5扩展攻击的原理和应用

*本文原创作者:Guilty and Innocent,本文属FreeBuf原创奖励计划,未经许可禁止转载 做CTF题目的过程中遇到了md5扩展攻击,参考了几篇文章,感觉写的都有些小缺陷,再发一篇文章,理解md5扩展攻击首先需要了解md5的工作原理. 1)md5的工作原理 具体参考这两篇文章 http://blog.csdn.net/adidala/article/details/28677393,算法实现有误 https://www.rfc-editor.org/rfc/pdfrfc/rfc1

【从零学习经典算法系列】分治策略实例——快速排序(QuickSort)

在前面的博文(http://blog.csdn.net/jasonding1354/article/details/37736555)中介绍了作为分治策略的经典实例,即归并排序,并给出了递归形式和循环形式的c代码实例.但是归并排序有两个特点,一是在归并(即分治策略中的合并步骤)上花费的功夫较多,二是排序过程中需要使用额外的存储空间(异地排序算法<out of place sort>). 为了节省存储空间,出现了快速排序算法(原地排序in-place sort).快速排序是由东尼·霍尔所发展的一

【从零学习openCV】IOS7根据人脸检测

前言: 人脸检測与识别一直是计算机视觉领域一大热门研究方向,并且也从安全监控等工业级的应用扩展到了手机移动端的app.总之随着人脸识别技术获得突破,其应用前景和市场价值都是不可估量的,眼下在学习openCV,自然不能放过这个领域.于是略微了解了下openCV下人脸检測的一些原理.为之后的人脸识别等研究做个小小的铺垫. 原理: 人脸检測属于目标检測(object detection) 的一部分,主要涉及两个方面 先对要检測的目标对象进行概率统计,从而知道待检測对象的一些特征,建立起目标检測模型.

从零学习Fluter(八):Flutter的四种运行模式--Debug、Release、Profile和test以及命名规范

从零学习Fluter(八):Flutter的四种运行模式--Debug.Release.Profile和test以及命名规范 好几天没有跟新我的这个系列文章,一是因为这两天我又在之前的基础上,重新认识flutter,觉得flutter这个东西越来越有意思.并且水很深 今天简单分享一下开发学习中的小知识点 Flutter有四种运行模式:Debug.Release.Profile和test,这四种模式在build的时候是完全独立的 Debug ??Debug模式可以在真机和模拟器上同时运行:会打开所

MD5加密及Hash长度拓展攻击【通俗易懂】

先放一个简单点的利用了Hash长度拓展攻击的题目 if($COOKIE["getmein"] === md5($secret . urldecode($username . $password))) { echo "Congratulations! You are a registered user.\n"; die ("The flag is ". $flag); } 在理解Hash长度拓展攻击之前需要大致了解下MD5的加密原理 MD5加密过程