先放一个简单点的利用了Hash长度拓展攻击的题目

  1. if($COOKIE["getmein"] === md5($secret . urldecode($username . $password))) {
  2. echo "Congratulations! You are a registered user.\n";
  3. die ("The flag is ". $flag);
  4. }

在理解Hash长度拓展攻击之前需要大致了解下MD5的加密原理

MD5加密过程

1.数据分组

在MD5加密算法中,将一个字符串分为若干个大小为512位的分组,而每一个分组又可分为16个子分组m0~m3{A},m4~m7{B},m8~m11{C},m12~m15{D}(这里的ABCD在稍后的Hash计算中会讲解到)。

2.数据填充

MD5值的计算都必须以512位为一组进行计算,所以就必须使得填充后的数据 [原字符串+填充100...+原字符串总长(64位)],刚好等于512的倍数。比如:

$str = "test",十六进制表示为0x74657374

数据填充后为0x74657374

中间的80...H=10000000...B,最后四字节也就是2000000000000000代表前面'test'的长度,也就是4×8位=32D=20H。

如下图所示(图取自另一篇博客,忽略水映啦~~)

下面说一下具体的一些计算:在MD5中有四个32位的被称作链接变量的整数参数,是如下设置(这个ABCD是初始的固定的值,即初始向量):

A=0x67452301,

B=0xefcdab89,

C=0x98badcfe,  

D=0x10325476。

通过小端规则转换A{m3~m0}B{m7~m4}C{m11~m8}D{m15~m12}就是MD5值:0123456789abcdeffedcba9876543210。即为初始向量的MD5值,记为md5_0。

之后有四个非线性函数,将字符串和那四个链接变量经过一系列的复杂运算(具体运算规则请自行查阅),算出一组新的A,B,C,D的值,公式即$md5_1=MD5($md_0+$ex_str_0);如果消息小于512,也就是只需要计算一次,这时候的$md5_1就是最终的MD5值;如果消息大于512的话,就用第一次得到的$md5_1代入公式$md5_2=MD5($md_1+$ex_str_1)对第二个512位数据进行运算...如此迭代即可。

这种加密可能导致的问题

思考,如果是这种情况,由两个字符串组成一个字符串($str=$a+$b),第一个字符串($a)不知道也不可控,只可控第二个字符串($b),但知道第一个字符串($a)的MD5值和长度,这时候我将第二个字符串精心构造一下,便可以算出合成的字符串$str的MD5的值。

如何精心构造,且看下文。

正向计算

假如第一个字符串$a=“test”,十六进制表示0x74657374

构造第二个字符串首先手动将$str补成一个标准的可以直接计算的512位

$str=0x74657374800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000

这样子,这时候再在后面追加一个0x746573748

$str=0x74657374800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000746573748

这时候再将$str大于512位,程序会自动先将这串数据补为1024位,补充完如下

$str=0x7465737480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000074657374800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002002000000000000

这时将$str分为两部分

74657374800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000

74657374800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002002000000000000

这时候程序计算前一部分的ABCD的值,由于和之前算的test的数值是相同的所以

A=0xcd6b8f09

B=0x73d32146

C=0x834edeca

D=0xf6b42726

对应的MD5:098f6bcd4621d373cade4e832627b4f6

到了第二部分,第二部分的计算是用的第一部分的ABCD去计算,计算新的ABCD如下

A=0x226359e5

b=0x99df12eb

C=0x6853f59e

D=0xf5406385

最后算出来的MD5:e5596322eb12df999ef55368856340f5

按照给定条件计算一遍(此即MD5的Hash长度拓展攻击原理)

我们知道的条件

1.$a的MD5(098f6bcd4621d373cade4e832627b4f6)

2.$a的长度=4

3.$b我们可以任意控制

由1的MD5我们可以逆推算出其ABCD的值

A=0xcd6b8f09

B=0x73d32146

C=0x834edeca

D=0xf6b42726

我们构造$b='\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00'+'test'

此时$str如下,由于不知道$a,我们假设$a="aaaa"(任意构造,但需满足条件已知长度为4)

那么假设内容就为$str='aaaa'+'\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00'+'test'

好了我们脑补一下程序计算str的过程

1.由于大于512位,先补全为1024位,

2.将其分为两部分

3.计算第一部分的ABCD的值

4.再用第一部分算出来的ABCD拿来算第二部分的值。

这里由于第一部分的ABCD我们可以逆推出来,我们可以直接跳过前三部分直接进行第四部分的计算,只需要将标准的MD5的源码里面的初始的ABCD的值改为逆推出来的那个值。

我们用假的初始的ABCD计算一下

0x74657374800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002002000000000000

的MD5,发现是e5596322eb12df999ef55368856340f5,和上面正向计算出来的一样!

这里可能需要反复理解一下,有点绕,但这就是真正理解Hash长度拓展攻击原理的临门一脚,过了便不难。

再结合一开始的那道题目来理解下吧,题目中,需要满足条件$COOKIE["getmein"] === md5($secret . urldecode($username . $password))才能获取到flag,但由于$secret不知道也不可控,所以就需要将我们构造的(512<位数(str)<1024)数据中第一个512位数据计算得到的md5值来取代$secret(即用第一向量md5_1取代初始向量md5_0/$secret),而usename和password仍旧是第一个512位数中的值,再将$COOKIE['getmein']改为第二个512位拓展数据得到的MD5值即可(即将第二向量md5_2取代第一向量md5_1)。我说过很好理解的叭~^^

总结

存在此类缺陷的加密算法主要有:md和sha系列等等

防范:1.   Hash(secret, Hash(message))

