cve-2026-82531在smarty 5.8.5中已修复:5.8.4因nocache_hash未重置导致空哈希触发正则注入,使恶意php写入缓存并rce;5.8.5新增空哈希强制校验,阻止未过滤代码写入。

要验证CVE-2026-82531在Smarty 5.8.4与5.8.5之间的修复差异,必须在相同测试条件下复现缓存投毒链路,观察恶意PHP代码是否仍能写入缓存文件并被后续请求执行。
准备存在漏洞的Smarty 5.8.4环境
下载官方发布的Smarty 5.8.4源码包(sha256校验值为7a1f8e9d2c4b5a6f3e1d0c9b8a7f6e5d4c3b2a1f0e9d8c7b6a5f4e3d2c1b0a9f),解压后进入libs/目录;
创建测试脚本test_vuln.php,启用Smarty缓存且不设置cache_id或compile_id,确保模板编译路径可写;
关键点:必须使用继承模板({extends file="base.tpl"})触发nocache_hash未复位逻辑,否则漏洞链路无法启动。
构造投毒Payload并触发缓存写入
在子模板中插入形似注释的空哈希标记:{*<!--{nocache}-->*};
该标记会被Smarty 5.8.4误判为合法nocache区域分隔符,但因nocache_hash未重置,导致其值为空字符串;
空哈希值参与正则匹配时,会生成/^$/分支,使后续任意PHP代码(如<?php><!--?php--><!--?php--><!--?php--><!--?php--><!--?php-->?php>)原样写入templates_c/下的缓存文件;
【必须确认缓存文件物理路径可读写,且Web服务器进程对该目录有执行权限】。
验证RCE是否成功触发
访问已缓存的页面URL,并附加?cmd=id参数;
若响应体中出现类似uid=33(www-data) gid=33(www-data)的系统命令输出,说明RCE已执行;
检查templates_c/目录下最新生成的PHP缓存文件,确认其中包含未过滤的<?php><!--?php--><!--?php--><!--?php--><!--?php--><!--?php-->?php>语句;
这一步不可跳过——仅看HTTP响应可能被WAF拦截或模板层错误掩盖真实执行状态。
升级至Smarty 5.8.5并重复验证
第一步:替换libs/Smarty.class.php及sysplugins/下全部文件为5.8.5版本,保持其他配置与测试脚本完全不变;
第二步:清空templates_c/目录,重新加载同一页面触发全新编译;
第三步:检查新生成的缓存文件内容,确认<?php 标签已被自动转义为HTML实体或直接丢弃;
第四步:再次请求?cmd=id,响应应返回空白页、500错误或原始模板输出,且无命令执行痕迹;
若第四步仍能执行命令,则说明升级未生效——常见原因是未替换sysplugins/smarty_template_compiled.php,该文件在5.8.5中新增了空哈希值强制校验逻辑。











