首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 本地文件包含漏洞原理與防範實戰指南

     編輯:PHP 綜合知識

漏洞代碼示例(僅供教學分析)

<?php
$page = $_GET['page'];
include($page . 'php');
?>

攻擊向量分析

攻擊者可通過目錄遍歷序列 ../ 突破預期目錄,讀取敏感系統文件:

  • https://example.com/index.php?page=../etc/passwd
  • https://example.com/index.php?page=../../../etc/passwd
  • https://example.com/index.php?page=..../../etc/passwd(雙重編碼繞過簡易過濾)

常見敏感文件目標

文件路徑敏感信息類型
/etc/passwd用戶帳號信息
/etc/shadow密碼哈希(需 root 權限讀取)
/etc/group用戶組配置
/etc/hosts主機名解析映射
/proc/self/environ進程環境變量(可構造 RCE)
/var/log/apache2/access.log訪問日誌(可注入 PHP 代碼)
應用配置文件數據庫憑證、API 密鑰等

漏洞成因深度剖析

  1. 輸入未驗證:直接將用戶輸入拼接進文件路徑
  2. 路徑解析特性:文件系統將 ../ 解析為父目錄
  3. 副檔名固化失效:.php 後綴可被 %00(空字節,PHP < 5.3.4)或路徑截斷繞過
  4. 權限過大:Web 進程以高權限運行,可讀取系統關鍵文件

防範最佳實踐

1. 白名單驗證(最推薦)

<?php
$allowedPages = ['home', 'about', 'contact', 'products'];
$page = $_GET['page'] ?? 'home';

if (!in_array($page, $allowedPages, true)) {
    $page = 'home'; // 或拋出 404
}

include __DIR__ . "/pages/{$page}.php";

2. 路徑規範化與目錄限制

<?php
$page = basename($_GET['page'] ?? ''); // 僅保留文件名
$page = preg_replace('/[^a-zA-Z0-9_-]/', '', $page); // 嚴格字符集

$baseDir = __DIR__ . '/pages/';
$targetPath = realpath($baseDir . $page . '.php');

// 關鍵:確保目標路徑在基礎目錄內
if ($targetPath && strpos($targetPath, realpath($baseDir)) === 0) {
    include $targetPath;
} else {
    http_response_code(404);
    exit('Page not found');
}

3. 禁用危險函數與 open_basedir

在 php.ini 中配置:

disable_functions = exec,system,passthru,shell_exec,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
open_basedir = /var/www/html:/tmp:/var/tmp
  • open_basedir 限制 PHP 只能訪問指定目錄樹
  • 即使發生包含漏洞,也無法突破目錄邊界

4. 使用自動加載器替代動態包含

<?php
// Composer PSR-4 自動加載
require __DIR__ . '/vendor/autoload.php';

use App\Controllers\PageController;

$page = $_GET['page'] ?? 'home';
$controller = new PageController();
$controller->render($page); // 內部路由分發,無文件包含風險

進階攻擊場景與應對

協議包裹器濫用

PHP 支持 php://filter、data://、phar:// 等協議:

  • php://filter/convert.base64-encode/resource=config.php:讀取源碼而非執行
  • data://text/plain,:直接執行代碼(需 allow_url_include=On)
  • phar:///var/www/uploads/shell.jpg/test.php:PHAR 反序列化鏈

防範:allow_url_include = Off、allow_url_fopen = Off(如業務允許)

日誌注入獲取 RCE

  1. 攻擊者發送含 PHP 代碼的 User-Agent:
  2. 代碼寫入 Apache/Nginx 訪問日誌
  3. 通過 LFI 包含日誌文件:?page=../../var/log/apache2/access.log
  4. 代碼在包含上下文中執行

防範:日誌目錄排除在 open_basedir 外、禁用日誌中的 PHP 標籤解析

安全檢測工具推薦

  • RIPS:靜態分析 PHP 代碼漏洞
  • PHPStan / Psalm:靜態分析器,可檢測包含變量污染
  • OWASP ZAP:動態掃描 LFI/RFI
  • 自定義規則:grep 搜尋 include.*\$\_(GET|POST|REQUEST|COOKIE) 模式

總結檢查清單

  • [ ] 所有文件包含參數採用白名單驗證
  • [ ] 使用 realpath() + strpos() 確保路徑在允許目錄內
  • [ ] 配置 open_basedir 限制文件系統訪問範圍
  • [ ] 設置 allow_url_include = Off、allow_url_fopen = Off
  • [ ] 禁用不必要的危險函數
  • [ ] Web 進程以最低權限用戶運行(非 root/www-data)
  • [ ] 部署 WAF 規則攔截 ../、php:// 等惡意載荷
  • [ ] 定期進行代碼審計與滲透測試

文件包含漏洞看似簡單,實則是通往服務器完全控制權的關鍵入口。採用「纵深防禦」策略:代碼層驗證、配置層限制、運行時監控三位一體,方能有效化解風險。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved