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

phpwind9.x的Md5 Padding Extension漏洞分析

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

 0x00 前言

这是一个比较有意思的漏洞,漏洞已经在乌云网上提交(http://www.wooyun.org/bugs/wooyun-2016-0210850),官方也已经发布了补丁(http://www.phpwind.net/read/3709549),并且安全研究员phithon也第一时间发出了他的漏洞分析http://www.leavesongs.com/PENETRATION/phpwind-hash-length-extension-attack.html,其实内容基本一致,不过关键还是在于如何直接GetShell上。不以GetShell为目的的代码审计都是耍流氓。

0x01 简介

phpwind是采用PHP+MySQL方式运行的开源社区程序。轻架构,高效率简易开发,助你快速搭建并轻松管理社区站点。面向移动互联网应用需求,PW还提供移动社区客户端,把社区站点从PC迁移到手机,实现应用、数据融合互通,一站式多终端服务,确保用户体验自然过渡。

0x02 某接口

windidserver在有$secretkey的情况下是可以做很多事情的,包括操作用户的所有信息,更改配置等。

前面也存在过漏洞 http://www.wooyun.org/bugs/wooyun-2014-072727 不过新版本修复了。

0x03 接口验证缺陷

windidserver 接口的验证代码如下:

/src/applications/windidserver/api/controller/OpenBaseController.php

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;
 }

跟进 WindidUtility::appKey
/src/windid/service/base/WindidUtility.php

 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 ($get AS $k=>$v) {
   if (in_array($k, $array)) continue;
   $str .=$k.$v;
  }
  foreach ($post AS $k=>$v) {
   if (in_array($k, $array)) continue;
   $str .=$k.$v;
  }
  return md5(md5($apiId.'||'.$secretkey).$time.$str);
 }

简单看起来,好像验证非常完美,请求的所有GET,POST都加入 secretkey 签名中,除非得到secretkey,不然好像也没什么可能绕过的样子。

我们再来细致分析下,$apiId可知,$time也可以从URL中获取,而$str,是GET,POST参数形成,在某种情况下也是可以知道的,可以控制的。当然暴力破解$secretkey基本不现实。
但再细看,签名中密码长度是可以知道的


这不是可以存在md5 padding 么?

0x04 查找利用点

[1] [2] [3] [4] [5] [6]  下一页

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