第三十二天(文件操作安全)

文件遍歷上傳下載刪除編輯包含等

$_FILES:PHP中一個預定義的超全局變量,用于在上傳文件時從客戶端接收文件,并將其保存到服務器上。它是一個包含上傳文件信息的數組,包括文件名、類型、大小、臨時文件名等信息。

$_FILES"表單值" 獲取上傳文件原始名稱

$_FILES"表單值" 獲取上傳文件MIME類型

$_FILES"表單值" 獲取上傳文件字節單位大小

$_FILES"表單值" 獲取上傳的臨時副本文件名

$_FILES"表單值" 獲取上傳時發生的錯誤代碼

move_uploaded_file() 將上傳的文件移動到指定位置的函數

#文件顯示:

1.打開目錄讀取文件列表

2.遞歸循環讀取文件列表

3.判斷是文件還是文件夾

4.PHP.INI目錄訪問控制

is_dir() 函數用于檢查指定的路徑是否是一個目錄

opendir() 函數用于打開指定的目錄,返回句柄,用來讀取目錄的文件和子目錄

readdir() 函數用于從打開的目錄句柄中讀取目錄中的文件和子目錄

open_basedir:PHP.INI中的設置用來控制腳本程序訪問目錄

scandir() 函數返回指定目錄中的文件和目錄列表,以數組形式返回

ini_set('open_basedir',DIR); 設置配置文件中,只能訪問本目錄

?scandir 函數遍歷目錄

用opendir 加 readdir 函數遍歷文件目錄 用兩個“\\” 防止一個\時識別為轉義字符

?

#文件刪除:

unlink() 文件刪除函數

調用命令刪除:system shell_exec exec等

?unlink() 函數 1.txt和file.php 在同一級 訪問地址后1.txt被刪除,輸出文件名

用系統命令刪除文件

#文件下載:

修改HTTP相應頭實現文件讀取解析下載:

header("Content-Type: application/octet-stream");

header("Content-Disposition: attachment; filename="" . $file . """);

header("Content-Length: " . filesize($file));

readfile($file);

這里正常訪問1.php 是可以正常顯示內容的

當訪問file.php 時就變成下載1.php文件了,這里可以打開f12 查看數據包響應頭內容 ,就會出現代碼中的那幾句修改頭參數的值 的內容

#文件讀取:

1、file_get_contents() 讀取文件內容

2、fopen() fread() 文件打開讀入

?右鍵 點擊查看頁面源代碼

#文件包含:

include、require、include_once、require_once等

直接訪問寫有php代碼的txt文件時,只會講php代碼輸出出來,而不會執行

當訪問file.php 時,1.txt中的php代碼就會被執行

require

include_once

require_once

實踐:

讓ai寫一個文件編輯,下載,讀取,刪除的功能

