1. 程式人生 > >Dedecms 5.7 SP2後臺getshell

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 '-->'是為了閉合註釋,不然我們的程式碼不能執行

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


這裡寫圖片描述
微信公眾號關注我