文件包含:
即File Inclusion,意思是文件包含(漏洞),是指當服務器開啟allow_url_include選項時,就可以通過php的某些特性函數(include(),require()和include_once(),require_once())利用url去動態包含文件,此時如果沒有對文件來源進行嚴格審查,就會導致任意文件讀取或者任意命令執行。文件包含漏洞分為本地文件包含漏洞與遠程文件包含漏洞,遠程文件包含漏洞是因為開啟了php配置中的allow_url_fopen選項(選項開啟之后,服務器允許包含一個遠程的文件)。服務器通過php的特性(函數)去包含任意文件時,由于要包含的這個文件來源過濾不嚴,從而可以去包含一個惡意文件,而我們可以構造這個惡意文件來達到自己的目的。
文件包含漏洞:
攻擊者利用了包含的特性,再加上了應用本身對文件控制不嚴,對include進來的文件不可控,最終造成了攻擊者進行任意文件包含。包含進來的文件都以當前腳本文件解析,比如,我們當前測試系統是Apache加php環境,那么被include進來的文件,不管是什么類型,比如說圖片,文本文檔,這些文件被包含以后,都會被當做php腳本來解析。
LOW
源碼:
測試:本地文件包含,在目錄中加一個test.txt
執行成功:
注意:無論文件后綴名是什么,只要文件內容為php腳本都會正確解析并且執行
漏洞利用:
實際利用需要利用文件上傳漏洞,上傳木馬,
fputs函數:為php函數,功能和fwrite函數一樣,表示創建一個新文件,這樣上傳成功以后就會在當前平臺文件所在目錄下面創建一個含有木馬的dvwainclusion.php文件
蟻劍連接,這個就很恐怖了,可以打開我電腦下所有文件
medium:
源碼
str_replace函數將 “http://” “https:\” “…/” “…” 替換成空
繞過 :
所有 “http://” 用 “htthttp://p://” 代替
"…/“用”…/./"代替
以此類推
遠程文件包含:
后面的漏洞利用就與low操作相同了
high:
High級別的代碼使用了fnmatch函數檢查page參數,要求page參數的開頭必須是file,服務器才會去包含相應的文件。
High級別的代碼規定只能包含file開頭的文件,看似安全,不幸的是我們依然可以利用file協議繞過防護策略。
使用file:///協議可以成功訪問,其余的步驟就和前面一樣了
impossible
可以看到,Impossible級別的代碼使用了白名單機制進行防護,簡單粗暴,page參數必須為“include.php”、“file1.php”、“file2.php”、“file3.php”之一,徹底杜絕了文件包含漏洞。
強行總結
防御從低到高依次:
無防護無過濾
str_replace函數過濾 “http://” “https:\” “…/” “…”(str_replace 函數具有危險性,比較容易繞過,例如雙寫)
fnmatch函數檢查參數開頭
白名單限制(簡單有效)