PHP文件包含与上传漏洞联动是RCE典型路径:先上传Webshell,再通过包含漏洞执行。防御需三环节协同——上传阶段禁PHP解析、重命名+内容校验;包含阶段禁用户输入拼接、用白名单映射;环境层关危险配置、监控异常行为、物理隔离上传目录。

PHP文件包含漏洞与文件上传漏洞联动,是攻击者实现远程代码执行(RCE)最典型的组合路径之一:先通过文件上传功能上传恶意PHP文件(如Webshell),再利用文件包含漏洞将其加载执行。这种“上传+包含”双阶段攻击隐蔽性强、成功率高,且在真实攻防场景中极为常见。防御必须打破单点思维,从输入控制、存储隔离、执行阻断三个环节协同设防。
上传阶段:严控可执行内容落地
文件上传本身不危险,危险的是上传后能被直接解析或包含。关键不是“能不能传”,而是“传了能不能运行”。
-
禁止上传目录被Web服务器解析为PHP:将上传目录(如
uploads/)配置为仅允许静态资源(.jpg、.pdf等),在Nginx/Apache中禁用该目录下的PHP执行权限。例如Nginx中添加:location ~ ^/uploads/.*\.php$ { return 403; } -
重命名+剥离扩展名逻辑:不依赖客户端提交的原始文件名和后缀。使用
uniqid() + hash生成随机文件名,强制指定安全后缀(如.jpg),并删除所有可能触发PHP解析的别名(.php3、.phtml、.phar等) -
服务端MIME类型+内容检测双校验:仅检查
$_FILES['file']['type']不可信(易伪造)。应结合finfo_file()读取实际文件头,对图片类文件进一步用getimagesize()验证是否真为图像
包含阶段:切断动态路径执行链
即使恶意文件已上传成功,只要包含逻辑不接受任意路径,攻击就无法闭环。核心是让include等函数永远不接触用户输入拼接的字符串。
-
绝对禁用用户输入参与文件路径拼接:删除所有类似
include($_GET['page'] . '.php')或require('uploads/' . $_POST['filename'])的写法。这是最根本的防线 -
白名单映射代替字符串拼接:若需根据参数加载不同模板,用关联数组映射:
$pages = ['home' => '/var/www/tpl/home.php', 'about' => '/var/www/tpl/about.php']; if (isset($pages[$_GET['p']])) { include($pages[$_GET['p']]); } -
启用
open_basedir并限定到应用根目录:在php.ini中设置open_basedir = /var/www/html/:/tmp/,使所有文件操作(包括include和fopen)无法跳出指定范围,上传目录若不在其中,即无法被包含
环境与监控:堵死协议与异常行为
攻击者常借助伪协议(php://input、data://)或日志投毒绕过上传限制,需从PHP配置和运行时行为两层加固。
-
关闭高危PHP配置:确保
allow_url_include = Off(禁用远程包含)、allow_url_fopen = Off(限制远程资源访问)、disable_functions = system,exec,passthru,shell_exec,proc_open(限制命令执行) -
监控异常包含行为:在关键包含逻辑前插入日志记录,例如:
error_log("LFI attempt: " . $_GET['file'], 4);;配合WAF规则拦截含../、%00、php://、data://等特征的请求参数 -
分离上传与执行环境:生产环境中,上传目录应置于Web根目录之外(如
/data/uploads/),并通过符号链接或反向代理提供只读静态访问,彻底物理隔离可执行路径
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











