PHP文件包含漏洞成立的两个硬条件是:路径可控(用户输入直接或间接控制include等函数参数)和内容可控(攻击者能将恶意代码写入服务器可被包含的文件中);白名单映射、realpath校验、禁用allow_url_include及open_basedir限制是关键防御措施。

文件包含漏洞成立的两个硬条件
一个PHP文件包含漏洞要能被利用,必须同时满足两个条件:路径可控和内容可控。路径可控,指的是include、require等函数的参数来自用户输入(如$_GET、$_POST、$_COOKIE),且未经过严格校验;内容可控,是指攻击者能控制被包含文件的内容,比如通过日志投毒、会话文件写入、临时文件竞争、或上传带PHP代码的图片马等方式,把恶意内容“落盘”到服务器上。
白名单映射是唯一可靠的修复方式
过滤../、替换php、正则匹配后缀——这些黑名单手段在真实场景中基本无效。绕过方法太多:URL编码、大小写混用、双写、空字节截断、配合%00或%2e%2e%2f等。真正安全的做法是彻底解耦用户输入与文件路径。
- 把合法页面名固化为数组,例如
$pages = ['home', 'about', 'contact']; - 接收用户参数后,仅作
in_array()判断,不参与拼接 - 匹配成功才
include $page . '.php';,否则直接die('Invalid page'); - 所有页面文件统一放在
pages/子目录下,并通过realpath()校验是否落在该目录内
配置层与权限层必须同步加固
代码改了,环境也得跟上。光靠逻辑层防护不够,多一层限制就少一分风险。
- 在
php.ini中禁用远程包含:allow_url_include = Off - 限制脚本可访问范围:
open_basedir = /var/www/html/:/tmp/ - 禁用高危伪协议(如非必要):
disable_functions = phpinfo,system,exec,passthru,shell_exec,proc_open - 确保Web服务器对
config.php、.env等敏感文件有明确拒绝规则,不依赖PHP解析层拦截
代码审计时重点追踪的模式
做静态审计,不要满代码库搜include,效率低还容易漏。应该顺着数据流走:
- 先定位污点源:检查所有
$_GET、$_POST、$_REQUEST、$_COOKIE、$_SERVER['HTTP_XXX']的使用点 - 再找Sink函数:只盯
include、require、include_once、require_once四个函数 - 看中间是否经过任何“看似过滤实则可绕”的操作,比如
str_replace('../', '', $x)或basename($x)(后者对../../etc/passwd无效) - 特别注意
extract()、parse_str()、$$动态变量等间接引入用户输入的写法,它们可能把外部参数悄悄注入到包含路径变量中
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











