Injection WP_Query dans WordPress

| actualité

Le volet des vulnérabilités logiques et avancés sur la plate-forme WordPress n’est pas très documentés et la majorité des vulnérabilités rapportés sont notamment l’injection SQL, l’inclusion de fichier ou le XSS.  Pourtant comme cette plate-forme est de plus en plus utilisée pour livrer des solutions complexes, elle devient une cible de plus en plus intéressante pour des attaques ciblés visant l’accès aux données.

Les mécanismes de sécurité et le fonctionnement interne de WordPress sont souvent moins connus et maîtrisés (aussi bien en revue de code ou en attaque en aveugle),  L’une de ces catégories d’attaque est la manipulation de WP_Query, qui est le mécanisme « standard » pour interroger les articles.

L’extrait suivant est tiré d’une plugins populaire de WordPress.

$args = apply_filters('...', array_merge($_REQUEST, $args));
...
$the_query = new WP_Query( $args );

Ce qui revient à transposer l’ensemble des paramètres GET et POST associée à la requète dans les critères de recherche de WP_Query.  Coté exploitation c’est le pire scénario, mais nous retrouvons souvent des variantes de cette vulnérabilité qui impact un ou l’autre des paramètres.

La plupart des outils d’analyse de type fuzzing vont rarement identifier cette vulnérabilité, car l’impact est limité à retourner des enregistrements ou non sans provoquer d’erreur identifiable.  Par contre, d’un point de vue d’attaque ciblé, il devient très intéressant pour un attaquant de pouvoir manipuler WP_Query pour accéder à de l’information qui lui est normalement inaccessible.

Par exemple,  &post_status=draft  permettra d’accéder aux publication non publiés, &type=any permettra d’accéder à l’ensemble des types de publications, has_password aux pages protégées par mot de passe.

Dans un contexte où l’API de WordPress protège très peu les données lors des interrogations directes, des accès à de l’informations sensible deviennent alors très facile, par exemple des fiches de membres, des commandes et des pages à accès restreints.

Mise à jour : WP-FullCalendar à sortie une mise à jour depuis qui corrige cette vulnérabilité https://wordpress.org/plugins/wp-fullcalendar/changelog/