hash扩展攻击本地实验

   记录一下自己对hash扩展攻击的一些理解,hash扩展攻击主要应用于身份认证,比如对于成功登录的用户可以赋予其一个采用hsah算法加密的cookie值,其中含有未知的密钥。

   此后每次在服务器端验证此cookie中的凭证是否正确

    if ($hsh !== md5($SECRET . $_COOKIE["auth"])) {
        die("error");
    }

  上端代码中密钥存储在服务器端,auth在客户端存储,hsh为登陆成功的用户所拥有,那么作为攻击者,我们已知hash后的密文,如果直到密钥长度,就可以再次构造hash值使等式

  成立。hash扩展攻击适用于md5,sha1,其原理http://blog.chinaunix.net/uid-27070210-id-3255947.html,这篇文章可以看看,主要知道以下几点:

  1.对于hash的消息要进行补位到mod 512 余 448bit,按64字节分组

  2.下一组明文的摘要的初始iv需要用到上一组明文的摘要值

  所有我们在已知一组hash值的情况下,只需要对原始明文进行扩充就可以了在不知道密钥的情况下得到另一个合法hash值。

  比如原始数据为

  $_COOKIE["auth"]=“wfz”;
  $secret = "flag"
  $hsh = md5("flag"."wfz")

  此时作为攻击者,我们有了hsh值,假设已知密钥的长度,就可以对原始消息进行填充

$new_msg = "xxxx"."wfz".padding

  此时$new_msg已经满足64字节,然后我们就可以在$new_msg后面填充上想要添加的任何值

  比如

$append = "hacker"

  然后就得到了payload = “wfz”.padding."hacker"

  接着只需要将之前已经得到的$hsh的值作为新的md5摘要运算的初始iv,并且对新添加的值$append = "hacker"进行加密

  就能得到一串hash值

<html>
<form>

<form>
</html>
<?php
error_reporting(0);
$SECRET = "flag";
if (isset($_COOKIE["auth"]) && isset($_COOKIE["hsh"])) {
    $hsh = $_COOKIE["hsh"];
    echo $hsh;
    echo "\n";
    echo md5($SECRET . urldecode($_COOKIE["auth"]));
    if ($hsh !== md5($SECRET . urldecode($_COOKIE["auth"]))) {
        echo md5($SECRET . urldecode($_COOKIE["auth"]));
        echo "</br>";
        echo md5($SECRET . $_COOKIE["auth"]);
        echo "</br>";
        die("error");
            
    }
    else{
        echo "success";
    }
 
}
else {
    echo "hsh:".md5($SECRET . urldecode($_COOKIE["auth"]))."</br>";
    echo "input auth and hsh";
}

?>

 

 

本地测试如上,为了方便,改cookie用get,都是一样的原理,此时有了hsh:34503d694103892c2f8b709f8440ab5b

然后利用hashpump,构造新的hash值

hsh=e9ce9ebaab0a671ec8edddda705a7dae

payload=wfz\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\x008\x00\x00\x00\x00\x00\x00\x00hacker

 

因为源码是经过urldecode,所以这里将payload经过urlencode函数编码一次,这里要用php的urlencode函数编码,不要用在线的url编码或burp中的url编码,编码出来会不一样

所以最终的payload为auth=wfz%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%00%00%00%00%00%008%00%00%00%00%00%00%00hacker;hsh=e9ce9ebaab0a671ec8edddda705a7dae

放在cookie中就可以了

 

 

 

 

  
posted @ 2018-08-03 10:59 tr1ple 阅读(...) 评论(...) 编辑 收藏