
Exploit de preuve de concept pour la vulnérabilité d'injection SQL com_fields de Joomla 3.7.0 (CVE-2017-8917), démontrant la détection, l'énumération et l'extraction de données dans un workflow adapté aux CTF.
Ce dépôt contient une preuve de concept (PoC) simple et adaptée aux CTF pour la vulnérabilité d'injection SQL com_fields de Joomla (CVE-2017-8917). L'objectif est de maintenir un workflow léger tout en montrant le flux d'exploitation complet : détection, énumération et extraction de données.
Vulnérabilité : injection SQL dans le composant com_fields de Joomla.
Cause racine : le paramètre list[fullordering] n'est pas correctement assaini, permettant d'injecter du SQL dans la requête générée. Lorsqu'il est conçu avec une charge utile basée sur les erreurs (par exemple, UpdateXML), le résultat SQL peut apparaître dans la réponse, permettant l'extraction de données.
Comment l'exploiter (haut niveau) :
index.php?option=com_fields&view=fields&layout=modal avec le paramètre list[fullordering] défini à une charge utile malveillante.UpdateXML) pour forcer la base de données à renvoyer les résultats.<title>) et extraire la sortie injectée.Voici les composants les plus critiques.
parse_args()Analyse les arguments CLI en un objet args simple avec host et debug. Le script suppose HTTP sur le port 80 et construit l'URL de base à partir de --host.
run_exploit()run_exploit() est la fonction d'orchestration principale :
requests.Session() pour que les cookies et les en-têtes persistent.request_title() : envoie une requête et extrait la valeur <title>. Le PoC utilise une injection SQL basée sur les erreurs pour faire fuiter des données dans cette balise, c'est donc le cœur de l'extraction de données.build_params() : crée les paramètres de requête vulnérables avec le SQL injecté.sql_list() et dump_table() automatisent l'énumération et l'extraction par morceaux._fetch_token()Le jeton CSRF est extrait de la page de connexion Joomla. Bien que certains scénarios puissent ne pas en avoir besoin, de nombreuses routes Joomla imposent toujours des vérifications CSRF. L'inclure :
wrap_payload() et encode_sql_string()Ces fonctions auxiliaires génèrent la charge utile d'injection réelle :
wrap_payload() encapsule une requête brute dans UpdateXML(...) pour forcer une sortie basée sur les erreurs.encode_sql_string() convertit les chaînes en expressions CHAR(...) pour éviter les problèmes de guillemets._dump_table())Les lignes sont concaténées avec un séparateur et récupérées en sous-chaînes pour éviter la troncature. Cela maintient la cohérence de la sortie même lorsque les valeurs des lignes sont longues.
python main.py --host <TARGET_IP>
Sortie de débogage optionnelle :
python main.py --host <TARGET_IP> --debug
└─$ python exploit.py --host <TARGET>
]LLLLLLmmmmmLLLLLL[
]LLLLLLLLLLLLLLLLL[
]LLLLLLLLLLLLLLLLL[
]LLLLLLLLLLLLLLLLL[
]LLLLLLLLLLLLLLLLL[
ms. ]LLLLLLLLLLLLLLLLL[ ,m
]LLLLs. ]LLLLLLLL~+LLLLLLL[ _gLLLL
LLLLLLLL_. LLLLLLLL ~~\LLLL[ ,gLLLLLLLi
dLLLLLLLLLLm_ -LLLLLLLo LLL[ _mLLLLLLLLLL.
iLLLLLLLLLLLLLLs. ]LLf` , 'c LLL[ ,gLLLLLLLLLLLLLL
iLLLLLLLLLLLLLLLLLLsgL` 'c- \. LLLLLLLLLLLLLLLLLLLLLL
,LLLLLLLLLLLLLLLLLLLLL! =__/Li iLLLLLLLLLLLLLLLLLLLLLLL
gLLLLLLLLLLLLLLLLLLLLLL imm_.Y~'` LLLLLLLLLLLLLLLLLLLLLLLLL.
dLLLLLLLLLLLLLLLLLLLLLLL 'LL_ dLLLLLLLLLLLLLLLLLLLLLLLLLLi
,LLLLLLLLLLLLLLLLLLLLLLLLLi ~--__LLLLLLLLLLLLLLLLLLLLLLLLLLLLs
'LLLLLLLLLLLLLLLLLLLLLLLLLLs. LLLLLLLLLLLLLLLLLLLLLLLLLLLLL~
'LLLLLLLLLLLLLLLLLLLLLLLLLL_. LLLLLLLLLLLLLLLLLLLLLLLLf
'LLLLLLLLLLLLLLLLLLLLLLLLLLm_ 'LLLLLLLLLLLLLLLLLLLf`
'LLLLLLLLLLLLLLLLLLLLLLLL'Lm_ LLLLLLLLLLLLLLLL`
LLLLLLLLLLLLLLLLLLLLLL 'LL LLLLLLLLLLLLLf
'LLLLLLLLLLLLLLLLLLL L LLLLLLLLLLL~
_LLLLLLLLLLLLLLL !i ] ,LLLLLLLLLLLs.
gLLLLLLLLLLLLLLLLL! 's [ _mLLLLLLLLLLLLLLLs
gmLLLLLLLLLLLLLLLLLLL ~eLLLLLLLLLLLLLLLLLLLLLms
_gLLLLLLLLLLLLLLLLLLLLLL. 'LLLLLLLLLLLLLLLLLLLLLLLs_
_gLLLLLLLLLLLLLLLLLLLLLLLLLL_ !LLLLLLLLLLLLLLLLLLLLLLLLs.
,gLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLm_ YLLLLLLLLLLLLLLLLLLLLLLLLLms
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLs ]LLLLLLLLLLLLLLLLLLLLLLLLLL`
'LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL 'YL ]LLLLLLLLLLLLLLLLLLLLLLLLf
'LLLLLLLLLLLLLLLLLLLLLLLLLLLf`! f ,LLLLLLLLLLLLLLLLLLLLLLLL!
'LLLLLLLLLLLLLLLLLLLLLLLLL[ LmmLLLLLLLLLLLLLLLLLLLLLLLL`
LLLLLLLLLLLLLLLLLf LLLLi t LLLLLLL LLLLLLLLLLLLLLLLL!
'LLLLLLLLLLLLLf LLLL[ '*LLLLLLL 'LLLLLLLLLLLLL[
!LLLLLLLLLf` LLLLLs 'YLLLLL ~LLLLLLLLLL
LLLLLLf~ LLLLLLLs LLLLL ~LLLLLL`
'LLL~ LLLLLLLLLm iLLLLL ~LLL~
~` LLLLLLLL[LLmLLLLLL '`
LLLLLL`d[ LLLLLLLL
LLLLLLdL[ LLLLLLLL
LLLLLLLLLLLLLLLLLL Juergen Jakubowski
LLLLLLLLLLLLLLLLLL
LLLLLLLLLLLLLLLLLL [email protected]
EXPLOIT BY ztrxwzy.
INSPIRED BY THE POC FROM Baptiste Contreras.
[888] Target : http://10.66.187.202:80/index.php
[888] CSRF token : 3ec54b1b32b5dc2dd8186537821b8dc1
[888] http://10.66.187.202:80/index.php is vulnerable to SQLi
[888] Database version detected : 5.5.64-MariaDB
[888] Current database : joomla
[888] Tables in database joomla
Licence MIT Copyright (c) 2025 Jesús Caldera
La permission est accordée, gratuitement, à toute personne obtenant une copie de ce logiciel et des fichiers de documentation associés (le « Logiciel »), de traiter le Logiciel sans restriction, y compris, sans limitation, les droits d'utiliser, copier, modifier, fusionner, publier, distribuer, sous-licencier et/ou vendre des copies du Logiciel, et de permettre aux personnes à qui le Logiciel est fourni de le faire, sous réserve des conditions suivantes :
L'avis de copyright ci-dessus et cet avis de permission doivent être inclus dans toutes les copies ou parties substantielles du Logiciel.
LE LOGICIEL EST FOURNI « TEL QUEL », SANS GARANTIE D'AUCUNE SORTE, EXPRESSE OU IMPLICITE, Y COMPRIS, MAIS SANS S'Y LIMITER, LES GARANTIES DE QUALITÉ MARCHANDE, D'ADÉQUATION À UN USAGE PARTICULIER ET D'ABSENCE DE CONTREFAÇON. EN AUCUN CAS LES AUTEURS OU TITULAIRES DU COPYRIGHT NE POURRONT ÊTRE TENUS RESPONSABLES DE TOUTE RÉCLAMATION, DOMMAGE OU AUTRE RESPONSABILITÉ, QUE CE SOIT DANS LE CADRE D'UNE ACTION CONTRACTUELLE, DÉLICTUELLE OU AUTRE, DÉCOULANT DE, OU EN RELATION AVEC LE LOGICIEL OU SON UTILISATION OU D'AUTRES INTERACTIONS AVEC LE LOGICIEL.