對騎士cms代碼進行代碼審計,通過通讀的方法。
版本号:3.5.1
下載下傳位址:http://103.45.101.75:66/2/201412/74cms.rar
通讀審計
首先需要看看有哪些檔案和檔案夾,尋找名稱裡有沒有帶有api、admin、manage、include一類關鍵字的檔案和檔案夾,通常這些檔案比較重要,在這個程式裡,可以看到并沒有什麼PHP檔案,就一個index.php,看到有一個名為include的檔案夾,一般比較核心的檔案都會放在這個檔案夾中,我們先來看看大概有哪些檔案
image.png
1.2 檢視關鍵檔案
在include裡面,common.fun.php就是本程式的核心,大多數功能都在這裡實作。
我們來看一下裡面都有哪些關鍵函數
一開始就看到SQL注入過濾函數
該函數将傳人的變量使用addslashes()函數進行過濾,也就過濾掉了單引号、雙引号、NULL字元以及斜杠,現在我們要記住,在挖掘SQL注入等漏洞時,隻要參數在拼接到SQL語句前,除非有寬位元組注入或者其他特殊情況,否則使用了這個函數就不能注入了。
再往下走是一個XSS過濾的函數mystrip_tags
下面調用了new_html_special_chars和remove_xss函數去處理。
在new_html_special_chars()函數中可以看到,這個函數對&符号、雙引号以及尖括号進行了html實體編碼,并且使用striptags()函數進行了二次過濾。而remove_xss()函數則是對一些标簽關鍵字、事件關鍵字以及敏感函數關鍵字進行了替換。
再往下就有擷取IP的函數,此處可以僞造IP。其它程式在擷取IP時沒有驗證IP格式,也可能利用擷取IP進行注入。
下面是inserttable和updatetable函數,這裡有大量的SQL語句進行查詢,主要看有沒有過濾問題。
再往下走則是wheresql()函數,是SQL語句查詢的Where條件拼接的地方,我們可以看到參數都使用了單引号進行包裹。
還有一個通路令牌生成的函數asyn_userkey(),拼接使用者名、密碼salt以及密碼進行一次md5,通路的時候隻要在GET參數key的值裡面加上生成的這個key即可驗證是否有權限,被用在注冊、找回密碼等驗證過程中,也就是我們能看到的找回密碼連結裡面的key。
同目錄下是具體功能的檔案,可以先不看
查找目錄下的config檔案
發現/data下的cache_config和config才是配置檔案。
可以看到是,QISHI_DBCHARSET常量是GBK編碼的,是以上面和資料相關的雙引号解析代碼處,可能存在寬位元組注入。不過需要看資料庫連接配接時設定的編碼
接着找資料庫連接配接檔案/include/mysql.class.php中的connect函數
也就是當MySQL版本大于4.1時執行“set names gbk”,但當小于5.0.1時,下面不執行。
隻執行set names gbk。
但set names gbk 等價于
設定用戶端的編碼
set character_set_client=gbk 設定連接配接器編碼 set character_set_connection=gbk 設定傳回值編碼 set character_set_results=gbk client(用戶端)、connection(連接配接器)、results(傳回值)
是以,在MySQL4.1-5.0.1之間都存在寬位元組注入。
通過對系統檔案大概的了解,我們對這套程式的整體架構已經有了一定的了解,但是還不夠,是以我們得跟讀一下index.php檔案,看看程式運作的時候會調用哪些檔案和函數。
跟進到common.inc.php檢視
可以看到引用了config.php為配置檔案,common.fun.php是核心功能檔案,74cms_version.php是版本檔案
繼續往下,可以看到對傳輸的資料進行過濾
再往下看到一個包含檔案的操作
跟進到tpl.inc.php檔案
可以看到進行了一個模版檔案映射,并對smarty進行賦予屬性。
現在回到index.php檔案
判斷是否存在緩存,然後用display将頁面展示。
到這裡發現了特定資料庫版本存在寬位元組注入,并對騎士CMS的代碼有了更多了解。