
Proof-of-Concept-Exploit für die SQL-Injection-Schwachstelle in Joomla 3.7.0 com_fields (CVE-2017-8917), der Erkennung, Enumeration und Datenextraktion in einem CTF-freundlichen Workflow demonstriert.
Dieses Repository enthält einen einfachen, CTF-freundlichen Proof of Concept (PoC) für die SQL-Injection-Schwachstelle com_fields von Joomla (CVE-2017-8917). Ziel ist es, den Ablauf schlank zu halten und dennoch den vollständigen Exploitationsablauf zu zeigen: Erkennung, Aufzählung und Datenextraktion.
Schwachstelle: SQL-Injection in der com_fields-Komponente von Joomla.
Grundursache: Der Parameter list[fullordering] wird nicht ordnungsgemäß bereinigt, sodass SQL in die generierte Abfrage injiziert werden kann. Bei Verwendung eines fehlerbasierten Payloads (z. B. UpdateXML) kann das SQL-Ergebnis in der Antwort sichtbar gemacht werden, was die Datenextraktion ermöglicht.
Wie sie ausgenutzt wird (Überblick):
index.php?option=com_fields&view=fields&layout=modal, wobei der Parameter list[fullordering] auf einen schädlichen Payload gesetzt ist.UpdateXML), um die Datenbank zu zwingen, Ergebnisse zurückzugeben.<title>-Tag) und extrahieren Sie die injizierte Ausgabe.Im Folgenden finden Sie die wichtigsten Komponenten.
parse_args()Parst CLI-Argumente in ein einfaches args-Objekt mit host und debug. Das Skript geht von HTTP auf Port 80 aus und erstellt die Basis-URL aus --host.
run_exploit()run_exploit() ist die zentrale Orchestrierungsfunktion:
requests.Session(), sodass Cookies und Header erhalten bleiben.request_title(): Sendet eine Anfrage und extrahiert den <title>-Wert. Der PoC nutzt fehlerbasierte SQLi, um Daten in dieses Tag zu leaken; dies ist also der Kern der Datenextraktion.build_params(): Erstellt die verwundbaren Anfrageparameter mit dem injizierten SQL.sql_list() und dump_table() automatisieren die Aufzählung und die abschnittsweise Extraktion._fetch_token()Das CSRF-Token wird aus der Joomla-Anmeldeseite extrahiert. Obwohl es in einigen Szenarien nicht erforderlich ist, erzwingen viele Joomla-Routen weiterhin CSRF-Prüfungen. Es einzubinden:
wrap_payload() und encode_sql_string()Diese Helfer erzeugen den eigentlichen Injection-Payload:
wrap_payload() kapselt eine rohe Abfrage in UpdateXML(...), um eine fehlerbasierte Ausgabe zu erzwingen.encode_sql_string() wandelt Zeichenfolgen in CHAR(...)-Ausdrücke um, um Probleme mit Anführungszeichen zu vermeiden._dump_table())Zeilen werden mit einem Trennzeichen verkettet und in Teilzeichenfolgen abgerufen, um ein Abschneiden zu vermeiden. Dadurch bleibt die Ausgabe auch bei langen Zeilenwerten konsistent.
python main.py --host <TARGET_IP>
Optionale Debug-Ausgabe:
python main.py --host <TARGET_IP> --debug
└─$ python exploit.py --host <TARGET>
]LLLLLLLLmmmmmLLLLLL[
]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_ 'LLLLLLLLLLLLLLLLLLLLLLf`
'LLLLLLLLLLLLLLLLLLLLLLLL'Lm_ LLLLLLLLLLLLLLLL`
LLLLLLLLLLLLLLLLLLLLLL 'LL LLLLLLLLLLLLLLLf
'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
MIT License Copyright (c) 2025 Jesús Caldera
Hiermit wird jeder Person, die eine Kopie dieser Software und der zugehörigen Dokumentationsdateien (die „Software“) erhält, kostenlos die Erlaubnis erteilt, uneingeschränkt mit der Software zu handeln, einschließlich und ohne Einschränkung der Rechte zur Nutzung, zum Kopieren, Modifizieren, Zusammenführen, Veröffentlichen, Verteilen, Unterlizenzieren und/oder Verkaufen von Kopien der Software, und Personen, denen die Software bereitgestellt wird, dies unter den folgenden Bedingungen zu gestatten:
Der obige Urheberrechtshinweis und dieser Genehmigungshinweis müssen in allen Kopien oder wesentlichen Teilen der Software enthalten sein.
DIE SOFTWARE WIRD „WIE BESEHEN“ BEREITGESTELLT, OHNE JEGLICHE AUSDRÜCKLICHE ODER IMPLIZITE GEWÄHRLEISTUNG, EINSCHLIESSLICH, ABER NICHT BESCHRÄNKT AUF DIE GEWÄHRLEISTUNG DER MARKTGÄNGIGKEIT, DER EIGNUNG FÜR EINEN BESTIMMTEN ZWECK UND DER NICHTVERLETZUNG VON RECHTEN DRITTER. IN KEINEM FALL SIND DIE AUTOREN ODER URHEBERECHTSINHABER FÜR ANSPRÜCHE, SCHÄDEN ODER ANDERE HAFTUNG VERANTWORTLICH, OB IN EINEM VERTRAG, UNAUSGEFÜHRTER HANDLUNG ODER ANDERWEITIG, DIE AUS ODER IN VERBINDUNG MIT DER SOFTWARE ODER DER NUTZUNG ODER ANDEREN HANDHABUNG DER SOFTWARE ENTSTEHEN.