
Um PoC para CVE-2020-24913, uma vulnerabilidade de injeção de SQL no qcubed (todas as versões, incluindo a 3.1.1) em profile.php por meio do parâmetro strQuery, permite que um atacante não autenticado acesse o banco de dados ao injetar código SQL por meio de uma requisição POST elaborada.
Um PoC para CVE-2020-24913, uma vulnerabilidade de injeção de SQL no qcubed (todas as versões, incluindo 3.1.1) no profile.php através do parâmetro strQuery permite que um atacante não autenticado acesse o banco de dados injetando código SQL através de uma requisição POST manipulada. Este PoC é realizado usando um banco de dados MySQL. Não foi possível usar um payload de consultas empilhadas (como pode ser feito com o postgres) e tivemos que explorar essa vulnerabilidade com uma abordagem baseada em tempo.
No parâmetro "strProfileData", usamos o seguinte payload (sem codificação):
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";}}
O parâmetro vulnerável é "strProfileData". Uma requisição bem-sucedida para enviar ao servidor tem a seguinte aparência. O array serializado em PHP que é enviado nesse parâmetro deve ser codificado em base64.
Para as imagens a seguir, o parâmetro strProfileData foi decodificado de base64 para que o leitor possa vê-lo com mais clareza, mas, como mencionado acima, ele deve ser enviado codificado em base64.
A requisição a seguir contém uma consulta que faz o servidor dormir por 10 segundos. Vamos explorar a vulnerabilidade de injeção de SQL enviando uma consulta SQL ao banco de dados que o força a esperar uma quantidade específica de tempo (em segundos) antes de responder.
E, para obter os dados do banco de dados, vamos usar uma estrutura IF que faz o banco de dados dormir mais ou menos tempo dependendo se a condição é verdadeira ou falsa.
Nas imagens a seguir, obtemos os primeiros caracteres da versão do banco de dados (8.0.XX)
Usamos a consulta SQL "SLEEP(5-(IF(SUBSTRING(@@version,X,1)='Y',2,5)))" que faz o banco de dados dormir (5-2)=3 segundos se a condição for verdadeira, ou faz o banco de dados dormir (5-5)=0 segundos se a condição for falsa. A condição é que o caractere da versão do banco de dados na posição X seja igual ao caractere Y.


