针对 CVE-2026-82531 的 Python 3 PoC —— smarty-php/smarty —— 通过在 extends 中伪造 SmartyNocache 标记并结合 模板缓存 重新生成,实现 代码注入(CWE-94) → 在缓存 include() 时触发 RCE。
| 字段 | 值 |
|---|---|
| CVE | CVE-2026-82531 |
| 产品 | Smarty PHP 模板引擎 |
| 受影响版本 | < 4.5.8;5.0.0 – 5.8.4 |
| 修复版本 | 4.5.8、5.8.5 |
| CWE | CWE-94 — 代码生成控制不当 |
| CVSS 4.0 | 9.2 严重(CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N) |
| CVSS 3.1 | 8.1 高危 |
| PoCbit 目录 | https://pocbit.org/pocs/ |
| PoCbit 页面 | https://pocbit.org/pocs/cve-2026-82531 |
| 验证标记 | POCBIT-82531-OK(HTTP 响应体中的 base64 命令输出) |
| 安全公告 | GHSA-3w63-v7pm-cq9x |
利用重点: poc.py exploit 依次执行预热 → 清除缓存 → 投毒(POST name=)→ 触发;check、payload、Docker lab/(Smarty 5.8.4)。输出文件:hits.txt、exploited.txt。
Smarty 将模板编译为 PHP,并可能写入 缓存 输出。当模板使用 extends: / 块继承 时,在新的 PHP worker 从磁盘加载已编译文件后,顶层编译函数可能使 nocache_hash 保持未设置。
在缓存重新生成期间,Smarty_Internal_Runtime_UpdateCache 会构建一个用于拆分“nocache”区域的正则表达式。null 哈希会产生一个 空的正则分支,因此攻击者可控的 assign() 数据 可以伪造:
/*%%SmartyNocache:%%*/ <?php ... ?> /*/%%SmartyNocache:%%*/
该代码块会被逐字复制到生成的缓存 PHP 文件中(跳过常规的 PHP 标签中和处理)。下一个包含该缓存文件的请求会执行注入的 PHP → 远程代码执行。
exploit 子命令)| 阶段 | 操作 |
|---|---|
| 1 预热 | 无害的 name=world → 编译 + 初始缓存 |
| 2 清除 | 仅删除缓存文件(已编译模板保留)——实验环境暴露 ?lab_clear_cache=1 |
| 3 投毒 | name=<伪造的 SmartyNocache + PHP shell_exec> → 写入被投毒的缓存 |
| 4 触发 | 无害的 name=benign → include() 执行注入的 PHP;响应体包含 POCBIT-82531-OK:<base64> |
真实目标需要:启用缓存、extends 模板、用户可控的 assign、在编译目录已填充时发生缓存未命中(TTL、重启或管理员刷新)。
在使用 Smarty extends: / 继承 + 缓存 的应用中,当 nocache_hash 为 null 时,攻击者通过 assign 赋值 的伪造 SmartyNocache 块会以 原始 PHP 形式写入缓存 PHP 文件;在后续请求中经 include 引入 → RCE。PoCbit 包:Docker 实验环境 + exploit 完整利用链。
cd CVE-2026-82531
pip install -r requirements.txt
docker compose up --build -d
python poc.py check http://127.0.0.1:8088
python poc.py exploit --url http://127.0.0.1:8088 -c "id"
python poc.py exploit -i targets.example.txt -w 10 -c id
python poc.py payload -c "id"
修补后:删除/重新生成所有模板缓存文件。
仅限经授权的安全研究,以及您拥有或已获授权测试的系统。
NocacheHashInjectionTest.php(Smarty 5.8.5)CVE-2026-82531 — Smarty <4.5.8 / 5.x<5.8.5 cache-poisoning RCE (CWE-94, CVSS 4.0 9.2 AT:P). PoCbit PoC: extends+inheritance null nocache_hash → forged SmartyNocache marker in assign() → PHP in cache include. check/exploit/payload, Docker lab 5.8.4, hits.txt & exploited.txt. Fix 4.5.8 / 5.8.5. Marker POCBIT-82531-OK. https://pocbit.org/pocs/cve-2026-82531