<?php
// 設置默認路徑
$directory = isset($_GET['dir']) ? $_GET['dir'] : './';
?
// 文件操作
if (isset($_POST['action'])) {
??? if ($_POST['action'] == 'create_folder' && !empty($_POST['folder_name'])) {
??????? // 創建文件夾
??????? mkdir($directory . '/' . $_POST['folder_name']);
??? } elseif ($_POST['action'] == 'delete' && isset($_POST['file'])) {
??????? // 刪除文件或文件夾
??????? $path = $directory . '/' . $_POST['file'];
??????? if (is_dir($path)) {
??????????? rmdir($path); // 刪除文件夾
??????? } else {
??????????? unlink($path); // 刪除文件
??????? }
??? } elseif ($_POST['action'] == 'rename' && isset($_POST['file']) && isset($_POST['new_name'])) {
??????? // 重命名文件或文件夾
??????? rename($directory . '/' . $_POST['file'], $directory . '/' . $_POST['new_name']);
??? } elseif ($_POST['action'] == 'save_edit' && isset($_POST['file']) && isset($_POST['file_content'])) {
??????? // 保存文件內容
??????? file_put_contents($directory . '/' . $_POST['file'], $_POST['file_content']);
??? }
}
?
// 下載文件
if (isset($_GET['download']) && !empty($_GET['download'])) {
??? $file = $directory . '/' . $_GET['download'];
??? if (file_exists($file)) {
??????? // 設置下載頭
??????? header('Content-Type: application/octet-stream');
??????? header('Content-Disposition: attachment; filename="' . basename($file) . '"');
??????? header('Content-Length: ' . filesize($file));
??????? readfile($file);
??????? exit;
??? } else {
??????? echo '文件不存在!';
??? }
}
?
// 讀取文件內容
$content = '';
if (isset($_GET['read']) && !empty($_GET['read'])) {
??? $file = $directory . '/' . $_GET['read'];
??? if (file_exists($file)) {
??????? $content = file_get_contents($file);
??? } else {
??????? $content = '文件不存在!';
??? }
}
?
// 列出目錄中的文件和文件夾
$files = scandir($directory);
$files = array_diff($files, array('.', '..')); // 排除 . 和 ..
?
?>
?
<!DOCTYPE html>
<html lang="en">
<head>
??? <meta charset="UTF-8">
??? <meta name="viewport" content="width=device-width, initial-scale=1.0">
??? <title>PHP 文件管理器</title>
??? <style>
??????? body {
??????????? font-family: Arial, sans-serif;
??????? }
??????? .file-manager {
??????????? max-width: 800px;
??????????? margin: 0 auto;
??????????? padding: 20px;
??????? }
??????? table {
??????????? width: 100%;
??????????? border-collapse: collapse;
??????? }
??????? th, td {
??????????? padding: 10px;
??????????? border: 1px solid #ddd;
??????? }
??????? th {
??????????? text-align: left;
??????? }
??????? .action-buttons {
??????????? margin-top: 20px;
??????? }
??????? .action-buttons form {
??????????? display: inline-block;
??????????? margin-right: 10px;
??????? }
??????? .content-area {
??????????? margin-top: 20px;
??????? }
??????? textarea {
??????????? width: 100%;
??????????? height: 300px;
??????? }
??? </style>
</head>
<body>
<div class="file-manager">
??? <h2>文件管理器</h2>
??? <h3>當前目錄:<?php echo $directory; ?></h3>
?
??? <!-- 文件和文件夾列表 -->
??? <table>
??????? <thead>
??????? <tr>
??????????? <th>名稱</th>
??????????? <th>類型</th>
??????????? <th>操作</th>
??????? </tr>
??????? </thead>
??????? <tbody>
??????? <?php foreach ($files as $file): ?>
??????????? <tr>
??????????????? <td>
??????????????????? <?php if (is_dir($directory . '/' . $file)): ?>
??????????????????????? <a href="?dir=<?php echo urlencode($directory . '/' . $file); ?>"><?php echo $file; ?>/</a>
??????????????????? <?php else: ?>
??????????????????????? <?php echo $file; ?>
??????????????????? <?php endif; ?>
??????????????? </td>
??????????????? <td><?php echo is_dir($directory . '/' . $file) ? '文件夾' : '文件'; ?></td>
??????????????? <td>
??????????????????? <!-- 刪除操作 -->
??????????????????? <form action="" method="POST" style="display:inline;">
??????????????????????? <input type="hidden" name="action" value="delete">
??????????????????????? <input type="hidden" name="file" value="<?php echo $file; ?>">
??????????????????????? <button type="submit" onclick="return confirm('確定要刪除此文件嗎?');">刪除</button>
??????????????????? </form>
??????????????????? <!-- 下載操作 -->
??????????????????? <?php if (!is_dir($directory . '/' . $file)): ?>
??????????????????????? <a href="?download=<?php echo urlencode($file); ?>">下載</a>
??????????????????? <?php endif; ?>
??????????????????? <!-- 重命名操作 -->
??????????????????? <form action="" method="POST" style="display:inline;">
??????????????????????? <input type="hidden" name="action" value="rename">
??????????????????????? <input type="hidden" name="file" value="<?php echo $file; ?>">
??????????????????????? <input type="text" name="new_name" placeholder="新名稱" required>
??????????????????????? <button type="submit">重命名</button>
??????????????????? </form>
??????????????????? <!-- 編輯操作 -->
??????????????????? <?php if (!is_dir($directory . '/' . $file)): ?>
??????????????????????? <a href="?read=<?php echo urlencode($file); ?>">編輯</a>
??????????????????? <?php endif; ?>
??????????????? </td>
??????????? </tr>
??????? <?php endforeach; ?>
??????? </tbody>
??? </table>
?
??? <!-- 創建新文件夾 -->
??? <div class="action-buttons">
??????? <h3>創建新文件夾</h3>
??????? <form action="" method="POST">
??????????? <input type="hidden" name="action" value="create_folder">
??????????? <input type="text" name="folder_name" placeholder="文件夾名稱" required>
??????????? <button type="submit">創建</button>
??????? </form>
??? </div>
?
??? <!-- 文件內容區 -->
??? <?php if (!empty($content)): ?>
??????? <div class="content-area">
??????????? <h3>編輯文件</h3>
??????????? <form action="" method="POST">
??????????????? <input type="hidden" name="action" value="save_edit">
??????????????? <input type="hidden" name="file" value="<?php echo $_GET['read']; ?>">
??????????????? <textarea name="file_content"><?php echo htmlspecialchars($content); ?></textarea><br>
??????????????? <button type="submit">保存更改</button>
??????????? </form>
??????? </div>
??? <?php endif; ?>
?
</div>
</body>
</html>

