其原理就是注入一段用戶能控制的腳本或代碼,並讓服務端執行。文件包含漏洞可能出如今JSP、PHP、 ASP等語言中,原理都是同樣的,本文只介紹PHP文件包含漏洞。php
要想成功利用文件包含漏洞進行攻擊,須要知足如下兩個條件:html
1. Web應用採用include()等文件包含函數經過動態變量的方式引入須要包含的文件 (文件包含函數還有 include_once()、require()、require_once())安全
2. 用戶可以控制該動態變量服務器
如今來看一段簡單的文件包含代碼:函數
<?php $filename = $_GET['filename']; include($filename);
經過上面的代碼能夠看到,在獲得變量$filename的值後沒有通過任何處理,直接帶入include()函數中。此處就存在一個文件包含漏洞,利用該漏洞咱們能夠查看系統中的任意文件。測試
下面咱們來實際測試一下。首先將該PHP頁面上傳到Web服務器,先讓其包含一個正常的txt文件,運行結果以下圖2所示。網站
圖2ui
接着咱們在該txt文本中插入php代碼,看結果如何?這裏給其插入以下圖3所示代碼。url
圖3設計
再次訪問,結果以下圖4所示。
圖4
經過上圖咱們能夠看到文本中的PHP代碼被成功執行了。
利用該漏洞,咱們能夠查看系統中的任意文件,好比常常用到的「/etc/passwd」文件,如圖5所示。
圖5
PHP文件包含漏洞分爲
1、本地文件包含漏洞(LFI):可以打開幷包含本地文件的漏洞,被稱爲本地文件包含漏洞。利用本地文件包含漏洞,能夠查看系統任意文件內容,若是具有一些條件,也能夠執行命令。在下面的漏洞利用技巧部分對這個有詳細介紹。
2、遠程文件包含漏洞(RFI):如 果php.ini的配置選項allow_url_fopen和allow_url_include爲ON的話,則文件包含函數是能夠加載遠程文件的,這種 漏洞被稱爲遠程文件包含漏洞。利用遠程文件包含漏洞,能夠直接執行任意命令。在實際滲透攻擊過程當中,攻擊者能夠在本身的Web服務器上放一個可執行的惡意 文件,經過目標網站存在的遠程文件包含漏洞來加載文件,從而實現執行任意命令的目的。
文件包含漏洞利用技巧
遠程文件包含漏洞之因此可以執行命令,就是由於攻擊者能夠自定義被包含的文件內容。所以,本地文件包含漏洞要想執行命令,也須要找一個攻擊者可以控制內容的本地文件。
目前主要有幾下幾種常見的技巧:
包含用戶上傳的文件。這個很好理解,也是最簡單的一種辦法。若是用戶上傳的文件內容中包含PHP代碼,那麼這些代碼被文件包含函數加載後將會被執行。但可否攻擊成功,取決於上傳功能的設計,好比須要知道上傳文件存放的物理路徑,還須要上傳的文件有執行權限。
包含data://或php://input等僞協議。這須要目標服務器支持,同時要求allow_url_fopen爲設置爲ON。在PHP5.2.0以後的版本中支持data:僞協議,能夠很方便地執行代碼。
包含Session文件。這部分須要攻擊者可以控制部分Session文件的內容,PHP默認生成的Session文件通常存放在/tmp目錄下。
包 含日誌文件。好比Web服務器的訪問日誌文件,這是一種通用的技巧。由於幾乎全部網站都會將用戶的訪問記錄到訪問日誌中。所以,攻擊者能夠向Web日誌中 插入PHP代碼,經過文件包含漏洞來執行包含在Web日誌中的PHP代碼,下面的案例中就是利用該技巧成功獲取到目標網站的WebShell的。但須要注 意的是,若是網站訪問量大的話,日誌文件可能會很是大,這時若是包含一個這麼大的文件時,PHP進程可能會卡死。通常網站一般會天天生成一個新的日誌文 件,所以在凌晨時進行攻擊相對來講容易成功。
包含/proc/self/environ文件。這個也是一種通用的技巧,由於它根本不須要猜想被包含文件的路徑,同時用戶也能控制它的內容,常見的作法是向User-Agent中注入PHP代碼來完成攻擊。
PHP文件包含漏洞防範
本部分主要從代碼層和Web服務器安全配置兩個方面來說解PHP文件包含 漏洞的防範。首先來從代碼層來說,在開發過程當中應該儘可能避免動態的變量,尤爲是用戶能夠控制的變量。一種保險的作法是採用「白名單」的方式將容許包含的文 件列出來,只容許包含白名單中的文件,這樣就能夠避免任意文件包含的風險,可參考下面圖10所示的代碼實現。
圖10
還有一種作法是將文件包含漏洞利用過程當中的一些特殊字符定義在黑名單中,對傳入的參數進行過濾,但這樣有時會由於過濾不全,致使被有經驗的攻擊者繞過。
在 Web服務器安全配置方面能夠經過設定php.ini中open_basedir的值將容許包含的文件限定在某一特定目錄內,這樣能夠有效避免利用文件包 含漏洞進行的攻擊。須要注意的是,open_basedir的值是目錄的前綴,所以假設設置以下值:open_basedir=/var/www /test,那麼實際上如下目錄都是在容許範圍內的。
/var/www/test
/var/www/test123
/var/www/testabc
若是要限定一個指定的目錄,須要在最後加上「/」,這一點須要特別注意。
open_basedir=/var/www/test/
若是有多個目錄,在Windows下目錄間用分號隔開,在Linux下面則用冒號隔開。
綜合來講,文件包含漏洞的防範方案有:
1. 在代碼層面
文件包含函數的文件名儘可能避免動態變量,尤爲是用戶能夠控制的變量;最好使用文件名白名單
2. 服務器配置方面
a. php.ini中open_basedir的值將容許包含的文件限定在某一特定目錄內,這樣能夠有效避免利用文件包 含漏洞進行的攻擊 {本地文件包含漏洞}
b. php.ini的配置選項allow_url_fopen和allow_url_include設置爲Off (禁止打開遠程文件,禁止包含遠程文件) {遠程文件包含漏洞}
文章轉自:http://www.rising.com.cn/newsletter/news/2013-04-25/13587.html