Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

FluxContactConfidentialité© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2026-97286 — Avis technique et preuve de concept pour CVE-2026-97286, une XSS stockée authentifiée dans le plugin WordPress Strong Testimonials, avec chaîne d'attaque, PoC et analyse du correctif. | Kitploit
Outils/GitHubGitHub/rully2212/cve-2026-97286
Analyse des VulnérabilitésExploitationExploitation d'Applications WebSécurité WebArticles et RechercheApprentissage et Éducation
GitHubrully2212/cve-2026-97286

CVE-2026-97286

Avis technique et preuve de concept pour CVE-2026-97286, une XSS stockée authentifiée dans le plugin WordPress Strong Testimonials, avec chaîne d'attaque, PoC et analyse du correctif.

Voir le dépôt
il y a 1 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

CVE-2026-97286 : XSS stocké authentifié dans Strong Testimonials

Un Contributeur authentifié peut stocker des métadonnées de photo de plateforme contrôlées par l'attaquant dans l'extension WordPress Strong Testimonials. Avant la version 3.3.12, l'extension rendait la valeur stockée à l'intérieur d'un attribut src d'image sans échappement contextuel. Après qu'un administrateur publie le témoignage piégé et un article qui l'affiche, la charge utile s'exécute pour les visiteurs qui ouvrent cet article, y compris les visiteurs non authentifiés.

Cette recherche a été menée dans un laboratoire local autorisé et divulguée via Patchstack avant la publication publique.

Métadonnées de l'avis

ChampValeur
CVECVE-2026-97286
ProduitStrong Testimonials
ÉditeurWP Chill
Slug de l'extensionstrong-testimonials
VulnérabilitéCross-site scripting stocké authentifié
Versions affectées<= 3.3.11
Version corrigée3.3.12
Privilège requisContributeur ou supérieur
CWECWE-79 : Neutralisation incorrecte des entrées lors de la génération de pages web
CVSS v3.16.5 Moyen — CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:L
ChercheurRully Miftahur Rozaq
Signalé16 septembre 2026
Divulgation publique30 septembre 2026

Patchstack classe l'avis en priorité faible bien que la sévérité de base CVSS v3.1 attribuée soit Moyenne.

Résumé

L'éditeur de témoignages accepte un tableau de requête custom et persiste chaque clé soumise en tant que métadonnée d'article. Les clés absentes de la définition de champ personnalisé configurée passent par sanitize_text_field(). Cela permet à un Contributeur de soumettre des métadonnées réservées à l'extension telles que platform et platform_user_photo lors de l'édition d'un témoignage qu'il possède.

Pour les plateformes sociales prises en charge, l'extension récupère platform_user_photo, vérifie que l'URL renvoie une réponse HTTP 200, puis interpole la chaîne stockée d'origine dans un attribut <img src="https://raw.githubusercontent.com/rully2212/cve-2026-97286/main/...">. La validation du statut HTTP ne rend pas une chaîne sûre pour un attribut HTML. Un guillemet dans le fragment d'URL peut terminer src et introduire un gestionnaire d'événements.

La chaîne d'attaque vérifiée est la suivante :

  1. Un Contributeur enregistre des métadonnées de photo de plateforme piégées dans un témoignage qu'il possède.
  2. Un administrateur publie le témoignage et un article normal qui l'affiche.
  3. L'extension émet la valeur piégée dans une balise image.
  4. Le JavaScript s'exécute dans l'origine du site lorsqu'un visiteur ouvre l'article publié.

L'injection est authentifiée. Le visiteur qui déclenche la charge utile déjà publiée n'a pas besoin d'être authentifié.

Impact

Une exploitation réussie permet une exécution persistante de JavaScript dans l'origine WordPress affectée sur les pages qui affichent le témoignage piégé via le chemin de vignette vulnérable. Le code s'exécute avec les privilèges du navigateur et la session WordPress du visiteur, le cas échéant.

Le chemin reproduit nécessite une publication par un administrateur, ce qui explique la métrique CVSS UI:R. Cette recherche n'a pas démontré d'injection non authentifiée, d'exécution automatique sur toutes les pages du site, d'élévation de privilèges, de vol de cookies ni de compromission complète du site.

Environnement testé

La preuve de concept a été reproduite avec la configuration suivante :