效果

點擊目錄時會進到該目錄下,上面會有一個參數,通過修改參數實現跳級 %2F 就是 /

在后面加一個../ 就跳一級,就到了上級目錄 這里跳不了盤,可能有限制 這里是文件顯示

當點擊編輯某個文件時,上面的參數名變了 那這里是不是可以實現對上級文件的編輯呢,從而拿到代碼

在這個目錄上級中有一個upload.html 文件,這里嘗試讀取它,發現可以成功讀取, 當目標有這個編輯功能時,可以測試一下,黑盒中用fuzz工具去跑文件名,拿到文件名再來測試

刪除文件,這里先測試一下,先刪除了1.txt 在f12 下的負載中看到delete 字樣 ,下面還有一個1.txt,猜想,如果我把1.txt 改成上級目錄下的某個文件,是否可以對其進行刪除呢?

打開butp 攔截 刪除操作數據包 ,將1.txt 修改成../upload.html 然后把數據包放出去,在回到瀏覽器中點擊確認刪除,再去上級目錄查看一下,upload.html 文件是否被刪除了,這里測試是可以刪除的

上述測試,可以對任意文件進行修改,刪除,讀取

#代碼審計案例

1、Rrzcms遍歷讀取

https://xz.aliyun.com/t/10932

先安裝一下

這里其實是一個偽靜態的頁面

登錄一下后臺頁面

進來后找到有關文件的地方,這里演示時雖然是在后臺管理員里面操作,但是實戰時只要普通用戶也有文件操作的功能也可以作為測試點,這里分黑盒和白盒,黑盒就嘗試是否可以跳級等等,白盒就直接從代碼里面看

黑盒測試

打開burp 攔截數據包,然后修改參數值在放出去

這里看到一個參數 path ,嘗試修改它,看是否能跳級

將path值改成 ../ 再放出去,發現不行

白盒中,先按照url找到對應的文件

然后進到文件里面找調用的方法,直接搜索,發現這里是要帶 template 如果參數值沒有這個就會報錯

這里保留template 然后輸入,,/index.php 成功讀取到上級目錄的index.php 文件

2、Metinfo文件下載

任意文件下載+讀取+刪除

3、Xhcms文件包含

https://xz.aliyun.com/t/11310

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/93136.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/93136.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/93136.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

系統集成項目管理工程師【第十一章 規劃過程組】規劃風險應對、規劃采購管理篇

系統集成項目管理工程師【第十一章 規劃過程組】規劃風險應對、規劃采購管理篇 一、規劃風險應對&#xff1a;為項目穿上"防護衣" 1. 什么是規劃風險應對&#xff1f; 規劃風險應對是基于風險量化分析結果&#xff0c;制定可選方案、選擇應對策略并商定具體行動的過程…

20250813比賽總結

題目T1.volumeT2.storyT3.treeT4.game預計分數6060030實際分數306000T1.volume 確實是暴力&#xff0c;但我是用數組統計每個可能出現的數&#xff0c;于是3AC 3WA 4TLE。拿到全部分應該直接按照題目模擬。 T2.story 暴力dfs&#xff0c;由于忘記優化所以60pts&#xff0c;而且…

適合物流/應急/工業的對講機,AORO M6 Pro構建高效指揮調度方案

在物流調度、應急救援與工業協同等對通信可靠性要求極高的領域中&#xff0c;專業對講設備的技術迭代直接關系到任務執行效率與安全保障。AORO M6 Pro對講機作為新一代融合通信終端&#xff0c;正以多模融合技術與國產化自主創新&#xff0c;為復雜場景下的高效調度提供堅實的技…

類和對象----中

這里寫目錄標題<font color"#FF00FF">1. 類和對象(中)<font color"#FF00FF">2. 構造函數<font color"#FF00FF">3. 析構函數<font color"#FF00FF">4. 拷?構造函數1. 類和對象(中) 類的默認成員函數&#xff1…

CAD 的 C# 開發中,對多段線(封閉多邊形)內部的點進行 “一筆連線且不交叉、不出界

本質上是約束條件下的路徑規劃問題&#xff0c;核心是找到一條連續路徑遍歷所有點&#xff0c;同時滿足&#xff1a; 路徑不與自身交叉&#xff1b; 路徑全程在多段線&#xff08;多邊形&#xff09;內部&#xff1b; 路徑連續&#xff08;一筆畫&#xff09;。核心思路與算法步…

ZED 2i相機調試

1. 測試 ZED SDK /usr/local/zed/tools/ZED_Diagnostic/usr/local/zed/tools/ZED_Explorer2. 安裝SDK How to Install ZED SDK on Linux - Stereolabs 安裝命令&#xff1a; sudo apt install zstd./ZED_SDK_Ubuntu20_cuda12.1_tensorrt8.6_v5.0.5.zstd.run

Go語言select并發編程實戰指南

一、select作用Go 語言中的 select 語句是處理多通道&#xff08;Channel&#xff09;操作的核心控制結構&#xff0c;專為高效并發通信而設計。通過巧妙運用 select 語句&#xff0c;開發者能夠高效實現并發控制、超時處理和非阻塞通信等功能&#xff0c;使其成為 Go 語言并發…

OpenCV常見問題匯總

1、深度拷貝的問題我對整張圖像通過裁剪分別進行識別&#xff0c;出現識別結果與期望不同的問題&#xff0c;經過大量排查是OpenCV深度拷貝問題&#xff0c;我原來有問題的寫法cv::Mat matCrop matZoom(roi); cv::Mat matCrop1 matCrop(roi1); cv::Mat matCrop2 matCrop(roi2)…

【Unity開發】Unity核心學習(一)

一、2D相關1、圖片導入相關設置 &#xff08;1&#xff09;Unity支持的圖片格式 支持BMP、TIF、JPG、PNG、TGA、PSD 常用格式具體介紹&#xff1a; JPG&#xff1a;指JPGE格式&#xff0c;屬于有損壓縮格式&#xff0c;無透明通道 PNG&#xff1a;無損壓縮格式&#xff0c;有透…

Python自定義異常類的寫法與使用場景

在軟件開發的生命周期中&#xff0c;異常處理是保障程序健壯性與可維護性的關鍵環節。Python作為一門高級編程語言&#xff0c;內置了豐富的異常機制&#xff0c;能夠高效、優雅地應對運行時的各種錯誤。然而&#xff0c;面對復雜業務場景和多層架構時&#xff0c;內置異常往往…

為 Promethus 配置https訪問

一、序言 本篇將介紹如何使用數字證書為Promethus 訪問提供加密功能&#xff0c;由于是實驗環境證書由openssl生成&#xff0c;操作指南來自官網手冊&#xff1a;https://prometheus.io/docs/guides/tls-encryption/在生產環境中prometheus可能會放在后端&#xff0c;證書一般配…

