01、什么是文件包含漏洞?
攻擊者利用包含的特性,加上應用本身對文件(包含)控制不嚴格,最終造成攻擊者進行任意文件包含。(包含的文件內容會被當成PHP腳本文件來解析,忽略文件后綴名)
一句話來說就是:文件包含并不屬于漏洞,但是由于對包含進來的文件不可控,導致了文件包含漏洞的產生。
本地文件包含叫做LFI(local file include),遠程文件包含叫做RFI(remote file include),默認PHP不開啟遠程文件包含。
02、相關函數
- include:PHP運行到include然后去調用被包含文件執行,如果包含文件不存在則報錯,但是會繼續往下執行;
- require:PHP在運行前,就先去把被包含文件的內容提取出來然后整合成新的PHP一齊執行,如果包含的文件不存在則報錯,不會繼續執行;
- include_once|require_once:如果文件已經被包含一次就不會重復包含。
舉例,網站根目錄下有一個名為 “test.txt” 的文本文件,內容如下:
圖1 test.txt
在一張頁面中引用這個文件,我使用了include語句,內容如下:
圖2 include.php
使用瀏覽器訪問帶有文件包含的頁面時,效果如下:
圖3 訪問頁面
03、漏洞描述
CVE-2018-12613漏洞來自phpMyAdmin中的一部分代碼被重定向和加載,以及對白名單頁面進行不正確的過濾,導致攻擊者能夠讀取到服務器下的任意文件。
影響版本:
phpMyAdmin 4.8.0 和 4.8.1
代碼審計
1、首先文件包含利用位于/index.php文件中的target參數
第55-63行:
圖 4 index.php
這里寫明了想執行包含文件代碼include $_REQUEST[‘target’],需要滿足以下5個條件:
- $_REQUEST[‘target’] 不為空;
- $_REQUEST[‘target’] 是字符串;
- $_REQUEST[‘target’] 開頭不是index;
- $_REQUEST[‘target’] 不在 $target_blacklist 中;
- Core::checkPageValidity($_REQUEST[‘target’]) 為真。
于是,往前追溯找到變量$target_blacklist具體含有哪些內容。
在同一文件下50-52行:
圖 5 target_blacklist
這時清楚了當$_REQUEST[‘target’]不是import.php或export.php,即可以實現文件包含。
二、接下來定位另一個限制,在
/libraries/classes/core.php文件中的checkPageValidity()方法。
位于443-478行處:
圖6 checkPageValidity方法
分析該方法中包含的幾個if判斷:
- 首先$whitelist為空,賦值為self::$goto_whitelist
圖7 白名單內容
- 如果$page在白名單中,就會返回true,但是我們的$page帶有參數,就要進行一下判斷若$page存在$whitelist中的某個值則返回true;
mb_strpos()函數的意思是返回$page中” ? “的位置,然后substr()函數進行截取,返回結果$_page去的是$page問號前面的部分。如果$_page在白名單中就會返回ture。
- 最后可以得出,若傳入target=db_sql.php%253f/../../test.txt(%253f是?的url二次編碼),經過兩次解碼后(GET傳參默認解碼一次url)變回?,分割后取出前面的字符串為db_sql.php,會進入最后一個 if 判斷返回 true
因為php會將前面的db_sql.php?當成目錄,所以需要多加一個/../來跨出目錄。如果包含的文件需要傳參的時候可以使用&符號。
所以,只要taget參數的值構造得當,就可以實現繞過它的檢測,實現文件包含漏洞。
05、漏洞復現
payload:
http://[phpmyadmin_ip]/index.php?target=db_sql.php%253f/../../../../etc/passwd
圖 8 漏洞利用
可以看到成功讀取了/etc/passwd文件,除此之外還能使用該漏洞配合sql語句寫入木馬后getshell,感興趣的小伙伴可以深入研究,發現更多的利用姿勢。
06、防御措施
1. 在建站的過程中,非必須的情況下設置allow_url_include和allow_url_fopen為關閉;
2. 如果需要文件包含,應對包含的文件進行限制,使用白名單方式或設置可包含目錄,如open_basedir;
3. 對用戶輸入進行嚴格檢查,參數中不允許出現../之類的目錄跳轉符;
4. 嚴格檢查include類的文件包含函數中的參數是否外界可控。
版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。