
Un PoC per CVE-2020-24913, una vulnerabilità di SQL injection in qcubed (tutte le versioni inclusa la 3.1.1) in profile.php tramite il parametro strQuery consente a un attaccante non autenticato di accedere al database iniettando codice SQL tramite una richiesta POST appositamente predisposta.
Una PoC per CVE-2020-24913, una vulnerabilità di SQL injection in qcubed (tutte le versioni inclusa la 3.1.1) in profile.php tramite il parametro strQuery, consente a un utente non autenticato di accedere al database iniettando codice SQL attraverso una richiesta POST appositamente costruita. Questa PoC viene eseguita utilizzando un database MySQL. Non siamo stati in grado di utilizzare un payload di query impilate (come si può fare con PostgreSQL) e abbiamo dovuto sfruttare questa vulnerabilità con un approccio basato sul tempo.
Nel parametro "strProfileData", utilizziamo il seguente payload (non codificato): a:1:{i:0;a:3:{s:12:"objBacktrace";a:1:{s:4:"args";a:1:{i:0;s:3:"pwn";}}s:8:"strQuery";s:38:"(SELECT * FROM (SELECT(SLEEP(10)))CP);";s:11:"dblTimeInfo";s:1:"1";}}
Il parametro vulnerabile è "strProfileData". Una richiesta riuscita da inviare al server appare così. L'array serializzato PHP inviato in questo parametro deve essere codificato in base64.
Nelle seguenti immagini, il parametro strProfileData è stato decodificato da base64 per consentire al lettore di vederlo più chiaramente, ma come menzionato sopra deve essere inviato codificato in base64.
La seguente richiesta contiene una query che fa sì che il server attenda 10 secondi. Sfrutteremo la vulnerabilità di SQL injection inviando una query SQL al database che lo costringe ad attendere un determinato intervallo di tempo (in secondi) prima di rispondere.
E per ottenere i dati dal database, utilizzeremo una struttura IF che fa sì che il database attenda più o meno tempo a seconda che la condizione sia vera o falsa.
Nelle seguenti immagini otteniamo i primi caratteri della versione del database (8.0.XX)
Utilizziamo la query SQL "SLEEP(5-(IF(SUBSTRING(@@version,X,1)='Y',2,5)))" che fa sì che il database attenda (5-2)=3 secondi se la condizione è vera, oppure attenda (5-5)=0 secondi se la condizione è falsa. La condizione è che il carattere della versione del database nella posizione X sia uguale al carattere Y.
