author:toby57 [www.toby57.cn]
date:2008-08-18
Dedecms算是使用比較廣泛的PHP整站系統了,在被使用的同時系統的安全性也被人們關注。在以前dedecms也爆過不少漏洞,官方都很快出了補丁,前幾天80sec公布了注射漏洞
http://www.80sec.com/dedecms-sql-injection.html,其實這個系統也受最近很流行的多位元組編碼漏洞影響。不過今天說的這個漏洞與多位元組編碼無關,倒跟URL編解碼有關係,
呵呵。僅測試了DedeCms2007(DedeCms V5.1 [sp1])。
目錄下的tag.php檔案對變數$tag處理不當,導致注入漏洞的形成,話不多說,貼代碼:
if(isset($_SERVER["QUERY_STRING"])){
$tag = trim($_SERVER["QUERY_STRING"]); //得到GET的參數
$tags = explode('/',$tag); //以“/”分隔為數組$tags
$tag = $tags[1]; //取數組$tags的第二個元素
if(count($tags)>3) $PageNo = intval($tags[2]);
}else{
$tag = "";
}
$tag = urldecode($tag); //對變數$tag做URL解碼處理,%27解碼後就成了“'”
//如果沒有Tag或Tag不合法,顯示所有Tag
if($tag=="" || $tag!=addslashes($tag) ){ //如果$tag為空白或有'、"、\等字元則執行
$dlist = new TagList($tag,'tag.htm'); //建立類TagList的執行個體,$tag傳給其建構函式,此時$tag可能包含“'”
}
//如果有Tag,顯示文檔列表
else{
$dlist = new TagList($tag,'taglist.htm');
}
類TagList相關代碼:(./include/inc_taglist_view.php)
class TagList
{
..
var $Tag;
..
//php5建構函式
function __construct($keyword,$templet) //$keyword=$tag
{
..
$this->Tag = $keyword; //$this->Tag=$tag
..
if($this->Tag!='')
{
$this->TagInfos = $this->dsql->GetOne("Select * From `#@__tag_index` where tagname like '{$this->Tag}' "); //查詢執行,漏洞產生!
}
以上就是代碼的分析,可能說得不太清楚,這樣的漏洞因為可以使用“'”,所以如果條件可以的話可以直接into file得SHELL。
利用方面大家自由發揮。為了方面我自己寫了一個利用程式(http://files.cnblogs.com/allyesno/dedeExp.rar)
當File_priv為YES並得到了實體路徑的時候就可以直接Get the shell了。其中得到實體路徑的方法是利用了./include/htmledit/index.php的一個漏洞,我們提
交./include/htmledit/index.php?modetype=basic&height[]=toby57就可能得到路徑。
如果這樣得不到的話,還可利用重新安裝漏洞,提交./install/index.php?step=2可以重新安裝系統,當然也可以得到實體路徑。
因為不能union查詢,所以運氣差的只有自己Get the hash再破解進後台拿SHELL了。