目錄
一、ini文件繞過原理
二、源碼審計
三、滲透實戰
1、查看提示
2、制作.user.ini文件
(1)首先創建一個文本文件
(2)保存文件名為.user.ini
2、制作jpg后綴腳本
(1)創建一個文本文件
(2)保存為文件名pass5.jpg
3、上傳ini與jpg文件
(1)準備好待上傳文件
(2)打開upload靶場第五關
?(3)上傳ini與jpg文件
4、訪問readme.php
本文通過《upload-labs靶場通關筆記系列》來進行upload-labs靶場的滲透實戰,本文講解upload-labs靶場第四關文件.ini滲透實戰。
一、ini文件繞過原理
在 PHP 環境中,ini文件可以用于配置 PHP 的運行環境。.user.ini 是 PHP 中用于特定目錄配置的特殊文件 ,類似 Apache 的.htaccess 文件,主要作用如下所示。
- 自定義配置:允許非管理員用戶為特定目錄定義 PHP 配置指令,這些指令在該目錄及其子目錄中的 PHP 腳本執行時生效。比如可修改 upload_max_filesize 調整上傳文件大小限制、修改 memory_limit 改變腳本可用內存 ,而不影響整個服務器配置。
- 文件包含:借助配置項 auto_prepend_file(在執行 PHP 文件前自動包含指定文件)和 auto_append_file(在執行 PHP 文件后自動包含指定文件) ,可實現惡意代碼注入或后門構造。攻擊者上傳惡意.user.ini 文件,指定包含惡意 PHP 代碼文件,就能在用戶訪問目錄下 PHP 文件時執行惡意代碼。
? ?在文件上傳關卡,具體利用方法如下所示。
- 編寫.user.ini 文件:創建.user.ini,寫入如下內容,意思是讓服務器在每個 PHP 請求前自動包含名為pass5.jpg的文件。
auto_prepend_file = "pass5.jpg"
- 準備pass5.jpg的shell文件:創建pass5.jpg,內容為獲取服務器php信息的PHP 代碼,具體如下所示。
<?php
phpinfo();
?>
- 上傳文件:當該關卡允許.ini和jpg后綴上傳時,嘗試將.user.ini 和pass5.jpg上傳到服務器指定目錄。
- 觸發執行:上傳成功后,訪問目錄下可執行的 PHP 文件(如關卡中提示的 readme.php ),服務器會根據.user.ini 配置,自動包含并執行pass5.jpg中的惡意代碼。
二、源碼審計
接下來對upload-labs 第 5 關的源碼進行審計,如下為已經進行詳細注釋版的代碼,很明顯這段代碼也是黑名單過濾來實現進行安全檢查的。雖然包含多種變體(".php", ".php5", ".php4", ".php3", ".php2", ".php1", ".html", ".htm", ".phtml", ".pht", ".pHp", ".pHp5", ".pHp4", ".pHp3", ".pHp2", ".pHp1", ".Html", ".Htm", ".pHtml", ".jsp", ".jspa", ".jspx", ".jsw", ".jsv", ".jspf", ".jtml", ".jSp", ".jSpx", ".jSpa", ".jSw", ".jSv", ".jSpf", ".jHtml", ".asp", ".aspx", ".asa", ".asax", ".ascx", ".ashx", ".asmx", ".cer", ".aSp", ".aSpx", ".aSa", ".aSax", ".aScx", ".aShx", ".aSmx", ".cEr", ".sWf", ".swf", ".htaccess"),與第四關的區別是將“ini”變為了“htaccess”,所以很明顯這一關卡遺漏新的危險擴展名(如.ini等),這也是我們滲透這一關卡的關鍵。
<?php
// 初始化上傳狀態變量
$is_upload = false; // 布爾值,標記文件是否上傳成功
$msg = null; // 字符串,用于存儲上傳過程中的錯誤信息// 檢查是否通過POST方法提交了表單(submit按鈕被點擊)
if (isset($_POST['submit'])) {// 檢查上傳目錄是否存在if (file_exists(UPLOAD_PATH)) {// 定義禁止上傳的文件擴展名黑名單(包含各種變體)$deny_ext = array(// PHP相關擴展名及變體".php", ".php5", ".php4", ".php3", ".php2", ".pHp", ".pHp5", ".pHp4", ".pHp3", ".pHp2",// HTML相關擴展名及變體".html", ".htm", ".phtml", ".pht",".Html", ".Htm", ".pHtml",// JSP相關擴展名及變體".jsp", ".jspa", ".jspx", ".jsw", ".jsv", ".jspf", ".jtml",".jSp", ".jSpx", ".jSpa", ".jSw", ".jSv", ".jSpf", ".jHtml",// ASP相關擴展名及變體".asp", ".aspx", ".asa", ".asax", ".ascx", ".ashx", ".asmx", ".cer",".aSp", ".aSpx", ".aSa", ".aSax", ".aScx", ".aShx", ".aSmx", ".cEr",// 其他危險文件類型".sWf", ".swf", // Flash文件".htaccess" // Apache配置文件);// 獲取并處理上傳文件名$file_name = trim($_FILES['upload_file']['name']); // 去除首尾空格$file_name = deldot($file_name); // 刪除文件名末尾的點(防御file.php.攻擊)$file_ext = strrchr($file_name, '.'); // 獲取文件擴展名(從最后一個點開始)$file_ext = strtolower($file_ext); // 統一轉換為小寫$file_ext = str_ireplace('::$DATA', '', $file_ext); // 去除NTFS備用數據流$file_ext = trim($file_ext); // 去除擴展名首尾空格// 檢查文件擴展名是否在黑名單中if (!in_array($file_ext, $deny_ext)) {// 獲取上傳的臨時文件路徑$temp_file = $_FILES['upload_file']['tmp_name'];// 構造目標文件路徑(使用原始文件名,存在安全隱患)$img_path = UPLOAD_PATH.'/'.$file_name;// 將臨時文件移動到目標位置if (move_uploaded_file($temp_file, $img_path)) {$is_upload = true; // 標記上傳成功} else {$msg = '上傳出錯!'; // 文件移動失敗(可能權限不足或目錄不可寫)}} else {$msg = '此文件類型不允許上傳!'; // 文件類型被禁止}} else {$msg = UPLOAD_PATH . '文件夾不存在,請手工創建!'; // 上傳目錄不存在}
}
?>
三、滲透實戰
1、查看提示
進入靶場pass5,點擊右上角的提示,得知上傳目錄存在readme.php文件,如下圖所示。
2、制作.user.ini文件
(1)首先創建一個文本文件
創建文件并里面寫入,該配置文件的效果是在.user.ini相同的目錄下,所有的php文件都包含pass5.jpg這個文件。
auto_prepend_file=pass5.jpg
(2)保存文件名為.user.ini
將文件保存為.user.ini并將保存類型配置為所有文件
2、制作jpg后綴腳本
(1)創建一個文本文件
代碼內容如下所示:
<?php
phpinfo();
?>
(2)保存為文件名pass5.jpg
點擊文件另存為pass5.jpg,保存類型設置為所有文件。
3、上傳ini與jpg文件
(1)準備好待上傳文件
兩個所需要的文件就創建完畢,圖示如下。
(2)打開upload靶場第五關
http://127.0.0.1/upload-labs/Pass-05/index.php
?(3)上傳ini與jpg文件
如下所示,上傳user.ini與jpg文件,兩者均上傳成功。
4、訪問readme.php
根據本關提示,在上傳目錄下是有一個readme.php
文件的,所以直接訪問url:http://127.0.0.1/upload-labs/upload/readme.php,如下所示,php版本號成功顯示,證明文件上傳成功。