
Un PoC pour CVE-2020-24913, une vulnérabilité d'injection SQL dans qcubed (toutes versions, y compris 3.1.1) dans profile.php via le paramètre strQuery, permet à un attaquant non authentifié d'accéder à la base de données en injectant du code SQL via une requête POST spécialement conçue.
Un PoC pour CVE-2020-24913, une vulnérabilité d'injection SQL dans qcubed (toutes versions y compris 3.1.1) dans profile.php via le paramètre strQuery permet à un attaquant non authentifié d'accéder à la base de données en injectant du code SQL via une requête POST spécialement conçue. Ce PoC est réalisé en utilisant une base de données MySQL. Nous n'avons pas pu utiliser une charge utile basée sur des requêtes empilées (comme cela peut être fait avec postgres) et nous avons dû exploiter cette vulnérabilité avec une approche basée sur le temps.
Dans le paramètre « strProfileData », nous utilisons la charge utile suivante (non encodée) : 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";}}
Le paramètre vulnérable est « strProfileData ». Une requête réussie à envoyer au serveur ressemble à ceci. Le tableau sérialisé PHP envoyé dans ce paramètre doit être encodé en base64.
Pour les images suivantes, le paramètre strProfileData a été décodé en base64 afin que le lecteur puisse le voir plus clairement, mais comme mentionné ci-dessus, il doit être envoyé encodé en base64.
La requête suivante contient une requête SQL qui fait dormir le serveur pendant 10 secondes. Nous allons exploiter la vulnérabilité d'injection SQL en envoyant une requête SQL à la base de données qui la force à attendre un temps déterminé (en secondes) avant de répondre.
Et pour obtenir les données de la base de données, nous allons utiliser une structure IF qui fait dormir la base de données plus ou moins longtemps selon que la condition est vraie ou non.
Dans les images suivantes, nous obtenons les premiers caractères de la version de la base de données (8.0.XX)
Nous utilisons la requête SQL « SLEEP(5-(IF(SUBSTRING(@@version,X,1)='Y',2,5))) » qui fait dormir la base de données (5-2)=3 secondes si la condition est vraie, ou qui fait dormir la base de données (5-5)=0 seconde si la condition est fausse. La condition est que le caractère de la version de la base de données à la position X est égal au caractère Y.


