PHP文件包含漏洞详解:从substr检查到伪协议绕过的完整指南

张开发
2026/4/10 19:50:08 15 分钟阅读

分享文章

PHP文件包含漏洞详解:从substr检查到伪协议绕过的完整指南
PHP文件包含漏洞攻防全解析从基础检查到高级绕过技术在Web安全领域PHP文件包含漏洞始终占据着高危漏洞榜单的前列。这种看似简单的功能缺陷往往能成为攻击者突破系统防线的致命武器。本文将带您深入理解文件包含漏洞的本质剖析常见的防御手段及其绕过方法最终构建起立体化的防护体系。1. 文件包含漏洞基础认知文件包含File Inclusion是PHP提供的一项强大功能开发者可以通过include、require等函数动态加载代码片段。这种机制本意是为了提高代码复用性但不当的实现方式会打开潘多拉魔盒。典型漏洞场景示例?php $page $_GET[page]; include($page . .php); ?当攻击者控制page参数时可能引发以下风险本地文件包含LFI读取服务器敏感文件远程文件包含RFI执行任意远程代码会话劫持篡改用户会话数据常见敏感文件路径文件类型典型路径示例系统密码/etc/passwd网站配置/var/www/html/config.php会话文件/tmp/sess_[session_id]日志文件/var/log/apache2/access.log注意实际路径可能因系统配置而异攻击者通常会尝试多种路径组合2. 常见防御手段及其局限性2.1 前缀检查与substr函数防御许多开发者会采用字符串检查作为第一道防线如使用substr函数验证文件前缀if(substr($_GET[file], 0, 3) php) { include($_GET[file]); }这种检查看似安全实则存在多个绕过点大小写混淆PHP在Windows系统上对文件名大小写不敏感路径截断利用空字符(%00)或超长路径(././././)编码混淆使用URL编码或双重编码绕过检查2.2 白名单验证的陷阱更谨慎的开发者会采用白名单机制$allowed [header.php, footer.php]; if(in_array($_GET[file], $allowed)) { include($_GET[file]); }但即使如此攻击者仍可能通过路径遍历fileallowed.php/../../etc/passwd空字节注入fileallowed.php%00协议混淆fileallowed.php?param恶意代码3. 伪协议的高级利用技术PHP内置的伪协议Wrapper本是为开发者提供便利却常被攻击者用于绕过防御。3.1 php://filter的妙用php://filter是最常用的伪协议之一其基本语法为php://filter/read过滤器链/resource目标文件典型攻击载荷?filephp://filter/readconvert.base64-encode/resourceconfig.php这种攻击方式能绕过文件后缀检查避免直接执行敏感文件获取经过编码的文件内容3.2 过滤器链组合攻击更复杂的攻击会组合多个过滤器?filephp://filter/readstring.rot13|convert.base64-encode/resourceflag.php常用过滤器对照表过滤器名称功能描述安全影响convert.base64-encodeBase64编码信息泄露string.rot13ROT13加密混淆检测zlib.deflate压缩数据绕过WAFconvert.iconv.*字符集转换编码混淆3.3 其他危险协议除filter外还需警惕data://- 直接包含任意代码?filedata://text/plain,?php system(id);?expect://- 执行系统命令需安装扩展?fileexpect://lsphar://- 利用压缩包特性执行代码4. 构建纵深防御体系单一防御手段难以应对复杂攻击需要多层次防护4.1 输入验证强化推荐做法使用basename()规范化文件名实施完整的路径白名单禁用危险字符../,://,%00$safe_dir /var/www/html/includes/; $file basename($_GET[file]); if(preg_match(/^[a-z0-9_-]\.php$/i, $file)) { include($safe_dir . $file); }4.2 服务器配置加固关键配置项# 禁用危险协议 php_admin_value allow_url_fopen Off php_admin_value allow_url_include Off # 限制open_basedir php_admin_value open_basedir /var/www/html:/tmp4.3 运行时防护安全函数封装示例function safe_include($path) { $real_base realpath(/var/www/html); $real_path realpath($path); if(strpos($real_path, $real_base) ! 0) { throw new Exception(Invalid file path); } if(!file_exists($real_path)) { throw new Exception(File not found); } include($real_path); }4.4 日志监控与异常检测建议记录以下信息包含文件路径包含操作来源文件哈希值变化监控规则示例SELECT * FROM access_log WHERE request_uri LIKE %php://% OR request_uri LIKE %../% OR request_uri LIKE %00%5. 实战案例分析CTF题目解析以典型CTF题目为例演示完整攻击链题目代码?php if(isset($_GET[file])) { if(substr($_GET[file], 0, 3) php) { include($_GET[file]); } else { die(Hacker!); } } else { highlight_file(__FILE__); } // flag in /flag ?攻击步骤识别substr检查限制构造伪协议绕过?filephp://filter/readconvert.base64-encode/resource/flag解码获取flag进阶技巧当直接读取失败时尝试路径遍历?filephp://filter/readconvert.base64-encode/resource./././flag组合多个过滤器混淆检测?filephp://filter/readstring.toupper|string.rot13/resource/flag在真实项目开发中我曾遇到一个有趣案例系统使用了看似严格的白名单检查但忽略了Windows下的路径特性。通过巧妙构造php:\...\config.php这样的路径注意反斜杠成功绕过了防御机制。这个经历让我深刻认识到安全防护必须考虑所有可能的边缘情况。

更多文章