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-2025-11262-Lab — Laboratoire Docker pour reproduire CVE-2025-11262, un XSS aveugle stocké non authentifié dans le plugin WordPress Link Whisper Free. Inclut des cibles vulnérables et corrigées, un script PoC et une analyse de cause racine. | Kitploit
Outils/GitHubGitHub/rootdirective-sec/cve-2025-11262-lab
Analyse des VulnérabilitésExploitation d'Applications WebCTFTests d'IntrusionApprentissage et ÉducationLabs et Pratique
GitHubrootdirective-sec/cve-2025-11262-lab

CVE-2025-11262-Lab

Laboratoire Docker pour reproduire CVE-2025-11262, un XSS aveugle stocké non authentifié dans le plugin WordPress Link Whisper Free. Inclut des cibles vulnérables et corrigées, un script PoC et une analyse de cause racine.

Voir le dépôt
63il y a 3 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-2025-11262 - XSS aveugle stocké non authentifié dans Link Whisper Free

Résumé exécutif

Ce dépôt contient un laboratoire Docker local pour reproduire CVE-2025-11262, un problème de cross-site scripting stocké non authentifié affectant l'extension WordPress Link Whisper Free.

Le laboratoire compare deux versions de l'extension :

ServiceVersion de l'extensionObjectifURL
vuln0.9.0Cible vulnérablehttp://127.0.0.1:8081
patched0.9.1Cible de comparaison corrigéehttp://127.0.0.1:8082

La chaîne de vulnérabilité démontrée est la suivante :

Unauthenticated REST request
→ attacker-controlled user_id is persisted
→ a privileged WordPress user opens the Link Whisper AI Subscription page
→ the stored value is rendered into an admin JavaScript context
→ alert("CVE-2025-11262-LAB") executes on the vulnerable version

L'attaquant n'a pas besoin d'être connecté pour implanter la charge utile stockée. Le JavaScript s'exécute plus tard lorsqu'un utilisateur WordPress privilégié ouvre la page d'administration concernée.

Ce laboratoire est conçu uniquement pour la recherche locale contrôlée, la compréhension au niveau du code source et la démonstration de portfolio.

Faits vérifiés

AffirmationPreuveComment vérifier dans ce laboratoire
Link Whisper Free 0.9.0 est vulnérable.Les avis publics identifient les versions de Link Whisper Free jusqu'à 0.9.0 inclus comme étant affectées.Exécutez le PoC contre http://127.0.0.1:8081 et ouvrez l'URL d'administration affichée.
Link Whisper Free 0.9.1 contient le correctif.Les données d'avis public et de journal des modifications identifient 0.9.1 comme la version corrigée.Exécutez le même PoC contre http://127.0.0.1:8082 ; aucune alerte ne devrait apparaître.
L'implantation de la charge utile est non authentifiée.Le PoC envoie une requête POST sans cookies WordPress, connexion ni nonce.Inspectez poc/poc.py ; il nécessite uniquement --url.
L'impact visible se déclenche dans la zone d'administration WordPress.La valeur stockée est rendue lorsque la page Link Whisper AI Subscription est ouverte par un utilisateur privilégié.Après avoir exécuté le PoC, connectez-vous en tant qu'admin et ouvrez l'URL d'administration affichée.
La cible corrigée peut toujours renvoyer "ok" au niveau HTTP.Les tests locaux ont montré que les deux cibles peuvent renvoyer "ok" ; la différence significative réside dans le fait que la charge utile est persistée et exécutée ou non.Comparez le comportement du navigateur sur 8081 et 8082.

Voici la section Root Cause Summary à insérer dans le README. Elle est sûre pour le public, ne mentionne pas les fichiers internes comme vuln_detail.txt et s'appuie sur le laboratoire/source que vous utilisez actuellement.

Résumé de la cause racine

CVE-2025-11262 est causé par une chaîne d'injection JavaScript stockée dans Link Whisper Free 0.9.0.

Le problème n'est pas un simple appel d'échappement manquant. C'est une chaîne de plusieurs comportements non sécurisés :

Unauthenticated REST endpoint
→ insufficient validation of user_id
→ persistent storage in wpil_ai_access_user_id
→ unsafe rendering into an admin JavaScript context
→ stored XSS when a privileged user opens the AI Subscription page

Point de terminaison REST non authentifié

