php 7.1中timelib漏洞(cve-2017-11145)是堆越界写入漏洞,非稳定rce,仅导致崩溃或信息泄露;影响7.0.0–7.1.6,7.1.7+已修复,实际利用门槛高、不可控且依赖环境。

PHP 7.1 中 timelib 相关的时间戳漏洞,核心指向的是 CVE-2017-11145(也称 timelib memory corruption in strtotime()),该漏洞影响 PHP 7.0.0–7.1.6(含)及部分 7.2.0alpha 版本。它并非传统意义上的“远程代码执行(RCE)”漏洞,而是一个堆内存越界写入(heap-based buffer overflow),在特定条件下可导致进程崩溃、信息泄露,甚至潜在的任意代码执行——但实际利用门槛高、稳定性差,且高度依赖系统环境(如 ASLR、堆布局、glibc 版本等)。
下面直接讲清楚:它怎么触发、能不能实用化利用、为什么现在基本不提了。
? 漏洞本质:strtotime() 解析畸形时间字符串时越界写
timelib 是 PHP 内置的时间解析库(C 实现)。当调用 strtotime("xxx") 处理某些特殊构造的时区偏移或重复修饰符(如 +00000000000000000000)时,内部会因整数溢出导致缓冲区长度计算错误,最终向堆上写入超长数据。
典型触发 PoC:
<?php // PHP 7.1.6 及以下可能崩溃
var_dump(strtotime("2017-01-01 +00000000000000000000"));
?>
运行后常出现 Segmentation fault (core dumped) 或 zend_mm_heap corrupted 错误。
⚠️ 实际利用难点(为什么几乎没人真用)
这个漏洞不具备稳定 RCE 链,原因如下:
- 无可控写入内容:越界写入的是 timelib 自己生成的内部结构体字段(如 tz_abbr),不是攻击者可控的任意字节;
- 无地址泄漏原语:无法直接读取堆/栈地址,难以绕过 ASLR;
- 触发不稳定:取决于内存分配顺序、PHP 扩展加载状态、glibc malloc 行为,本地复现都常失败;
- PHP 官方未提供利用链:仅确认为“可能导致拒绝服务或潜在 RCE”,无 PoC 公开(除崩溃 PoC 外);
- 修复方式简单粗暴:PHP 7.1.7+ 已彻底修补边界检查逻辑,补丁仅几行代码。
✅ 真实渗透中,遇到 PHP 7.1.6 —— 优先测的是反序列化、SoapClient SSRF、XXE、ThinkPHP RCE 等更可靠路径,而不是押注这个 timelib 漏洞。
?️ 如何判断是否受影响 & 应对建议
-
快速检测:
php -v # 查看版本(7.1.0–7.1.6 危险) php -r 'echo strtotime("2000-01-01 +00000000000000000000");' # 若返回 false 或崩溃,极可能受影响 -
修复方案:
- 升级 PHP 至 7.1.7 或更高版本(官方已修复);
- 若无法升级,禁止用户输入直接进
strtotime(),做白名单校验(如只允许Y-m-d H:i:s格式); - 使用
DateTime::createFromFormat()替代(更安全、可设严格模式)。
-
开发侧加固示例:
$input = $_GET['time'] ?? ''; // 严格格式校验(不依赖 strtotime) $date = DateTime::createFromFormat('Y-m-d H:i:s', $input); if (!$date || $date->format('Y-m-d H:i:s') !== $input) { die('Invalid time format'); } $timestamp = $date->getTimestamp();
PHP 时间处理类漏洞(包括 timelib、DatePeriod、IntlCalendar 等)在 7.x 早期确实存在多个内存问题,但它们共同特点是:理论危险、实战鸡肋、修复成本低。真正值得投入精力的,永远是那些能稳定触发、可控性强、影响面广的漏洞类型——比如反序列化原生类链、XXE、模板注入或框架 RCE。
不复杂,但容易忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











