文件包含漏洞(LFI、RFI)(require()、include()函數)


一、文件包含漏洞分類

LFI(Local File Inclusion)
本地文件包含漏洞,指的是能打開並包含本地文件的漏洞。大部分情況下遇到的文件包含漏洞都是LFI。
為了方便本文把LFI直接稱為文件包含漏洞。

RFI(Remote File Inclusion)
遠程文件包含漏洞。是指能夠包含遠程服務器上的文件並執行。由於遠程服務器的文件是我們可控的,因此漏洞一旦存在危害性會很大。但RFI的利用條件較為苛刻,需要php.ini中進行配置

allow_url_fopen = On
allow_url_include = On

兩個配置選項均需要為On,才能遠程包含文件成功。
在php.ini中,allow_url_fopen默認一直是On,而allow_url_include從php5.2之后就默認為Off。

二、文件包含漏洞原理

本地文件包含(Local File Inclusion)漏洞,是程序員在網站設計中,為方便自己在設計構架時,使用了一些包含的函數,在文件中包含一個文件。

服務器執行PHP文件時,可以通過文件包含函數加載另一個文件中的PHP代碼,並且當PHP來執行,這會為開發者節省大量的時間。

這意味着可以創建供所有網頁引用的標准頁眉或菜單文件。當頁眉需要更新時,只更新一個包含文件就可以了,或者當向網站添加一張新頁面時,僅僅需要修改一下菜單文件(而不是更新所有網頁中的鏈接)。

LFI 產生的原因是由於程序員未對用戶可控變量進行輸入檢查,此漏洞的影響可能導致泄露服務器上的敏感文件等。
如若攻擊者能夠通過其他方式在Web服務器上放置代碼,那么他們便可以執行任意命令

 Directory traversal attack is also called a Local File Inclusion or LFI.

翻譯:目錄遍歷攻擊也稱為本地文件包含攻擊LFI

三、文件包含函數

PHP中文件包含函數有以下四種:

require() // 只在執行到此函數時才去包含文件,若包含的文件不存在產生警告,程序繼續運行

require_once() // 如果一個文件已經被包含過,則不會在包含它

include() // 程序一運行文件便會包含進來,若包含文件不存在產生致命錯誤,程序終止運行

include_once() // 如果一個文件已經被包含過,則不會在包含它

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

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

這四個函數可以將任意類型的文件當做 PHP 文件進行解析。
示例代碼:

<?php
    $filename  = $_GET['filename']; // 存在可控變量
    include($filename); // 存在動態變量
?>

例如:

$_GET[‘filename’]參數開發者沒有經過嚴格的過濾,直接帶入了include的函數,
攻擊者可以修改
$_GET[‘filename’]的,執行非預期的操作。

四、測試是否存在本地文件包含(LFI)漏洞

使用 …/ 上一級目錄測試:

?page=../

會返回以下錯誤:

Warning: include(C:\Users\Administrator\Documents\php): failed to open stream: Permission denied in C:\Users\Administrator\Documents\php\LFI\LFI_base.php on line 10

這意味着很有可能存在 LFI 漏洞

使用 常見 頁面

?page=index.html

若是返回 index.html 頁面,也就意味着存在 LFI 漏洞

直接讀取 /etc/passwd 文件(Linux):

?page=/etc/passwd

若是出現了 passwd 數據,那證明此網站容易受到本地文件包含的影響

五、文件包含漏洞實例

“百度杯”CTF比賽 2017 二月場include

題目

既然是文件包含,我們搜索下文件包含關鍵性函數的狀態
在這里插入圖片描述

既然 allow_url_include打開,意味着直接能使php://input用包含post中的代碼。
在這里插入圖片描述
發現文件:dle345aae.php
查看此文件內容:使用php://filter協議查看曝露出來的文件的內容,因為PHP文件不能直接顯示內容所以先base64顯示出來,然后再解碼。
構造語句:

?path=php://filter/read=convert.base64-encode/resource=dle345aae.php

在這里插入圖片描述
然后base64解密即可flag


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM