Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

ЛентыКонтактыКонфиденциальность© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2026-79387-PbootCMS-SQL-Injection — Доказательство концепции для CVE-2026-79387 — аутентифицированная SQL-инъекция в управлении пользователями PbootCMS, позволяющая произвольное обновление полей и захват учётной записи. | Kitploit
Инструменты/GitHubGitHub/jhli07/cve-2026-79387-pbootcms-sql-injection
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийВеб-безопасностьТестирование на Проникновение
GitHubjhli07/cve-2026-79387-pbootcms-sql-injection

CVE-2026-79387-PbootCMS-SQL-Injection

Доказательство концепции для CVE-2026-79387 — аутентифицированная SQL-инъекция в управлении пользователями PbootCMS, позволяющая произвольное обновление полей и захват учётной записи.

Репозиторий
471 месяц назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2026-79387: SQL-инъекция в модуле управления пользователями PbootCMS V3.2.5

Обзор

ПолеДетали
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-инъекции. Уязвимость находится в методе mod() файла /apps/admin/controller/system/UserController.php (строка 149) и в методе modUser() файла /apps/admin/model/system/UserModel.php.

Параметр 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 допускает экранирование одинарной кавычкой, что потенциально позволяет атаки типа stacked или на основе тавтологии.

Это приводит к захвату учётной записи и полному контролю над бэкендом CMS.

Шаги воспроизведения

Предварительные условия

  • PbootCMS V3.2.5, установленная локально (протестировано на 192.168.1.104, Apache/PHP 7.2.1/SQLite)
  • Действительная учётная запись администратора бэкенда

Шаг 1: Вход в панель администратора

Откройте панель управления PbootCMS и войдите с учётной записью admin по умолчанию.

Admin Dashboard

Шаг 2: Создание целевого пользователя

Перейдите в System Management → User Management → Add User. Создайте нового пользователя:

  • Имя пользователя: admin2
  • Пароль: admin
  • Роль: System Administrator

Create User

Шаг 3: Проверка существования пользователя

Список пользователей подтверждает наличие admin2 с ucode=10002:

User List

Шаг 4: Проверка исходного пароля

Откройте новое окно браузера. Попробуйте войти как admin2 с паролем 123456 — это не удаётся, поскольку фактический пароль — admin:

Login Failed

Шаг 5: Формирование и выполнение полезной нагрузки

Используя уже авторизованный браузер администратора, перейдите по адресу:

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

14e1b600b1fd579f47433b88e8d85291 — это MD5-хеш от 123456.

Метод mod() выполняет инъекцию и перенаправляет через location(-1):

Payload Executed - Not Found

Шаг 6: Проверка смены пароля

Теперь попробуйте войти с admin2 / 123456:

Login Success

Пароль был успешно изменён через SQL-инъекцию. Пользователь теперь вошёл с новым паролем, что подтверждает полный захват учётной записи.

Анализ исходного кода

Уязвимый код (UserController.php, строка ~149)

Source Code

Слой базы данных (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
  • Исходный код PbootCMS на Gitee
  • CVE-2026-79387

Раскрытие: об этой уязвимости было ответственно сообщено производителю. Если вы используете затронутую версию, немедленно обновитесь и проведите аудит всех учётных записей бэкенда.

Скачать инструмент