<?php
$page = $_GET['page'];
include($page . 'php');
?>
攻擊者可通過目錄遍歷序列 ../ 突破預期目錄,讀取敏感系統文件:
https://example.com/index.php?page=../etc/passwdhttps://example.com/index.php?page=../../../etc/passwdhttps://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 密鑰等 |
../ 解析為父目錄.php 後綴可被 %00(空字節,PHP < 5.3.4)或路徑截斷繞過<?php
$allowedPages = ['home', 'about', 'contact', 'products'];
$page = $_GET['page'] ?? 'home';
if (!in_array($page, $allowedPages, true)) {
$page = 'home'; // 或拋出 404
}
include __DIR__ . "/pages/{$page}.php";
<?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');
}
在 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 只能訪問指定目錄樹<?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(如業務允許)
?page=../../var/log/apache2/access.log防範:日誌目錄排除在 open_basedir 外、禁用日誌中的 PHP 標籤解析
include.*\$\_(GET|POST|REQUEST|COOKIE) 模式realpath() + strpos() 確保路徑在允許目錄內open_basedir 限制文件系統訪問範圍allow_url_include = Off、allow_url_fopen = Off../、php:// 等惡意載荷文件包含漏洞看似簡單,實則是通往服務器完全控制權的關鍵入口。採用「纵深防禦」策略:代碼層驗證、配置層限制、運行時監控三位一體,方能有效化解風險。