Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

订阅源联系隐私© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2026-79387-PbootCMS-SQL-Injection — CVE-2026-79387 的概念验证,PbootCMS 用户管理中的认证 SQL 注入,允许任意字段更新和账户接管。 | Kitploit
工具/GitHubGitHub/jhli07/cve-2026-79387-pbootcms-sql-injection
漏洞分析漏洞利用Web应用程序漏洞利用Web安全渗透测试
GitHubjhli07/cve-2026-79387-pbootcms-sql-injection

CVE-2026-79387-PbootCMS-SQL-Injection

CVE-2026-79387 的概念验证,PbootCMS 用户管理中的认证 SQL 注入,允许任意字段更新和账户接管。

查看仓库

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
471个月前尚未审核
分享

CVE-2026-79387:PbootCMS V3.2.5 用户管理模块中的 SQL 注入

概述

字段详情
CVE IDCVE-2026-79387
产品PbootCMS
受影响版本3.2.0 – 3.2.5,以及可能更早的版本
漏洞类型SQL 注入(CWE-89)
攻击向量远程(需认证)
CVSS 严重性高
发现者JiahaoLi
厂商https://www.pbootcms.com/

漏洞描述

PbootCMS V3.2.5 的用户管理模块中存在一个 SQL 注入漏洞。该漏洞位于 /apps/admin/controller/system/UserController.php 的 mod() 方法(第 149 行)以及 /apps/admin/model/system/UserModel.php 的 modUser() 方法中。

field 参数完全由用户通过 GET 请求控制,且没有任何白名单校验。value 参数同样由用户控制,并被直接拼接进 SQL UPDATE 语句。经过身份认证的攻击者可以将任意数据库列指定为 field(例如 password、username、status、role),从而实现任意数据篡改。

根本原因

// UserController.php - mod() method
if (($field = get('field', 'var')) && ! is_null($value = get('value', 'var'))) {
    if ($this->model->modUser($ucode, "$field='$value',update_user='" . session('username') . "'")) {
        location(- 1);
    }
}

$field 和 $value 直接取自 $_GET 超全局变量,并被拼接进 SQL 字符串,没有任何净化处理、没有白名单、也没有参数化查询。随后该字符串被传入 UserModel::modUser(),再由其转发给基类 Model::update() 方法。由于该参数是字符串(而非数组),它绕过了 checkKey() 的字段名校验,并被原样嵌入到 SET 子句中:

UPDATE ay_user SET <user-controlled>= '<user-controlled>', update_user='admin' WHERE ucode='<ucode>'

调用链

GET /admin.php?p=/User/mod&ucode=10002&field=password&value=<MD5>
  → UserController::mod()
    → UserModel::modUser($ucode, "password='<value>',update_user='admin'")
      → Model::table('ay_user')->where("ucode='$ucode'")->update($data_string)
        → SQL: UPDATE ay_user SET password='<value>',update_user='admin' WHERE ucode='10002'

影响

已认证的攻击者可以:

  1. 修改任意用户的密码 — 包括超级管理员(内置创始人 ucode=10001 除外)。
  2. 更改账户状态 — 启用或禁用任意账户。
  3. 注入更深层的 SQL — value 参数允许单引号逃逸,可能实现堆叠查询或基于重言式的攻击。

这会导致账户接管以及对 CMS 后台的完全控制。

复现步骤

前置条件

  • 本地安装 PbootCMS V3.2.5(在 192.168.1.104、Apache/PHP 7.2.1/SQLite 环境下测试)
  • 一个有效的后台管理员账户

步骤 1:登录管理面板

访问 PbootCMS 管理后台,使用默认的 admin 账户登录。

管理后台

步骤 2:创建目标用户

导航至 系统管理 → 用户管理 → 添加用户。创建一个新用户:

  • 用户名:admin2
  • 密码:admin
  • 角色:系统管理员

创建用户

步骤 3:验证用户存在

用户列表确认 admin2 的 ucode=10002:

用户列表

步骤 4:确认初始密码

打开一个新的浏览器窗口。尝试以 admin2 和密码 123456 登录 — 这会失败,因为实际密码是 admin:

登录失败

步骤 5:构造并执行载荷

使用已登录的管理员浏览器,导航至:

http://192.168.1.104/PbootCMS/admin.php?p=/User/mod&ucode=10002&field=password&value=14e1b600b1fd579f47433b88e8d85291

14e1b600b1fd579f47433b88e8d85291 是 123456 的 MD5 哈希值。

mod() 方法执行注入并通过 location(-1) 进行重定向:

Payload 已执行 - 未找到

步骤 6:验证密码修改

现在尝试使用 admin2 / 123456 登录:

登录成功

密码已通过 SQL 注入成功修改。 该用户现已使用新密码登录,确认了完整的账户接管。

源代码分析

存在漏洞的代码(UserController.php,约第 149 行)

源代码

数据库层(Model.php - update 方法)

当 update() 接收到字符串参数时,该参数会被原样用于 SET 子句中,且未进行任何转义:

final public function update($data = null)
{
    if (is_array($data)) {
        // Array path: checkKey() validates field names
        ...
    } else {
        // String path: NO VALIDATION AT ALL
        $update_string = $data;
    }
    $this->sql['value'] = $update_string;
    $sql = $this->buildSql($this->updateSql);
    return $this->getDb()->amd($sql);  // Direct execution, no prepared statement
}

修复建议

  1. 对 field 参数进行白名单校验——仅允许已知的列名(status、username、realname、password)。
  2. 参数化查询——使用预编译语句代替字符串拼接。
  3. 转义用户输入——至少应对 $value 进行净化处理,以防止引号逃逸。
  4. 强制密码哈希——如果 field 为 password,在存储前对值应用 encrypt_string()。
  5. 限制独立修改路径——mod() 中的“单字段修改”分支应要求有效的 CSRF 令牌和角色级授权检查。

参考资料

  • PbootCMS 官方网站
  • Gitee 上的 PbootCMS 源码
  • CVE-2026-79387

披露声明:此漏洞已负责任地披露给厂商。如果您正在运行受影响的版本,请立即更新并审计所有后台账户。

下载工具