
1. 文件包含漏洞的本质与危害文件包含漏洞File Inclusion Vulnerability是Web安全领域最常见的高危漏洞之一尤其在PHP环境中更为突出。简单来说当开发者使用include、require等函数动态加载文件时如果未对用户输入进行严格过滤攻击者就能通过构造恶意参数控制文件加载路径进而实现任意代码执行。1.1 漏洞产生的根本原因PHP作为服务端脚本语言其强大的文件包含功能本是为了提高代码复用性。例如// 正常业务逻辑根据用户选择加载不同页面 $page $_GET[page]; include(/templates/ . $page . .php);问题出在开发者往往忽略两个关键点路径拼接未做限制未对用户输入的page参数进行目录穿越检查文件后缀未强制添加依赖手动拼接.php后缀而非白名单校验1.2 实际攻击场景演示假设存在漏洞的URL为http://example.com/index.php?pageuserprofile攻击者可以构造http://example.com/index.php?page../../etc/passwd%00注%00是空字符的URL编码用于截断后缀这将导致服务器返回系统的/etc/passwd文件内容。更危险的是如果网站允许文件上传如图片攻击者可以上传包含PHP代码的图片文件通过包含漏洞执行该文件完全控制服务器提示现代PHP版本已默认禁用%00截断但仍有其他绕过方式2. PHP伪协议的攻击利用PHP内置的伪协议Wrapper本是为方便开发者处理各类数据流但在文件包含漏洞中却成为攻击利器。以下是几种高危协议2.1 php://filter 协议该协议本用于数据流过滤却能被用来读取源码http://example.com/index.php?pagephp://filter/convert.base64-encode/resourceconfig.php这会将config.php文件内容以Base64编码形式输出避免直接包含执行。技术原理convert.base64-encode是过滤器链的一部分resource指定要操作的文件路径编码输出可绕过某些WAF的检测2.2 data:// 协议允许直接包含URL编码的数据http://example.com/index.php?pagedata://text/plain,?php phpinfo();?这将直接执行phpinfo()函数。防御要点PHP 5.2默认禁用该协议需设置allow_url_includeOn才生效2.3 expect:// 协议注该协议需要安装PECL扩展但一旦存在极其危险http://example.com/index.php?pageexpect://ls可直接执行系统命令。3. 漏洞防御的层级化方案3.1 代码层防护绝对路径白名单校验$allowed [home, profile, contact]; $page $_GET[page]; if(in_array($page, $allowed)) { include(__DIR__ . /templates/ . $page . .php); } else { die(Invalid page request); }动态包含的替代方案// 使用switch-case替代动态包含 switch($page) { case home: require home.php; break; // ...其他合法选项 default: header(HTTP/1.1 404 Not Found); }3.2 服务器配置加固修改php.iniallow_url_fopen Off allow_url_include Off设置open_basedir限制访问目录open_basedir /var/www/example.com/禁用危险函数disable_functions exec,passthru,shell_exec,system3.3 运维层防护定期更新PHP版本新版本修复了很多历史漏洞使用ModSecurity等WAF拦截包含攻击特征文件上传目录设置为不可执行4. 渗透测试中的实用技巧4.1 漏洞探测手法基础测试/index.php?page../../../../etc/passwd /index.php?pagephp://filter/resourceindex.php绕过技巧路径遍历绕过....//....//etc/passwd /var/www/././././etc/passwd协议混淆pHp://FilTer/convert.base64-encode/resourceindex.php日志污染攻击 如果包含.php文件时报错信息泄露真实路径可以通过User-Agent注入PHP代码包含访问日志文件如/var/log/apache2/access.log触发代码执行4.2 自动化工具使用使用Burp Suite测试抓取包含文件参数的请求使用Intruder模块加载常见payloadLFI测试字典包含各种路径遍历组合PHP伪协议payload根据响应长度/内容判断漏洞Kali Linux工具集# 使用ffuf进行模糊测试 ffuf -w LFI-wordlist.txt -u http://target/FUZZ # 使用LFISuite自动化利用 python lfi.py -u http://example.com/index.php?page -f /etc/passwd5. 真实案例分析某电商平台曾因文件包含漏洞导致数据泄露漏洞点// 订单导出功能 $report $_GET[report]; include(./reports/ . $report);攻击过程攻击者发现参数未过滤使用php://filter读取数据库配置文件获取数据库凭据后导出全部用户数据修复方案改用file_get_contentsjson_decode替代动态包含文件路径改为数据库存储的ID映射添加权限校验层6. 开发者自查清单为避免引入文件包含漏洞每次使用包含函数时应检查[ ] 是否使用用户输入直接拼接路径[ ] 是否限制文件后缀为特定类型如仅.php[ ] 是否设置open_basedir限制目录范围[ ] 是否禁用不必要的URL包装协议[ ] 是否对包含文件做权限校验[ ] 是否记录异常的包含请求对于历史遗留系统建议逐步替换包含机制用自动加载器如Composer替代手动包含使用模板引擎Twig/Smarty代替原生PHP包含关键配置文件改为环境变量存储