
Ein Poc für CVE-2020-24913, eine SQL-Injection-Schwachstelle in qcubed (alle Versionen einschließlich 3.1.1) in profile.php über den strQuery-Parameter, ermöglicht es einem nicht authentifizierten Angreifer, auf die Datenbank zuzugreifen, indem er SQL-Code über eine manipulierte POST-Anfrage injiziert.
Ein PoC für CVE-2020-24913, eine SQL-Injection-Schwachstelle in qcubed (alle Versionen einschließlich 3.1.1) in profile.php über den Parameter strQuery, ermöglicht es einem nicht authentifizierten Angreifer, auf die Datenbank zuzugreifen, indem er SQL-Code über eine manipulierte POST-Anfrage injiziert. Dieser PoC wird mit einer MySQL-Datenbank durchgeführt. Wir konnten kein Stacked-Queries-Payload verwenden (wie es mit PostgreSQL möglich ist) und mussten diese Schwachstelle mit einem zeitbasierten Ansatz ausnutzen.
Im Parameter "strProfileData" verwenden wir das folgende Payload (unkodiert): 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";}}
Der anfällige Parameter ist "strProfileData". Eine erfolgreiche Anfrage, die an den Server gesendet wird, sieht wie folgt aus. Das PHP-serialisierte Array, das in diesem Parameter gesendet wird, muss base64-kodiert sein.
Für die folgenden Bilder wurde der Parameter strProfileData base64-dekodiert, damit der Leser es deutlicher sehen kann, aber wie oben erwähnt muss es base64-kodiert gesendet werden.
Die folgende Anfrage enthält eine Abfrage, die den Server 10 Sekunden schlafen lässt. Wir werden die SQL-Injection-Schwachstelle ausnutzen, indem wir eine SQL-Abfrage an die Datenbank senden, die diese zwingt, eine bestimmte Zeit (in Sekunden) zu warten, bevor sie antwortet.
Und um die Daten aus der Datenbank zu erhalten, werden wir eine IF-Struktur verwenden, die die Datenbank je nachdem, ob die Bedingung wahr oder falsch ist, mehr oder weniger lange schlafen lässt.
In den folgenden Bildern erhalten wir die ersten Zeichen der Datenbankversion (8.0.XX)
Wir verwenden die SQL-Abfrage "SLEEP(5-(IF(SUBSTRING(@@version,X,1)='Y',2,5)))", die die Datenbank (5-2)=3 Sekunden schlafen lässt, wenn die Bedingung wahr ist, oder die Datenbank (5-5)=0 Sekunden schlafen lässt, wenn die Bedingung falsch ist. Die Bedingung ist, dass das Zeichen der Datenbankversion an der Position X gleich dem Zeichen Y ist.