Link Whisper Free enregistre un point de terminaison REST d'authentification IA sous le namespace REST de l'extension :

const REST_SLUG = 'link-whisper';
const AI_AUTH = 'ai-auth';

Le point de terminaison est enregistré comme une route POST :

register_rest_route(self::REST_SLUG, self::AI_AUTH, [
    'methods'             => 'POST',
    'callback'            => [
        $this,
        'ai_auth_handler'
    ],
    'permission_callback' => "__return_true",
    'show_in_index'       => false
]);

Étant donné que le callback de permission est __return_true, le point de terminaison est accessible sans authentification.

Dans le laboratoire, le point de terminaison effectif est :

/wp-json/link-whisper/ai-auth

Cela signifie qu'un attaquant non authentifié peut envoyer une requête au point de terminaison sans session WordPress, nonce ni compte administrateur.

Gestion vulnérable des entrées dans 0.9.0

Dans Link Whisper Free 0.9.0, le gestionnaire lit les paramètres contrôlés par l'attaquant depuis la requête REST :

public function ai_auth_handler( WP_REST_Request $request )
{
    if(!empty($request->get_param('access_token'))){
        $token = $request->get_param('access_token');
        $user_id = $request->get_param('user_id');
        $uid = (int)$request->get_param('uid');
        $uemail = $request->get_param('uemail');

        if(!empty($token) && false !== strpos($token, 'ai-')){
            update_option('wpil_ai_access_token', Wpil_Toolbox::encrypt($token));
            update_option('wpil_ai_access_user_id', $user_id);
            update_option('wpil_ai_access_user_email', $uemail);
            update_user_meta($uid, 'wpil_ai_access_user_id', $user_id);
            update_user_meta($uid, 'wpil_ai_access_user_email', $uemail);
            update_option('wpil_ai_access_authorized', true);
        }

        return 'ok';
    }

    return new WP_Error(400, 'Bad request', [ 'status' => 404 ]);
}

Le comportement vulnérable est la condition de validation faible :

if(!empty($token) && false !== strpos($token, 'ai-')){

Cette condition vérifie uniquement si le jeton d'accès fourni contient la chaîne ai-.

Il n'y a pas de validation stricte de user_id avant son stockage :

update_option('wpil_ai_access_user_id', $user_id);

Par conséquent, du JavaScript contrôlé par l'attaquant peut être conservé dans la table des options WordPress.

Stockage persistant

La valeur user_id contrôlée par l'attaquant est stockée dans l'option WordPress :

wpil_ai_access_user_id

Dans ce laboratoire, le PoC envoie la charge utile locale suivante :

</script><script>alert("CVE-2025-11262-LAB")</script>

Sur le service vulnérable, la charge utile est stockée comme valeur de wpil_ai_access_user_id.

L'attaquant n'a pas besoin d'être connecté pour implanter la charge utile. La charge utile est implantée via le point de terminaison REST non authentifié.

Puits JavaScript d'administration

La valeur stockée est ensuite récupérée via la logique des paramètres de l'extension :

public static function get_linkwhisper_ai_user_id(){
    return get_option('wpil_ai_access_user_id', '');
}

La valeur est assignée à $ai_id et rendue dans la page d'administration AI Subscription.

Dans Link Whisper Free 0.9.0, la valeur est insérée directement dans une chaîne JavaScript :

body: JSON.stringify({
    ai_id: "<?php echo $ai_id;?>",
    subscription_id: "<?php echo ((!empty($sub)) && isset($sub->subscription_id)) ? $sub->subscription_id: null;?>"
})

Parce que $ai_id n'est pas échappé avant d'être inséré dans le contexte JavaScript, une charge utile stockée peut sortir de la chaîne prévue et exécuter du JavaScript lorsque la page d'administration est ouverte.

Avec la charge utile du laboratoire, le rendu vulnérable devient équivalent à :

body: JSON.stringify({
    ai_id: "</script><script>alert("CVE-2025-11262-LAB")</script>",
    subscription_id: ""
})

Dans un navigateur, la balise fermante </script> injectée termine le bloc de script d'origine, et le bloc <script> injecté s'exécute.

Condition de déclenchement

La charge utile est implantée par un attaquant non authentifié, mais son exécution nécessite qu'un utilisateur WordPress privilégié ouvre la page d'administration concernée :

/wp-admin/admin.php?page=link_whisper_ai_subscription
Télécharger l’outil