FineCMS 漏洞不僅皮囊好看,靈魂更有趣
0x00背景
最近在挖掘FineCMS源碼的漏洞,發現了一些有趣的洞,斗哥計劃先從配置文件寫入開始分析,然後再結合存儲XSS進行GetShell,本篇先分析配置文件寫入的問題,下周再分析存儲XSS的問題,最終通過這兩類洞的組合利用GetShell,大體思路流程很簡單,但是代碼分析中有蠻多技巧,期待與師傅們的交流討論。
0x01漏洞審計
1x00相關環境
1x01漏洞分析
在finecmsfinecmsdayruicontrollersInstall.php文件中的第127-131行發現如下代碼塊。
通過反向追溯在當前文件中的第75行中發現$data的創建位置。
跟入post方法,在finecmsfinecmssystemcoreInput.php文件中的第255行中發現發 post方法的代碼塊。
跟入_fetch_from_array方法,在finecmsfinecmssystemcoreInput.php文件中的第177-230行中發現該方法的代碼塊,代碼主要對傳入的數組進行簡單的數據判斷,代碼較多這裡列出重要的代碼,當$xss_clean為TRUE的時候會進行xss_clean操作。通過追溯$xss_clean變數,發現是從finecmsfinecmsdayruiconfigconfig.php配置文件中的$config["global_xss_filtering"]獲取的,但是默認情況下該變數的值為FALSE,不會進行任何的XSS過濾。
但是當$config["global_xss_filtering"]為TRUE會進入finecmsfinecmssystemcoreSecurity.php的xss_clean方法進行XSS過濾,但是不進行單引號的轉義,但是還過濾了PHP的標籤和一些關鍵函數,由於還過濾了尖括弧所以標籤沒想到繞過方法,但是可以使用類似system/*()*/("whoami")的方式繞過關鍵字的過濾規則進行代碼執行。
因此此處可以引入單引號,從而導致寫入php代碼進行GetShell。
1x02漏洞復現
在進行安裝的時候,如果$config["global_xss_filtering"]開啟了,即TRUE,可構造如下請求可以執行PHP代碼導致GetShell。
如果$config["global_xss_filtering"]未開啟即為FALSE,進行如下請求可以GetShell。
成功寫入文件並生成evil.php:
訪問evil.php成功GetShell:
2x00相關環境
2x01漏洞分析
在文件finecmsfinecmsdayruicontrollersadminSite.php的第46-67行中發現如下代碼塊,使用post接收data的數據,然後在檢測域名是否被使用,未被使用將更新資料庫中fn_site表中的domain的欄位。
跟入$this->site_model->cache(),在finecmsfinecmsdayruimodelsSite_model.php文件中的第323-368行中,發現cache()方法,重點看第325行和338行。
跟入$this->get_site_data()方法,在finecmsfinecmsdayruimodelsSite_model.php文件中的第285-300行發現代碼塊,分析代碼塊知道是進行如下的數據查詢,把前面存到資料庫中的配置,取出來然後賦給$data, 通過列印$data可以知道到的就是站點配置的信息。
跟進$t["domain"] && $domain[$t["domain"]] = $id;,$domain最終傳入了如下finecmsfinecmsdayruimodelsSite_model.php文件中的第363行代碼。
因此foreach ($data as $id => $t)後對$domain[$t["domain"]] = $id;進行賦值,其中為$domain變數傳入了鍵名$t["domain"],又因為to_require_one中不會對數組的鍵名進行安全處理,因此可以引入單引號,存在文件寫入的問題。
2x02漏洞復現
可以通過構造如下請求進行文件寫入,並執行代碼的操作:
0x02小結
TAG:漏斗社區 |