杰奇CMS ( Jieqi CMS) 是一套以小說系統為主的CMS,目前的最新版本是1.7,在小說類的站中使用率還是比較高的,這幾天花了點時間看了一下他的代碼,覺得挺有意思的,跟大家分享一下。
整個系統核心代碼是zend加密的,dezend之后看了一下。先從最幾率最大的select型注入看起,但是發現所有地方GET過去的參數,最后都會帶入\lib\database\database.php中組合SQL語句,再帶入到jieqimysqldatabase類(\lib\database\mysql\db.php)的query方法進行最后的執行。
仔細查看后發現不可利用,因為如果是數字型的變量,帶入到database.php時會進行is_numeric檢查;如果是字符串型會進行\轉義,嘗試了寬字節注入,但很可惜的是dp.php中有一句“character_set_client=binary”,也就是說php程序在與mysql交互的時候使用二進制字符集查詢,瞬間絕望了。
再留意了一下,發現程序中并沒有轉碼的操作,所以寬字節注入這條路就徹底不行了。
這是一個不好的信號,因為程序中基本上所有的字符串型都會進行轉義操作,我就不可能跳出魔術引號了。
又黑盒看了一下,后臺的一個地方會顯示用戶留言時的IP,IP是插在數據庫中的,于是考慮了一下能不能偽造IP,看看能否利用來注入或者xss。
分析之后得出獲取IP函數是jieqi_userip (/global.php) www.2cto.com ,采用HTTP_CLIENT_IP的方式來獲取的,可以偽造,但很蛋疼的是jieqi_userip在獲取了IP之后會把小數點替換為空,再進行is_numeric判斷- - || ,又白高興了。
接著找了一下xss,1.7沒有找到xss,1.6有幾個反射型xss。
再接再厲,又看了一下其他一些地方,但都沒太大的突破,最后看到注冊那一塊的時候,發現了一些問題。
處理注冊的頁面是/register.php,post過去的參數有username、password、repassword、email、sex、qq、url、action,跟了一下,發現是這樣一個流程:依次帶入到/regcheck.php中檢查username是否合法,username是否重復,password是否等于repassword,email是否合法,email是否重復。也就是說sex、qq、url并沒有進行檢查,但是qq和url在數據庫中是varchar型,cms會把這兩個參數當字符串處理,也就是說如果出現單引號的話會進行轉義,前面已經說過了,無法跳出魔術引號。
很幸運的是,程序猿百密一疏,天真的認為sex在前臺是以單選框顯示出來的,只有0、1、2這三種可能性,所以沒進行is_numeric判斷,直接帶入到數據庫中,那么就可以利用了。
總結一下,通過這幾天的審計,我覺得其實那個作者安全意識挺高的,對于常見安全性問題都做了相應的防范,在一次次發現我想到的地方作者也想到了而失望的同時,也挺佩服作者的安全意識的,希望作者在看到本文時能及時修補。另外,以上的個人分析如果有什么不足的地方還望各位大牛補充,如果大家發現了1.7版本其他的一些問題或者是其他更好的后臺get webshell的方法,請告訴我一聲,共同交流,共同進步,thx :)