1. 程式人生 > >PHP程式碼審計實戰之MetInfo CMS

PHP程式碼審計實戰之MetInfo CMS

這次主要白盒審計MetInfo CMS的一個變數覆蓋漏洞。

先檢視\include\common.inc.php檔案,因為其中是通過$_request來獲取使用者請求的資訊:


這裡是遍歷初始化變數,很可能會出現變數覆蓋,判斷了key的第一個字元是不是“_”來避免覆蓋系統全域性變數,以及使用自定義函式daddslashes()對變數值進行處理。

接著檢視daddslashes()函式的定義:


可以看到,該函式先判斷有沒有開啟magic_quotes_gpc即魔法引號,若沒有則呼叫addslashes()函式對通過POST方法提交的內容進行轉義過濾。也就是說,並沒有對GET方法提交的內容進行過濾。

接著來看/about/頁面的資訊,檢視\about\index.php檔案,這裡存在兩個比較可疑的變數、一個是fmodule變數、另一個是module變數,其中還有require_once()函式,可能存在檔案包含漏洞:


先來輸出一下看看$module變數的值是什麼:



可以看到是一個show.php 檔案。

然後嘗試一下能不能將$module變數的值覆蓋掉:


檢視得到並沒有覆蓋掉。

下面接著看包含進來的檔案/include/module.php:


可以看到包含了common.inc.php檔案。

也就是說\about\index.php檔案中的$fmodule變數可以通過包含/include/module.php>包含common.inc.php>然後接收$_request來接受GET方法傳遞過來的新的fmodule值來導致原fmodule變數的值被覆蓋

,輸出嘗試一下:



可以看到fmodule被覆蓋掉了。

因為需要利用到require_once()函式來實現檔案包含漏洞的利用,接著找fmodule變數和module變數之間的關係,回到module.php來跟蹤module變數,可以看到在最後的判斷語句中存在該變數:


先在結尾輸出一下看看能不能進行覆蓋:


當fmodule不為7時,不覆蓋;fmodule為7時,覆蓋:



即存在變數覆蓋漏洞,可以進行檔案包含漏洞的利用。

下面就是利用的示例,包含上傳的小馬檔案xiaoma.txt:


只要將該檔案包含即可進行PHP解析而不是看該檔案字尾名,降低了攻擊成本。接下來的利用就是按部就班了。

防禦方法:

最簡單的防禦實現就是,直接在\about\index.php中判斷module變數的值是否等於“show.php”,若是則包含指定的檔案,否則不進行任何操作:


再次訪問一樣的URL已經不生效了(返回空白頁面):


這裡提一下PHP檔案包含漏洞正常的防禦方法:

1、嚴格判斷包含中的引數是否外部可控。

2、路徑限制,限制被包含的檔案只能在某一個資料夾內,特別是一定要禁止目錄跳轉字元,如:“../”。

3、基於白名單的包含檔案驗證,驗證被包含的檔案是否在白名單中。

4、儘量不要使用動態包含,可以在需要包含的頁面固定寫好,如:“include("head.php")”。

5、可以通過呼叫str_replace()函式實現相關敏感字元的過濾,一定程度上防禦了遠端檔案包含。