织梦dedecms漏洞修复记

自己用dedecms在阿里云上搭建了套网站,之后阿里云漏洞提示,织梦有多个漏洞需要我修复,发我邮箱,今天整理了下,我遇到的漏洞,及我修复的过程。

  1. 漏洞描述:dedecms的/member/soft_add.php中,对输入模板参数$servermsg1未进行严格过滤,导致攻击者可构造模版闭合标签,实现模版注入进行GETSHELL。
    解决办法:打开根目录下/member/soft_add.php(在154行),



    $urls .= "{dede:link islocal='1' text='{$servermsg1}'} $softurl1 {/dede:link}\r\n";
    替换成:
    [php]  view plain  copy
    1. <span style="font-size:14px;"><pre name="code" class="php"if (preg_match("#}(.*?){/dede:link}{dede:#sim"$servermsg1) != 1) {  
    2. <span style="white-space:pre">    </span> $urls .= "{dede:link islocal='1' text='{$servermsg1}'} $softurl1 {/dede:link}\r\n";  
    3.  } </span>  

  2. 漏洞描述:edecms SESSION变量覆盖导致SQL注入 /include/common.inc.php,dedecms SESSION变量覆盖导致SQL注入dedecms的/plus/advancedsearch.php中,直接从$_SESSION[$sqlhash]获取值作为$query带入SQL查询,这个漏洞的利用前提是session.auto_start = 1即开始了自动SESSION会话,需要在dedemcs的变量注册入口进行了通用统一防御,禁止SESSION变量的传入。解决办法:打开/include/common.inc.php,找到cfg_|GLOBALS|_GET|_POST|_COOKIE,一共有两处68行和90行。找到后,后面再加一个_SESSION,成
  3. 漏洞描述:dedecms留言板注入漏洞,/plus/guestbook/edit.inc.php

dedecms SESSION变量覆盖导致SQL注入
4,/plus/search.php,dedecms注入漏洞
[php]  view plain  copy
  1. //引入栏目缓存并看关键字是否有相关栏目内容  
  2. require_once($typenameCacheFile);  
  3. if(isset($typeArr) && is_array($typeArr))  
  4. {  
  5.     foreach($typeArr as $id=>$typename)  
  6.     {  
  7.         $keywordn = str_replace($typename, ‘ ‘, $keyword);  
  8.         if($keyword != $keywordn)  
  9.         {  
  10.             $keyword = $keywordn;  
  11.             $typeid = $id//对ID没做任何过滤 导致注入  
  12.             break;  
  13.         }  
  14.     }  
  15. }  
  16. }  
  17.   
  18. $keyword = addslashes(cn_substr($keyword,30));  
修复后:
[php]  view plain  copy
  1. //引入栏目缓存并看关键字是否有相关栏目内容  
  2. require_once($typenameCacheFile);  
  3. if(isset($typeArr) && is_array($typeArr))  
  4. {  
  5.     foreach($typeArr as $id=>$typename)  
  6.     {  
  7.         //$keywordn = str_replace($typename, ‘ ‘, $keyword);  
  8.         $keywordn = $keyword;  
  9.         if($keyword != $keywordn)  
  10.         {  
  11.             $keyword = HtmlReplace($keywordn);//防XSS  
  12.             $typeid = intval($id); //强制转换为数字型  
  13.             break;  
  14.         }  
  15.     }  
  16. }  
  17. }  
  18. $keyword = addslashes(cn_substr($keyword,30));  
[php]  view plain  copy
  1.   
5,/plus/guestbook/edit.inc.php dedecms注入漏洞,其实就是留言版注入漏洞
没有对$msg过滤,导致可以任意注入,找到
[php]  view plain  copy
  1. $msg = HtmlReplace($msg, -1);  
  2.     $dsql->ExecuteNoneQuery("UPDATE `#@__guestbook` SET `msg`='$msg', `posttime`='".time()."' WHERE id='$id' ");  
  3.     ShowMsg("成功更改或回复一条留言!"$GUEST_BOOK_POS);  
  4.     exit();  
