MetInfo 6.0.0反馈管理页面存储XSS(CVE-2018-7721)分析

Posted 无级安全

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MetInfo 6.0.0反馈管理页面存储XSS(CVE-2018-7721)分析相关的知识,希望对你有一定的参考价值。

MetInfo6.0.0 XSS(CVE-2018-7721)

说明:MetInfo 6.0.0中的跨站点脚本(XSS)漏洞允许远程攻击者注入任意Web脚本或html

1.漏洞细节:

/app/system/feedback/web/feedback.class.php line:18 to 37

      public function dofeedback() {
        global $_M;
      if($_M['form']['action'] == 'add'){
            $this->check_field();
            $this->add($_M['form']);
        }else{
            $classnow = $this->input_class($_M['form']['id']);
            $this->add_input('id', $classnow);
            if($classnow)$this->load_config($_M['lang'], $classnow);
            $data = load::sys_class('label''new')->get('column')->get_column_id($classnow);
            $this->add_array_input($data);
            $this->check($data['access']);
            unset($data['id']);
            $this->seo($data['name'], $data['keywords'], $data['description']);
            $this->seo_title($data['ctitle']);
            $this->seo_title($_M['config']['met_fdtable']);
            $this->add_input('fdtitle',$data['name']);
            require_once $this->template('tem/feedback');
        }
    }

然后前台表单插入数据库。位于 /app/system/feedback/web/feedback_admin.class.php line:169 to 190

    function doeditor() {
    global $_M;
    nav::select_nav(1);
    $a = 'doeditorsave';
    $class1 = $_M[form][class1];
    $feedbackcfg= load::mod_class('feedback/feedback_handle','new')->get_feedback_config($class1);
    $met_fd_email=$feedbackcfg[met_fd_email][value];
    $id = $_M[form][id];
    $query = "UPDATE {$_M[table][feedback]} SET readok='1' WHERE id='{$_M['form']['id']}'";
    DB::query($query);
    $feedback_list = DB::get_one("select * from {$_M[table][feedback]} where id='$id' and class1 = '$class1'");
    $query = "SELECT * FROM  {$_M[table][parameter]} where lang='{$this->lang}' and ((module='{$this->module}' and class1 = '0') or (module='{$this->module}' and class1 = '$class1')) order by no_order";
    $result = DB::query($query);
    $weburl = $_M[config][weburl];
    while ($list = DB::fetch_array($result)) {
      $info_list = DB::get_one("select * from {$_M[table][flist]} where listid='$id' and paraid='$list[id]' and lang='{$this->lang}'");
      $list[content] = $list[type] == 5 ? (($info_list[info] != '../upload/file/') ? "<a href='{$weburl}" . $info_list[info] . "' target='_blank'>{$_M[word][clickview]}</a>" : $_M[word][filenomor]) : $info_list[info];
      $feedback_para[] = $list;
    }
    $fnam = DB::get_one("SELECT * FROM {$_M[table][column]} WHERE id='$class1' and lang='{$this->lang}'");
    require $this->template('own/article_add');
    }

然后找到 /app/system/feedback/admin/templates/artile_add.php line:16 to 75

    foreach($feedback_para as $key=>$val){
    $email=$val[id]==$met_fd_email&&$val[content]?"&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"{$_M[url][own_form]}a=doreplyemail&customerid={$customerid}&id={$id}&class1={$_M[form][class1]}&class2={$_M[form][class2]}&class3={$_M[form][class3]}&email={$val[content]}\">{$_M[word][unitytxt_35]}</a>":'';
    echo <<<EOT
     -->

        <div class="v52fmbx_dlbox">
        <dl>
            <dt>{$val[name]}{$_M[word][marks]}</dt>
            <dd>
                $val[content]{$email}
            </dd>
        </dl>
        </div>
    <!--
    EOT;
    }
    echo <<<EOT
     -->

        <div class="v52fmbx_dlbox">
        <dl>
            <dt>{$_M[word][fdeditorTime]}{$_M[word][marks]}</dt>
            <dd>
                {$feedback_list[addtime]}
            </dd>
        </dl>
        </div>
        <div class="v52fmbx_dlbox">
        <dl>
            <dt>{$_M[word][fdeditorFrom]}{$_M[word][marks]}</dt>
            <dd>
                {$feedback_list[fromurl]}
            </dd>
        </dl>
        </div>
        <div class="v52fmbx_dlbox">
        <dl>
            <dt>{$_M[word][feedbackID]}{$_M[word][marks]}</dt>
            <dd>
                {$feedback_list[customerid]}
            </dd>
        </dl>
        </div>
        <div class="v52fmbx_dlbox">
        <h3 class="v52fmbx_hr">{$_M[word][fdeditorRecord]}{$_M[word][marks]}</h3>
        <dl>
            <dd class="ftype_ckeditor">
                <div class="fbox">
                    <textarea name="useinfo" data-ckeditor-y="500">{$feedback_list[useinfo]}</textarea>
                </div>
            </dd>
        </dl>
        </div>
        <div class="v52fmbx_submit">
            <input type="submit" name="Submit" value="{$_M[word][Submit]}" class="submit" />
        </div>
       </div>
      </div>
     </div>
    </form>
    <!--
    EOT;

因此它直接打印数据库的内容,因此我们可以控制反馈表单并注入任意Web脚本或HTML。我们可以在管理员查看反馈时创建存储的XSS。

2.PoC

使用谷歌浏览器打开此
https://www.metinfo.cn/upload/file/MetInfo6.0.0.zip
测试站点。下载此版本()并构建测试站点。

然后我们使用这个网址:

http://127.0.0.1/feedback/index.php

MetInfo 6.0.0反馈管理页面存储XSS(CVE-2018-7721)分析

输入(<script>alert(/xss/)</script>) 在任何输入框中

MetInfo 6.0.0反馈管理页面存储XSS(CVE-2018-7721)分析


然后我们可以得到这样的页面。

MetInfo 6.0.0反馈管理页面存储XSS(CVE-2018-7721)分析

接下来,我们需要知道如何触发此XSS。然后我们进入网站后台

MetInfo 6.0.0反馈管理页面存储XSS(CVE-2018-7721)分析


现在,我们是本网站的网站管理员,我们可以查看反馈。


XSS将触发。


以上是关于MetInfo 6.0.0反馈管理页面存储XSS(CVE-2018-7721)分析的主要内容,如果未能解决你的问题,请参考以下文章

[ 中危 ] dp意见反馈处存储型XSS

宝塔漏洞 XSS窃取宝塔面板管理员漏洞 高危

XSS盲打

记一次MetInfo6.0.0文件包含漏洞复现

XSS事件

phpStudy与metinfo啥关系