ComposantConfiguration
WordPress7.1
Strong Testimonials3.3.7, édition gratuite
ThèmeTwenty Twenty-Five
Modèle d'affichagedefault-theme
VignetteActivée
PHP / ApachePHP 8.3.33 / Apache 2.4.68
Base de donnéesMariaDB 11.4
Rôle de l'attaquantContributeur
Capacités de l'attaquantedit_posts=true, publish_posts=false, unfiltered_html=false

La version 3.3.7 était la version exacte utilisée dans le laboratoire. L'enregistrement CVE public identifie toutes les versions jusqu'à 3.3.11 comme affectées et la version 3.3.12 comme corrigée.

Analyse technique

1. Les clés de métadonnées inattendues sont persistées

Dans admin/class-strong-testimonials-post-editor.php, save_details() parcourt chaque entrée du tableau custom soumis. Une clé non reconnue atteint la branche de nettoyage générique puis est stockée avec update_post_meta() :

$custom = $_POST['custom'];

foreach ( $custom as $key => $value ) {
    // ...
    $sanitized_value = sanitize_text_field( $value );
    update_post_meta( $post_id, $key, $sanitized_value );
}

Le gestionnaire réel effectue des vérifications de nonce et une assainissement spécifique à chaque champ. La découverte ne repose pas sur le contournement de ces vérifications ni sur la modification du témoignage d'un autre utilisateur. Le Contributeur modifie légitimement son propre témoignage mais fournit les clés réservées platform et platform_user_photo.

2. La validation du statut HTTP ne constitue pas un échappement de sortie

Dans les versions vulnérables, includes/functions-image.php lit platform_user_photo, effectue une vérification du statut HTTP via wpmtst_is_valid_image_url(), et insère la chaîne d'origine dans un attribut HTML :

$platform_user_photo = get_post_meta( $post_id, 'platform_user_photo', true );
if ( ! $platform_user_photo || ! wpmtst_is_valid_image_url( $platform_user_photo ) ) {
    return $img;
}

return sprintf(
    '<img src="https://raw.githubusercontent.com/rully2212/cve-2026-97286/main/%25s" %s %s/>',
    $platform_user_photo,
    $width ? "width='{$width}'" : '',
    $height ? "height='{$height}'" : ''
);

La partie fragment d'une URL n'est pas envoyée au serveur HTTP, mais elle reste dans la chaîne ensuite rendue par PHP. Le serveur peut donc voir une URL inoffensive renvoyant HTTP 200 tandis que le navigateur reçoit une valeur contenant une séquence d'évasion d'attribut.

3. Le template frontend fait confiance au HTML d'image généré

Le template default-theme appelle wpmtst_get_thumbnail() et émet directement le balisage d'image renvoyé :

<figure class="wp-block-image wpmtst-testimonial-avatar">
    <?php echo $wpmtst_avatar_html; ?>
</figure>

Le modèle suppose que l'assistant a déjà produit du HTML sûr. Dans les versions affectées, l'assistant photo de la plateforme n'échappait pas l'URL pour son contexte src.

Preuve de concept

Ne reproduisez ce problème que sur un système que vous possédez ou pour lequel vous êtes explicitement autorisé à effectuer des tests.

Prérequis

  • Strong Testimonials <= 3.3.11 sur un site WordPress de test autorisé.
  • Un compte Contributor standard.
  • Une vue Strong Testimonials Display utilisant default-theme avec les vignettes activées.
  • Un compte administrateur pour l'étape de publication normale.

Étapes

  1. Connectez-vous en tant que Contributor et créez un nouveau brouillon de témoignage.

  2. Capturez la requête d'enregistrement légitime POST /wp-admin/post.php à l'aide d'un proxy d'interception. Conservez son corps de formulaire complet, son cookie de session, un nonce WordPress frais, le nonce du plugin et l'ID du témoignage appartenant au Contributor.

  3. Ajoutez ces paramètres au corps du formulaire :

    custom[platform]=facebook
    custom[platform_user_photo]=http://wordpress/index.php?rest_route=/#" onerror="alert(1)" x="
    

    fragment de formulaire encodé en URL :

    &custom%5Bplatform%5D=facebook&custom%5Bplatform_user_photo%5D=http%3A%2F%2Fwordpress%2Findex.php%3Frest_route%3D%2F%23%22%20onerror%3D%22alert%281%29%22%20x%3D%22
    
Télécharger l’outil