2.   HMAC算法 HMAC(secret||padding)=H(secret||H(secret||padding))

3.   交换secret和padding的位置,即MAC(padding||secret)

利用工具:主要有hash_dump,hash_extender,还有一些大佬的脚本,相关博客很多,自行学习吧。

任何疑问可留言,看到回复~^^

MD5加密及Hash长度拓展攻击【通俗易懂】的更多相关文章

  1. 浅谈HASH长度拓展攻击

    前言 最近在做CTF题的时候遇到这个考点,想起来自己之前在做实验吧的入门CTF题的时候遇到过这个点,当时觉得难如看天书一般,现在回头望去,仔细琢磨一番感觉也不是那么难,这里就写篇文章记录一下自己的学习 ...

  2. MD5的Hash长度扩展攻击

    Hash长度扩展攻击 引子 无意中碰到一道题,大概代码是这样的 $flag = "XXXXXXXXXXXXXXXXXXXXXXX"; $secret = "XXXXXXX ...

  3. 实验吧_天下武功唯快不破&让我进去(哈希长度拓展攻击)

    天下武功唯快不破 第一反应就去抓包,看到返回包的header中有FLAG的值,base64解码后得到下图所示 这就要求我们在请求头中post相应key的值,我直接在burp中尝试了多次都没有用,想起来 ...

  4. 实验吧Web-中-让我进去(Hash长度扩展攻击、加盐密码及Linux下hashpump的安装使用)

    打开网页,测试开始,注入费老大劲,看了大佬的blog才知道怎么干. bp抓包,观察发现cookie中有个source=0,在repeater中修改为source=1,然go一下,出来了一段源代码. $ ...

  5. 哈希长度拓展攻击之De1CTF - SSRF Me

    题目考查:python代码审计.hash长度拓展攻击 0x01 题目源码: #! /usr/bin/env python #encoding=utf-8 from flask import Flask ...

  6. hash长度扩展攻击

    这里面就放一张百度百科的解释吧,emmm 反正我是看不懂还是做一下题来巩固一下吧 CTF中的hash长度攻击 进入网页你会发现页面显示  我这里没有看到什么可以利用的,抓了一下包也没有什么有可以利 ...

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

    题目地址:http://ctf5.shiyanbar.com/web/kzhan.php 在页面源码没发现什么,于是用burp进行抓包重放 看到有setcookie,于是重新刷新页面拦截数据包(这次才 ...

  8. MD5加密与Hash加密

    一.Md5加密 MD5算法具有以下特点: 1.压缩性:任意长度的数据,算出的MD5值长度都是固定的. 2.容易计算:从原数据计算出MD5值很容易. 3.抗修改性:对原数据进行任何改动,哪怕只修改1个字 ...

  9. [php代码审计] 哈希长度拓展攻击

    已知: 1. salt的长度. 2. message==“adminadmin”. 3. MD5(salt+message)的值. 求: MD5(salt+message+填充数据+任意字符串)的值. ...

随机推荐

  1. js 继承的方式

    //定义object的继承方法 Object.extend = function(destination, source) { for(property in source) { destinatio ...

  2. orthodb

    1.数据库 orthodb数据: odb10v0_levels.tab.gz: NCBI taxonomy nodes where Ortho DB orthologous groups (OGs) ...

  3. java.security.MessageDigest (2) 生成安全令牌!

    时候,我们需要产生一个数据,这个数据保存了用户的信息,但加密后仍然有可能被人使用,即便他人不确切的了解详细信息... 好比,我们在上网的时候,很多网页都会有一个信息,是否保存登录信息,以便下次可以直接 ...

  4. SMB扫描

    server message block协议,Windows特有的一个协议,实现较复杂,windows应用最广的一个协议,也是安全问题最多的问题,smb协议windows默认开发,用于文件共享. sm ...

  5. Python爬虫使用MD5加密的坑

    由于公司的业务需要,需要爬取很多的国外网站图片,然后兄弟我一路正则杀过去,总共匹配到658张链接,心里美滋滋开始写下载的代码.然后就有了这次坑的记录. 首先这是我查到的链接数量 然后爬虫跑完后,美滋滋 ...

  6. MongoDB之Limit选取Skip跳过Sort排序

    1.Limit选取 我要从Document中取出多少个 只要2条Document db.Wjs.find().limit(2) 2.Skip跳过 我要跳过多少个Document 我要跳过前两个Docu ...

  7. leecode 978. Longest Turbulent Subarray(最长连续波动序列,DP or 滚动数组)

    传送门:点我 978. Longest Turbulent Subarray A subarray A[i], A[i+1], ..., A[j] of A is said to be turbule ...

  8. Mobile Game Development with Unity Build Once, Deploy Anywhere

    本书从自上而下的角度介绍了Unity游戏引擎的功能,并提供了具体的.面向项目的指导,说明了如何在真实的游戏场景中使用这些功能,以及如何从头开始构建让玩家爱不释手的2D和3D游戏.主要内容有:探索Uni ...

  9. Netty实践二(心跳检测)

    我们使用Socket通信一般经常会处理多个服务器之间的心跳检测,一般来讲,我们去维护服务器集群,肯定要有一台或几台服务器主机(Master),然后还应该有N台(Slave),那么我们的主机肯定要时时刻 ...

  10. 23【notepad++】修改背景颜色

    notepad++是一款功能丰富的编辑器,运行在windows平台上的编辑工具. 但它默认设置是白色背景,黑色文字,长时间看很刺眼.那么怎么设定成为暗色背景,亮色文字呢? 点击,设置->语言格式 ...