
Analyse technique et preuve de concept d'exploitation pour CVE-2021-43408, une vulnérabilité d'injection SQL dans le plugin WordPress Duplicate Post version 1.1.9, avec guide d'exploitation étape par étape et conseils de remédiation.
WordPress est un logiciel CMS (Content Management System) open source, un système de gestion de contenu. Plutôt que d'utiliser le langage HTML, WP est écrit en langage de programmation PHP et s'appuie sur la base de données MySQL. WordPress a été fondé par les développeurs Matt Mullenweg et Mike Little. Aujourd'hui, WordPress appartient à la société Automattic, dont le siège est situé à San Francisco, en Californie, aux États-Unis.
Le plugin Duplicate Post de WordPress, dans les versions 1.1.9 et inférieures, est vulnérable à une injection SQL. Ce type d'exploitation permet à un attaquant d'injecter des requêtes SQL, puis de lire, modifier, voire supprimer des ressources dans la base de données.
Cette vulnérabilité peut être exploitée par tout utilisateur authentifié ayant le droit d'utiliser les fonctionnalités du plugin Duplicate Post. Par défaut, seul l'administrateur possède ce droit ; cependant, les autorisations pouvant être modifiées, l'éditeur, l'auteur, le contributeur et même l'abonné peuvent également utiliser ce plugin.
CVE-2021-43408 a été découverte le "11/19/2021" et a été évaluée au niveau selon l'échelle CVSS.
HIGH
La cause principale de cette vulnérabilité est que les données envoyées dans la requête côté utilisateur ne sont pas assainies avant d'être utilisées dans l'exécution SQL.
Plus précisément, dans le fichier post/handler.php, dans la fonction cdn_insert_post()
function cdp_insert_post($id, $data, $times, $areWePro, $isChild = false, $p_ids = null, $site) {
// Get Wordpress database
global $wpdb;
// Create empty array for new id(s) and error(s)
$results = array('ids' => array(), 'error' => 0, 'counter' => 0);
// Get Counter value
$prefix = (($site != -1) ? $wpdb->get_blog_prefix($site) : $wpdb->get_blog_prefix());
$newestId = $wpdb->get_results("SELECT post_id FROM {$prefix}postmeta WHERE meta_key = '_cdp_origin' AND meta_value = {$id} ORDER BY post_id DESC LIMIT 1", ARRAY_A);
$idest contrôlé par l'attaquant
La variable $id est passée à la fonction contenant la requête SQL sans aucune assainissement. Cette fonction est appelée via WordPress Ajax wp_ajax_cdp_action_handling.
On peut voir que le paramètre id est transmis via la fonction cdn_sanitize_array ; ici, les champs de données de l'article passent par la fonction sanitize_text_field, qui échappe tout guillemet ' dans la chaîne de données.

Les champs de données sont soumis à
sanitize_text_field
Cependant, le code contient une faille lorsqu'il transmet les données du champ Integer (le champ id) dans la requête SQL. Un attaquant peut en profiter pour insérer des instructions SQL supplémentaires dans la valeur de ce champ. Par conséquent, pour contrôler la requête SQL, l'attaquant n'a qu'à éviter d'utiliser le caractère '.
Étape 1: Connectez-vous en tant qu'administrateur, installez le plugin Duplicate Post version 1.1.9. Ce plugin permet aux utilisateurs de dupliquer les articles existants.

Étape 2: Accédez à la section Post, sélectionnez un article, choisissez l'action Copy et cliquez sur Apply.

Étape 3: Sélectionnez Setting: Default puis cliquez sur Copy.

Étape 4: Interceptez la requête HTTP. Le champ de données à noter ici est id ; on peut voir que les données de ce champ sont de type Integer.

Étape 5: Insérez la charge utile d'injection SQL, envoyez la requête et constatez que le serveur ne renvoie la réponse qu'après 9 secondes -> l'injection SQL a réussi.
Charge utile : 1 and (select*from(select(sleep(9)))a)--

