PHP文件包含漏洞本身不是终点,而是权限提升的关键跳板;它通过读取敏感文件、结合伪协议或配合日志注入、Session文件、临时文件等,可快速演变为远程代码执行甚至服务器控制。

PHP文件包含漏洞不是终点,而是权限提升的关键跳板。它本身不直接执行命令,但通过读取敏感文件、结合伪协议或配合其他缺陷,能快速演变为远程代码执行(RCE)甚至服务器控制。
识别真正的包含入口点
不能只盯着include($_GET['page'])这种显眼写法。要重点排查:
- 所有使用
include、require、include_once、require_once的调用位置,尤其参数来自$_GET、$_POST、$_REQUEST、$_COOKIE或数据库查询结果 - 间接可控场景:比如从数据库读模板名、从配置文件取路径、通过session变量拼接文件名
- 框架路由逻辑:如UEditor的
controller.php中直接include("action_{$action}.php"),未校验$action是否在白名单内
验证LFI能否导向RCE
读到/etc/passwd只是第一步。真正危险的是能否触发代码执行。常见路径有:
-
日志文件包含:向访问日志(如
/var/log/apache2/access.log)注入PHP代码,再包含该日志文件 -
Session文件包含:若
session.save_path可预测且未隔离,将恶意内容写入sess_*文件后包含 -
PHP伪协议利用:尝试
php://filter/read=convert.base64-encode/resource=xxx.php读源码,或data://text/plain,<?php phpinfo();?>直接执行(需allow_url_include=On) -
临时文件竞争:上传文件时,
/tmp/phpXXXXXX可能被短暂包含,配合条件竞争触发执行
绕过常见过滤手段
开发者常加简单过滤,但往往不彻底。典型绕过方式包括:
- 路径遍历仍有效:用
....//....//etc/passwd或%2e%2e%2f绕过单层../过滤 - 截断技巧:在支持的环境下用
%00、?、#截断后续扩展名,如../../../etc/passwd%00 - 大小写混淆:
INCLUDe或ReQuIrE可能绕过简单关键字黑名单 - 双写/编码嵌套:
%252e%252e%252f(即URL二次编码)可穿透一层解码逻辑
权限提升后的关键动作
一旦获得RCE,下一步不是停在phpinfo(),而是快速巩固控制权:
- 确认当前Web用户权限(
whoami、id),判断能否写入/var/www或/tmp - 尝试加载系统函数:
system、passthru、shell_exec是否可用,禁用情况查disable_functions - 写入Webshell到可访问目录,优先选
.php后缀且无内容检测的位置(如日志、缓存、上传目录) - 检查
/proc/self/environ或/proc/self/cmdline,寻找环境变量注入或进程参数利用机会
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











