Dedecms 5.7 SP2後臺getshell
阿新 • • 發佈:2018-11-20
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 '-->'是為了閉合註釋,不然我們的程式碼不能執行
當然也可以用菜刀連線了:
微信公眾號關注我