zoukankan      html  css  js  c++  java
  • DedeCMS 5.7通用重装漏洞分析

    源码下载

    淦,找了半天没找到漏洞版本源码,只能用最新版本的进行对比了

    DedeCms v5.7 GBK 下载地址:http://www.dedecms.com/dl/dl.php?action=dl&type=0&lang=gbk

    DedeCms v5.7 UTF8 下载地址:http://www.dedecms.com/dl/dl.php?action=dl&type=0&lang=utf-8

    复现要求

    Apache中间件解析漏洞(方便利用index.php.bak

    install文件夹未删除(利用index.php或者index.php.bak

    数据库账户密码

    本地部署

    phpstudy部署

    因为是本地,数据库直接弱密码 root/root

    安装成功

    漏洞分析

    安装完成后,在install文件夹下会生成install_lock.txt文件来防止二次安装

    这个时候我们访问网址下的install文件夹,可以看到提示:

    存在漏洞的源代码为,即/install/index.php.bak

    1	$verMsg = ' V5.7 GBKSP1';
    2	$s_lang = 'gb2312';
    3	$dfDbname = 'dedecmsv57gbksp1';
    4	$errmsg = '';
    5	$install_demo_name = 'dedev57demo.txt';
    6	$insLockfile = dirname(__FILE__).'/install_lock.txt';
    7	$moduleCacheFile = dirname(__FILE__).'/modules.tmp.inc';
    8	 
    9	define('DEDEINC',dirname(__FILE__).'/../include');
    10	define('DEDEDATA',dirname(__FILE__).'/../data');
    11	define('DEDEROOT',preg_replace("#[\\/]install#", '', dirname(__FILE__)));
    12	header("Content-Type: text/html; charset={$s_lang}");
    13	 
    14	require_once(DEDEROOT.'/install/install.inc.php');
    15	require_once(DEDEINC.'/zip.class.php');
    16	 
    17	foreach(Array('_GET','_POST','_COOKIE') as $_request)
    18	{
    19	    foreach($$_request as $_k => $_v) ${$_k} = RunMagicQuotes($_v);
    20	}
    21	 
    22	require_once(DEDEINC.'/common.func.php');
    23	 
    24	if(file_exists($insLockfile))
    25	{
    26	    exit(" 程序已运行安装,如果你确定要重新安装,请先从FTP中删除 install/install_lock.txt!");
    27	}
    28	 
    29	if(empty($step))
    30	{
    31	    $step = 1;
    32	}
    

    查看源代码,可以看到判断条件,存在漏洞的源代码这里位于第24行

    if(file_exists($insLockfile))
    {
        exit(" 程序已运行安装,如果你确定要重新安装,请先从FTP中删除 install/install_lock.txt!");
    }
    

    追踪$insLockfile,位于第六行

    $insLockfile = dirname(__FILE__).'/install_lock.txt';
    

    而新版本中修改了这两部分为:

    第18行

    define('INSLOCKFILE', dirname(__FILE__).'/install_lock.txt');
    

    第37行

    if(file_exists(INSLOCKFILE))
    {
        exit(" 程序已运行安装,如果你确定要重新安装,请先从FTP中删除 install/install_lock.txt!");
    }
    

    开发人员将变量直接定义成了常量写死,即无法进行变量覆盖,查看变量覆盖代码,位于这两者之间

    第17行

    foreach(Array('_GET','_POST','_COOKIE') as $_request)
    {
        foreach($$_request as $_k => $_v) ${$_k} = RunMagicQuotes($_v);
    }
    

    很明显存在变量覆盖漏洞

    遍历数组 Array('_GET','_POST','_COOKIE')并赋值给$_request变量,遍历$$_request,也就是遍历$_GET,$_POST,$_COOKIE将其获取到的键值数组依次赋给 $_k,$_v,即key => value,接着对$_v进行一个RunMagicQuotes函数的过滤,并将变量${$_k}的值赋成过滤后的$_v

    因为在18行定义的时候,相当于是$insLockfile=dirname(__FILE__).'/install_lock.txt'

    现在只需要覆盖成一个不可能存在的文件名即可,随便想一个 springbird

    整理流程,传入INSLOCKFILE=springbird,这时候$_k=insLockfile,$_v=springbird,${$_k}=$insLockfile,所以最后

    $insLockfile=springbird,在判断处就能够进行逃逸进行重装了,但是还需要数据库账户密码,这里使用常用密码爆破即可。

    如果是index.php存在该漏洞,则无需用到Apache解析漏洞,但如果是index.php.bak,则需要利用Apache的解析特性,即从右往左解析,若解析到了不认识的,继续向左,直到有一个认识的为止。

    index.php.bakbak后缀不认识,继续向左,php后缀认识,则解析成为php文件,同样可以打出重装payload

    参考链接

    https://bt7k.com/?p=26

    https://blog.csdn.net/forest_fire/article/details/50944224

    https://www.mi1k7ea.com/2019/06/20/PHP变量覆盖漏洞/#0x07-导致的变量覆盖

    https://www.myhack58.com/Article/html/3/62/2013/39131.htm

  • 相关阅读:
    网络编程
    面向对象总结
    面象对象编程(选课系统)
    类的魔法方法和部分单例模式
    简易3D开发,ThingJS之大道至简
    ThingJS参与3D众创,一起建设“实体中国”!
    ThingJS:轻松让空间“立起来”,展示你的3D创造力
    一个产品的状态不好?ThingJS来找茬
    ThingJS提供有地理位置的信息弹窗示例
    一次灵感盛宴,ThingJS推出场景Market
  • 原文地址:https://www.cnblogs.com/Cl0ud/p/14187118.html
Copyright © 2011-2022 走看看