擺脫例行 SQL 報表的隱性成本:用 n8n 構建四節點自動化報告流程

例行 SQL 報表的隱藏成本 各類組織的數據團隊都面臨同樣的反復難題:利益相關方需要定期報告,但手工 SQL 報表占用了本可用于分析的寶貴時間。無論公司規模如何,流程幾乎一致——連接數據庫、執行查詢、格式化結果,并將結論分發給決策者。 數據從業者經常要處理并不需要高…

HCIP——OSPF綜合實驗

一、實驗拓撲二、實驗要求1、R4為ISP&#xff0c;其上只配置IP地址&#xff1b;R4與其他所直連設備間均使用公有IP&#xff1b; 2、R3-R5、R6、R7為MGRE環境&#xff0c;R3為中心站點&#xff1b; 3、整個OSPF環境IP基于172.16.0.0/16劃分&#xff1b;除了R12有兩個環回&#x…

GitHub 趨勢日報 (2025年08月12日)

&#x1f4ca; 由 TrendForge 系統生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日報中的項目描述已自動翻譯為中文 &#x1f4c8; 今日獲星趨勢圖 今日獲星趨勢圖1397gpt4all442system-prompts-and-models-of-ai-tools331umami307full-stack-fast…

Linux網絡性能調優終極指南:深度解析與實踐

Linux網絡性能調優終極指南&#xff1a;深度解析與實踐 一、性能調優核心原理體系 1.1 數據包生命周期與性能瓶頸 #mermaid-svg-TsvnmiGx1WeTerK2 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-TsvnmiGx1WeTerK2 .…

串口超時參數深度解析:ReadTotalTimeoutMultiplier、ReadIntervalTimeout等

一、參數定義與作用 1.1 ReadIntervalTimeout&#xff08;字符間隔超時&#xff09; 定義&#xff1a;指定兩個連續字符到達之間的最大允許時間&#xff08;毫秒&#xff09;作用&#xff1a;當接收兩個字符的時間間隔超過該值時&#xff0c;ReadFile操作立即返回已緩沖的數據特…

ubuntu20.04下C++實現點云的多邊形區域過濾(2種實現:1、pcl的CropHull濾波器;2、CUDA上實現射線法)

在點云目標檢測中&#xff0c;經常會有一系列的誤識別&#xff0c;為了減小誤識別的概率&#xff0c;可以通過區域過濾來刪除不需要的點云&#xff0c;如下圖所示 本例中點云的場景為路口交通場景&#xff0c;已經把雷達坐標系的xoy面轉換至點云中的地平面&#xff0c;具體原理…

Java 大視界 -- Java 大數據在智能家居場景聯動與用戶行為模式挖掘中的應用(389)

Java 大視界 -- Java 大數據在智能家居場景聯動與用戶行為模式挖掘中的應用(389) 引言: 正文: 一、傳統智能家居的 “劇本困境”:按流程走,不管人需 1.1 設備與用戶的 “理解差” 1.1.1 場景聯動 “太機械” 1.1.2 行為識別 “太粗糙” 1.1.3 技術落地的 “體驗坑” 二、…

7 ABP Framework 支持的 UI 框架

ABP Framework 支持的 UI 框架 該頁面詳細介紹了 ABP Framework 支持的三種 UI 框架&#xff08;Angular、Blazor、MVC/Razor Pages&#xff09;&#xff0c;以及它們的架構、依賴、項目結構和共享基礎設施。 框架概述 ABP 提供三種獨立又可組合使用的 UI 框架&#xff0c;它們…

C++中的`if`語句多操作條件執行及順序保證技術指南

C中的if語句多操作條件執行及順序保證技術指南 1. 引言 在C編程中&#xff0c;if語句是控制程序流程的基本結構。隨著C17引入if語句的初始化部分&#xff0c;開發者獲得了在條件判斷前執行初始化操作的能力。然而&#xff0c;實際開發中常遇到更復雜的場景&#xff1a;?在條件…