漏洞分析之——顺瓜摸藤
字数 1225 2025-08-29 08:31:53
ZZZPHP CMS 1.6.1 远程代码执行漏洞分析与利用
漏洞概述
ZZZPHP CMS 1.6.1版本存在一个远程代码执行漏洞(CVE-2019-9041),该漏洞属于服务器端模板注入(SSTI)类型,允许攻击者在拥有后台权限的情况下通过模板编辑功能执行任意PHP代码。
漏洞分析
漏洞触发点
漏洞的核心触发点位于inc/zzz_template.php文件中的parserIfLabel方法:
eval('if(' . $ifstr . '){$flag="' . $flag . '";}');
该方法中存在一个eval函数调用,能够执行动态生成的PHP代码。
漏洞调用链
-
初始调用:
parserIfLabel方法被parserCommom方法调用(位于同一文件的第23行)parserCommom方法将$zcontent参数传递给parserIfLabel
-
调用路径:
zzz_client.php文件中有4处调用了parserCommom方法- 其中最容易触发的路径是当
$conf['iscache'] == 1时的条件分支
-
模板处理流程:
zzz_client.php通过load_file方法加载模板文件- 默认加载
template/pc/cn2016/html/index.html - 模板内容被处理后最终传递到
eval执行
漏洞利用条件
- 拥有后台管理权限(可编辑模板)
- 系统缓存功能已启用(
$conf['iscache'] = 1)
漏洞利用步骤
1. 启用缓存功能
- 登录后台管理系统
- 进入系统设置,开启缓存功能
- 这将修改
zzz_config.php中的iscache值为1
- 这将修改
2. 编辑模板插入Payload
- 进入后台的模板编辑功能
- 编辑
index.html文件 - 插入恶意模板代码:
这段代码经过解析后,{if:phpinfo()}yes{end if}$ifstr变量将被赋值为phpinfo(),最终在eval中执行
3. 触发漏洞
- 访问网站首页(加载
index.html模板) - 系统将执行插入的PHP代码(如
phpinfo())
注意事项
- 该利用链只能执行一次,因为:
- 第一次执行后会创建缓存文件(
cachefile) - 后续请求会检测到缓存文件存在且比模板文件新,不再重新解析模板
- 第一次执行后会创建缓存文件(
- 要再次执行,需要删除缓存文件或修改模板文件时间戳
漏洞修复建议
- 对模板输入进行严格过滤,特别是
if标签中的内容 - 避免在模板解析过程中使用
eval函数 - 对模板编辑功能增加权限控制
- 及时更新到修复版本
技术总结
该漏洞展示了典型的"顺瓜摸藤"分析方法:
- 从漏洞描述定位到关键触发点(
eval) - 逆向追踪调用链(
parserIfLabel←parserCommom←zzz_client.php) - 分析利用条件(后台权限+缓存开启)
- 构造利用链(模板编辑→模板解析→代码执行)
- 发现利用限制(一次性执行)
这种分析方法适用于大多数需要从触发点逆向追踪利用路径的漏洞研究场景。