zzzphp V1.6.0 的代码执行漏洞,模版解析功能的问题
0 基础支撑功能
0.1 路由功能
0.2 模版解析
程序解析模版时,将模版中的部分内容匹配出来直接传递给了eval,且没有经过过滤
public function parserIfLabel($zcontent) { $pattern = ‘/\{if:([\s\S]+?)}([\s\S]*?){end\s+if}/‘; if (preg_match_all($pattern, $zcontent, $matches)) { $count = count($matches[0]); for ($i = 0; $i < $count; $i++) { $flag = ‘‘; $out_html = ‘‘; $ifstr = $matches[1][$i]; $ifstr = str_replace(‘<>‘, ‘!=‘, $ifstr); $ifstr = str_replace(‘mod‘, ‘%‘, $ifstr); $ifstr1 = cleft($ifstr, 0, 1); switch ($ifstr1) { case ‘=‘: $ifstr = ‘0‘ . $ifstr; break; case ‘{‘: case ‘[‘: $ifstr = "‘" . str_replace("=", "‘=", $ifstr); break; } $ifstr = str_replace(‘=‘, ‘==‘, $ifstr); $ifstr = str_replace(‘===‘, ‘==‘, $ifstr); @eval(‘if(‘ . $ifstr . ‘){$flag="if";}else{$flag="else";}‘); if (preg_match(‘/([\s\S]*)?\{else\}([\s\S]*)?/‘, $matches[2][$i], $matches2)) { // 判断是否存在else switch ($flag) { case ‘if‘: // 条件为真 if (isset($matches2[1])) { $out_html .= $matches2[1]; } break; case ‘else‘: // 条件为假 if (isset($matches2[2])) { $out_html .= $matches2[2]; } break; } } elseif ($flag == ‘if‘) { $out_html .= $matches[2][$i]; } // 无限极嵌套解析 $pattern2 = ‘/\{if([0-9]):/‘; if (preg_match($pattern2, $out_html, $matches3)) { $out_html = str_replace(‘{if‘ . $matches3[1], ‘{if‘, $out_html); $out_html = str_replace(‘{else‘ . $matches3[1] . ‘}‘, ‘{else}‘, $out_html); $out_html = str_replace(‘{end if‘ . $matches3[1] . ‘}‘, ‘{end if}‘, $out_html); $out_html = $this->parserIfLabel($out_html); } // 执行替换 $zcontent = str_replace($matches[0][$i], $out_html, $zcontent); } } return $zcontent; }
1 安装
2 关于我们
3 查看列表
4 查看内容
5 查看品牌列表
6 查看品牌内容
7 留言
8 搜索
9 前台验证机制
9.1 注册
9.2 登陆
9.3 找回密码
10 会员中心
11 后台登陆
12 后台首页
12.1 显示统计信息
12.2 显示系统状态和cms状态
12.3 安全提醒
12.4 显示天气
12.5 修改创始人资料
12.6 离开一会儿
12.7 安全退出
12.8 删除全部
12.9 标签管理
13 后台关于我们
14 后台新闻中心
15 后台产品中心
16 后台案例展示
17 后台品牌列表
18 后台联系我们
19 后台内容管理
20 后台栏目扩展
21 后台模版管理
22 后台静态缓存
23 后台文件管理
24 后台用户管理
25 后台插件管理
26 后台系统管理
原文地址:https://www.cnblogs.com/junmoxiao/p/11847027.html
时间: 2024-10-13 16:19:43