修复:
[php]  view plain  copy
  1. $msg = addslashes(HtmlReplace($msg, -1));  
  2.     $dsql->ExecuteNoneQuery("UPDATE `#@__guestbook` SET `msg`='$msg', `posttime`='".time()."' WHERE id='$id' ");  
  3.     ShowMsg("成功更改或回复一条留言!"$GUEST_BOOK_POS);  
  4.     exit();  
加入:  addslashes进行过滤

6,/dede/media_add.php dedecms 后台文件任意上传漏洞
找到文件/dede/media_add.php,定位到69行:$fullfilename = $cfg_basedir.$filename;
修复后:
[php]  view plain  copy
  1. if (preg_match('#\.(php|pl|cgi|asp|aspx|jsp|php5|php4|php3|shtm|shtml)[^a-zA-Z0-9]+$#i', trim($filename))) {   
  2.             ShowMsg("你指定的文件名被系统禁止!",'java script:;');  
  3.             exit();  
  4.         }   
  5.         $fullfilename = $cfg_basedir.$filename;  
7,/include/common.inc.php dedecms SESSION变量覆盖导致SQL注入
找到文件在/include/common.inc.php,定位到101行
[php]  view plain  copy
  1.   foreach(Array('_GET','_POST','_COOKIE'as $_request)  
  2.   {  
  3.       foreach($$_request as $_k => $_v)  
  4. {  
  5.     if($_k == 'nvarname') ${$_k} = $_v;  
  6.     else ${$_k} = _RunMagicQuotes($_v);  
  7. }  
  8.   }  
修复后:
foreach(Array('_GET','_POST','_COOKIE') as $_request)
{
         foreach($$_request as $_k => $_v) {
                    if( strlen($_k)>0 && eregi('^(cfg_|GLOBALS)',$_k) ){
                            exit('Request var not allow!');
                   }
                    ${$_k} = _RunMagicQuotes($_v);
    }
}
8,/include/uploadsafe.inc.phpdedecms上传漏洞
找到文件:文件/include/uploadsafe.inc.php,此文件有两处漏洞
  • 定位到42行,${$_key.'_size'} = @filesize($$_key);
修复后:
[php]  view plain  copy
  1. <span style="font-size:14px;"if(empty(${$_key.'_size'}))  
  2.     {  
  3.         ${$_key.'_size'} = @filesize($$_key);  
  4.    
  5.    }   
  6.    $imtypes = array("image/pjpeg""image/jpeg""image/gif""image/png""image/xpng""image/wbmp""image/bmp");   
  7.    if(in_array(strtolower(trim(${$_key.'_type'})), $imtypes)) {  
  8.        $image_dd = @getimagesize($$_key);   
  9.        if($image_dd == false){  
  10.         continue;   
  11.        }  
  12.        if (!is_array($image_dd)) {   
  13.         exit('Upload filetype not allow !');   
  14.        }   
  15.    } </span>  

  • 定位53行,搜索到$image_dd = @getimagesize($$_key);
修复后:
[php]  view plain  copy
  1. <span style="font-size:14px;">  $image_dd = @getimagesize($$_key);  
  2.         if($image_dd == false){  
  3.             continue;  
  4.         }</span>  
9,/include/payment/alipay.php dedecms支付模块注入漏洞

找到此文件,定位到137行
[php]  view plain  copy
  1. $order_sn = trim($_GET['out_trade_no']);  
[php]  view plain  copy
  1. 修复后:  
[php]  view plain  copy
  1.   
[php]  view plain  copy
  1. $order_sn = trim(addslashes($_GET['out_trade_no']));  


10,/member/soft_add.php 
  dedecms模版SQL注入漏洞定位到154行 
 
 
[php]  view plain  copy
  1. $urls .= "{dede:link islocal='1' text='{$servermsg1}'} $softurl1 {/dede:link}\r\n";  
修复后:
[php]  view plain  copy
  1. if (preg_match("#}(.*?){/dede:link}{dede:#sim"$servermsg1) != 1) {  
  2.   $urls .= "{dede:link islocal='1' text='{$servermsg1}'} $softurl1 {/dede:link}\r\n";  
  3. }  
11,/member/mtypes.php dedecms注入漏洞
定位到53行
[php]  view plain  copy
  1. elseif ($dopost == 'save')  
  2. {  
  3.     if(isset($mtypeidarr) && is_array($mtypeidarr))  
  4.     {  
  5.         $delids = '0';  
  6.         $mtypeidarr = array_filter($mtypeidarr'is_numeric');  
  7.         foreach($mtypeidarr as $delid)  
  8.         {  
  9.             $delid = HtmlReplace($delid);  
  10.             $delids .= ','.$delid;  
  11.             unset($mtypename[$delid]);  
  12.         }  
  13.         $query = "DELETE FROM `#@__mtypes` WHERE mtypeid IN ($delids) AND mid='$cfg_ml->M_ID';";  
  14.         $dsql->ExecNoneQuery($query);  
  15.     }  
  16.     foreach ($mtypename as $id => $name)  
  17.     {  
  18.         $name = HtmlReplace($name);  
  19.         $query = "UPDATE `#@__mtypes` SET mtypename='$name' WHERE mtypeid='$id' AND mid='$cfg_ml->M_ID'";  
  20.         $dsql->ExecuteNoneQuery($query);  
  21.     }  
  22.     ShowMsg('分类修改完成','mtypes.php');  
  23. }  
修复后:
[php]  view plain  copy
  1.   
[php]  view plain  copy
  1. elseif ($dopost == 'save') {    
  2.     if(isset($mtypeidarr) && is_array($mtypeidarr))   {     
  3.         $delids = '0';     
  4.         $mtypeidarr = array_filter($mtypeidarr'is_numeric');     
  5.         foreach($mtypeidarr as $delid)     {      
  6.             $delids .= ','.$delid;     
  7.             unset($mtypename[$delid]);      
  8.         }      
  9.          $query = "delete from `dede_mtypes` where mtypeid in ($delids) and mid='$cfg_ml->M_ID';";   
  10.          $dsql->ExecNoneQuery($query);   
  11.     }    
  12.     //通过$mtypename进行key注入  
  13.     foreach ($mtypename as $id => $name)   {     
  14.       $name = HtmlReplace($name);     /* 对$id进行规范化处理 */     
  15.       $id = intval($id);     /* */     
  16.       $query = "update `dede_mtypes` set mtypename='$name' where mtypeid='$id' and mid='$cfg_ml->M_ID'";    
  17.       die(var_dump($query));     
  18.       $dsql->ExecuteNoneQuery($query);    
  19.     }   
  20.   ShowMsg('分类修改完成','mtypes.php');  
  21. }   


12,/member/inc/inc_archives_functions.php 
  dedecms cookies泄漏导致SQL漏洞 
 
 
定位到239行
[php]  view plain  copy
  1. echo "<input type=\"hidden\" name=\"dede_fieldshash\" value=\"".md5($dede_addonfields.$cfg_cookie_encode)."\" />";  
修复后:
[php]  view plain  copy
  1.   
[php]  view plain  copy
  1. echo "<input type=\"hidden\" name=\"dede_fieldshash\" value=\"".md5($dede_addonfields."jigumisdfs".$cfg_cookie_encode)."\" />";  
13,/member/article_add.php 
   dedecms cookies泄漏导致SQL漏洞 
 
 
定位到83行
[php]  view plain  copy
  1. if (empty($dede_fieldshash) || $dede_fieldshash != md5($dede_addonfields.$cfg_cookie_encode))  
  2.     {  
  3.         showMsg('数据校验不对,程序返回''-1');  
  4.         exit();  
  5.     }  
修复后
[php]  view plain  copy
  1. if (empty($dede_fieldshash) || ( $dede_fieldshash != md5($dede_addonfields . $cfg_cookie_encode) && $dede_fieldshash != md5($dede_addonfields . 'anythingelse' . $cfg_cookie_encode)) )  
  2.     {  
  3.         showMsg('数据校验不对,程序返回''-1');  
  4.         exit();  
  5.     }  
14,/member/pm.php dedecms注入漏洞,会员中心漏洞

定位到56行
[php]  view plain  copy
  1. else if($dopost=='read')  
  2. {  
  3.     $sql = "SELECT * FROM `#@__member_friends` WHERE  mid='{$cfg_ml->M_ID}' AND ftype!='-1'  ORDER BY addtime DESC LIMIT 20";  
  4.     $friends = array();  
  5.     $dsql->SetQuery($sql);  
  6.     $dsql->Execute();  
  7.     while ($row = $dsql->GetArray())   
  8.     {  
  9.         $friends[] = $row;  
  10.     }  
  11.     //$id注入  
  12.     $row = $dsql->GetOne("SELECT * FROM `#@__member_pms` WHERE id='$id' AND (fromid='{$cfg_ml->M_ID}' OR toid='{$cfg_ml->M_ID}')");//ID没过滤  
  13.     if(!is_array($row))  
  14.     {  
  15.         ShowMsg('对不起,你指定的消息不存在或你没权限查看!','-1');  
  16.         exit();  
  17.     }  
  18.     //$id注入  
  19.     $dsql->ExecuteNoneQuery("UPDATE `#@__member_pms` SET hasview=1 WHERE id='$id' AND folder='inbox' AND toid='{$cfg_ml->M_ID}'");  
  20.     $dsql->ExecuteNoneQuery("UPDATE `#@__member_pms` SET hasview=1 WHERE folder='outbox' AND toid='{$cfg_ml->M_ID}'");  
  21.     include_once(dirname(__FILE__).'/templets/pm-read.htm');  
  22.     exit();  
  23. }  
修复后:
[php]  view plain  copy
  1. else if($dopost=='read')  
  2. {  
  3.     $sql = "Select * From `#@__member_friends` where  mid='{$cfg_ml->M_ID}' And ftype!='-1'  order by addtime desc limit 20";  
  4.     $friends = array();  
  5.     $dsql->SetQuery($sql);  
  6.     $dsql->Execute();  
  7.     while ($row = $dsql->GetArray())   
  8.     {  
  9.         $friends[] = $row;  
  10.     }  
  11.     /* $id过滤 */  
  12.     $id = intval($id);  
  13.     /* */   
  14.     $row = $dsql->GetOne("Select * From `#@__member_pms` where id='$id' And (fromid='{$cfg_ml->M_ID}' Or toid='{$cfg_ml->M_ID}')");  
  15.     if(!is_array($row))  
  16.     {  
  17.         ShowMsg('对不起,你指定的消息不存在或你没权限查看!','-1');  
  18.         exit();  
  19.     }  
  20.     $dsql->ExecuteNoneQuery("Update `#@__member_pms` set hasview=1 where id='$id' And folder='inbox' And toid='{$cfg_ml->M_ID}'");  
  21.     $dsql->ExecuteNoneQuery("Update `#@__member_pms` set hasview=1 where folder='outbox' And toid='{$cfg_ml->M_ID}'");  
  22.     include_once(dirname(__FILE__).'/templets/pm-read.htm');  
  23.     exit();  
  24. }  

15,/member/album_add.php dedecms SQL注入漏洞解决
定位220行
$description = HtmlReplace($description, -1);

修复后:
$description = addslashes(HtmlReplace($description, -1));

16,/plus/guestbook/edit.inc.phpdedecms注入漏洞,留言板注入
所以在
$dsql->ExecuteNoneQuery("UPDATE `dede_guestbook` SET `msg`='$msg', `posttime`='".time()."' WHERE id='$id' "); 
之前对$msg进行过滤  加入这个代码进行过滤 可以解决问题:$msg = addslashes($msg);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值