DVWA靶場通關----(4) File Inclusion教程


File Inclusion(文件包含)

File Inclusion(文件包含),是指當服務器開啟了allow_url_include選項時,通過一些PHP的特性函數(比如:include(),require(),include_once()和require_once())利用URL去動態包含文件,此時如果沒有對文件來源進行嚴格審查,就會導致任意文件讀取或者任意命令執行。

文件包含分類

本地文件包含:當被包含的文件在本地服務器時,就叫做本地文件包含

例:../../../../../etc/passwd

遠程文件包含:當被包含的文件在第三方服務器時,就叫做遠程文件包含

例:http://www.baidu.com 可以直接打開百度

特性函數區別

include()   當使用該函數包含文件時,只有代碼執行到include()函數時才將文件包含進來,發生錯誤時只給出一個警告,繼續向下執行
include_once()   功能和include()相同,區別在於當重復調用同一文件時,程序只調用一次
require()   require()與include()的區別在於require()執行如果發生錯誤,函數會輸出錯誤信息,並終止腳本的運行 。使用require()函數包含文件時,只要程序一執行,立即調用文件,而include()只有程序執行到函數時才調用 .require()在php程序執行前執行,會先讀入 require 所指定引入的文件,使它變成 PHP 程序網頁的一部份。
require_once()   它的功能與require()相同,區別在於當重復調用同一文件時,程序只調用一次

File Inclusion主題:

 

Low

源碼解析

<?php

// The page we wish to display
//直接獲取page參數,未做任何過濾
$file = $_GET[ 'page' ];

?>

漏洞復現

(1)先點擊下面的鏈接,進行嘗試,可以看到有結果直接返回了

 (2)這個地方因為我知道他的phpinfo.php文件在他的前兩級目錄文件中,所以我在這里就直接進行嘗試了(本地包含)

 (3)嘗試一下包含百度頁面,發現直接成功了(遠程包含)

 

Medium

源碼解析

<?php

// The page we wish to display
$file = $_GET[ 'page' ];

// Input validation
//將參數中的http:// https:// ../ ..\都替換成空
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\"" ), "", $file );

?>

  這個地方加了一些過濾,將“http://”,“https://”,“../”,“..\”全部替換成了空,這個地方其實可以考慮雙寫繞過。

漏洞復現

構造一個新的

hthttp://tp://www.baidu.com

過濾后

http://www.baidu.com

過濾前

…/./

過濾后

../

 

High

源碼解析

<?php

// The page we wish to display
$file = $_GET[ 'page' ];

// Input validation
//文件名必須以file開始,或只能為include.php
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
    // This isn't the page we want!
    echo "ERROR: File not found!";
    exit;
}

?>

  匹配"file*",以'file'開頭的文件,或者匹配include.php,如果不是以'file'開頭的文件,或者不是include.php,就輸出"ERROR: File not found!"。

漏洞復現

  使用偽協議:file://  (訪問本地文件系統)(偽協議文章參考:https://blog.csdn.net/Wu000999/article/details/101925271)

 

Impossible

源碼解析

<?php

// The page we wish to display
$file = $_GET[ 'page' ];

// Only alLow include.php or file{1..3}.php
//file變量只能為include.php、file1、file2、file3其中一個
if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) {
    // This isn't the page we want!
    echo "ERROR: File not found!";
    exit;
}

?>

漏洞復現

  Impossible難度的代碼使用了白名單機制進行防護,簡單粗暴,page參數必須為“include.php”、“file1.php”、“file2.php”、“file3.php”之一,徹底杜絕了文件包含漏洞。


免責聲明!

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



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