漏洞分析之——顺瓜摸藤
字数 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代码。

漏洞调用链

  1. 初始调用

    • parserIfLabel方法被parserCommom方法调用(位于同一文件的第23行)
    • parserCommom方法将$zcontent参数传递给parserIfLabel
  2. 调用路径

    • zzz_client.php文件中有4处调用了parserCommom方法
    • 其中最容易触发的路径是当$conf['iscache'] == 1时的条件分支
  3. 模板处理流程

    • zzz_client.php通过load_file方法加载模板文件
    • 默认加载template/pc/cn2016/html/index.html
    • 模板内容被处理后最终传递到eval执行

漏洞利用条件

  1. 拥有后台管理权限(可编辑模板)
  2. 系统缓存功能已启用($conf['iscache'] = 1

漏洞利用步骤

1. 启用缓存功能

  1. 登录后台管理系统
  2. 进入系统设置,开启缓存功能
    • 这将修改zzz_config.php中的iscache值为1

2. 编辑模板插入Payload

  1. 进入后台的模板编辑功能
  2. 编辑index.html文件
  3. 插入恶意模板代码:
    {if:phpinfo()}yes{end if}
    
    这段代码经过解析后,$ifstr变量将被赋值为phpinfo(),最终在eval中执行

3. 触发漏洞

  1. 访问网站首页(加载index.html模板)
  2. 系统将执行插入的PHP代码(如phpinfo()

注意事项

  • 该利用链只能执行一次,因为:
    1. 第一次执行后会创建缓存文件(cachefile)
    2. 后续请求会检测到缓存文件存在且比模板文件新,不再重新解析模板
  • 要再次执行,需要删除缓存文件或修改模板文件时间戳

漏洞修复建议

  1. 对模板输入进行严格过滤,特别是if标签中的内容
  2. 避免在模板解析过程中使用eval函数
  3. 对模板编辑功能增加权限控制
  4. 及时更新到修复版本

技术总结

该漏洞展示了典型的"顺瓜摸藤"分析方法:

  1. 从漏洞描述定位到关键触发点(eval)
  2. 逆向追踪调用链(parserIfLabelparserCommomzzz_client.php)
  3. 分析利用条件(后台权限+缓存开启)
  4. 构造利用链(模板编辑→模板解析→代码执行)
  5. 发现利用限制(一次性执行)

这种分析方法适用于大多数需要从触发点逆向追踪利用路径的漏洞研究场景。

ZZZPHP CMS 1.6.1 远程代码执行漏洞分析与利用 漏洞概述 ZZZPHP CMS 1.6.1版本存在一个远程代码执行漏洞(CVE-2019-9041),该漏洞属于服务器端模板注入(SSTI)类型,允许攻击者在拥有后台权限的情况下通过模板编辑功能执行任意PHP代码。 漏洞分析 漏洞触发点 漏洞的核心触发点位于 inc/zzz_template.php 文件中的 parserIfLabel 方法: 该方法中存在一个 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 文件 插入恶意模板代码: 这段代码经过解析后, $ifstr 变量将被赋值为 phpinfo() ,最终在 eval 中执行 3. 触发漏洞 访问网站首页(加载 index.html 模板) 系统将执行插入的PHP代码(如 phpinfo() ) 注意事项 该利用链只能执行一次,因为: 第一次执行后会创建缓存文件( cachefile ) 后续请求会检测到缓存文件存在且比模板文件新,不再重新解析模板 要再次执行,需要删除缓存文件或修改模板文件时间戳 漏洞修复建议 对模板输入进行严格过滤,特别是 if 标签中的内容 避免在模板解析过程中使用 eval 函数 对模板编辑功能增加权限控制 及时更新到修复版本 技术总结 该漏洞展示了典型的"顺瓜摸藤"分析方法: 从漏洞描述定位到关键触发点( eval ) 逆向追踪调用链( parserIfLabel ← parserCommom ← zzz_client.php ) 分析利用条件(后台权限+缓存开启) 构造利用链(模板编辑→模板解析→代码执行) 发现利用限制(一次性执行) 这种分析方法适用于大多数需要从触发点逆向追踪利用路径的漏洞研究场景。