hash长度扩展攻击原理

遇到了相关的题,看了几篇文章,现在应该是把原理搞懂了。

对于md4,md5,ripemd-160,sha-0,sha-1,sha-256,sha-512等都能实现hash长度扩展攻击,我在这儿只讲下md5的hash长度扩展攻击。

md5加密原理

我们先来了解一下md5加密的原理。

当服务器进行sha1运算前,会先判断字符串的长度,并将整段字符串分割称64bytes一组。之后再进行hash生成。

ps: 64bytes == 512bits 1bytes == 8bits

而当hash函数拿到需要被hash的字符串后,会先拿字节长度除以64(512 bits),如果余数不等于56(422 bits),则会在进行长度补位,填充的第一个字节为hex(80) (0b10000000),后面全填hex(00)补充到56位,之后再填上8个字节的长度描述符(这8个字节作为该字符串的长度描述,表示其长度);如果余数等于56则只需要添加8个字节的长度描述符。如此形成64字节分为一组。  以上行为称为 “补位”。

例:

abc  hex(616263)

描述:abc可算出其长度为4bytes模64不等于56,于是要对其进行补充到56位

6162638000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

接着进行填充长度描述,因为该字符串为3bytes,3 * 8 = 24(bits),转为十六进制则为0x18,后面填hex(00)补充。

61626380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001800000000000000

以此补位行为完成。

补位完成后,紧接着就会用这64bytes的数据开始计算
  每次加密都会与初始化向量进行,而初始化向量是固定的,所以也就是说无论加密什么字符串,都会先以一个固定的向量数据,作为初始化向量首先参与计算。(储存方式为小端格式)
  A 01 23 45 67 0x67452301
  B 89 AB CD EF 0xEFCDAB89
  C FE DC BA 98 0x98BADCFE
  D 76 54 32 10 0x10325476
  
  如果字符串长度高于过长呢,它会先对前面的进行计算,而计算出来的md5值将会作为对后面字符串进行计算的初始化向量。而利用这一点所展开的攻击就是md5扩展攻击。

md5扩展攻击原理

<?php
    include secret.php;  //$secret is 8 bit salt
	$auth = $_GET['auth'];
	$m = $_GET['m'];
	if(!isset($auth))
    {
        $auth = 'admin';
        echo md5($secret.$auth);  //e4fc567eeaff96370514640c29e561a1
    }
	if($m == md5(urldecode($secret.$auth)))
    {
    	echo 'mission accomplished!'
    }
//你可以先假装不知道 $secret='abcdefgh'

简单说一下该题的信息:

1.已知 $secret 为一个8bit长度的字符,但不知其内容。

2.可以知道 $secret.$auth 的md5值

3.$auth的数据可控

现在开始扩展攻击

首先由于我们不知道$secret是什么,所以可以用X占个位,就是
$secret = 'XXXXXXXX'
$auth = 'admin'
接下来想想他们是怎么加密的,要对他们进行补位
XXXXXXXXadmin\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\x68\x00\x00\x00\x00\x00\x00\x00
于是他们就是以这样的形式与初始化向量进行计算的,但如果我们能在后面加一些字符串,那么这些字符串就会因为长度原因参与下一次计算,而用于下次计算的初始化向量我们其实已经知道了就是e4fc567eeaff96370514640c29e561a1,把它用小端格式储存后就是用来下次计算的初始化变量。

所以这其实相当于  (hacker就是你格外加入的字符串,\x进行url编码后为%)
1. md5($secret.urldecode('admin%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%68%00%00%00%00%00%00%00hacker'))
2.
以 e4fc567eeaff96370514640c29e561a1 作为初始化变量对hacker进行加密计算

这两种方法的值其实是一样的,这就是md5扩展攻击,即使在你不知道secret是什么,也可以推出md5值。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值