
pfSense CE 2.9.0-DEVELOPMENT - 中程度 - リモート - SQLi - voucher_expire WHERE
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-voucher-expire-sqli
Class: SQLi Reach: Remote
pfSense CE 2.9.0-DEVELOPMENT (9363ac5) - pfsense.org
voucher.inc captiveportal_read_db("WHERE username = '{$voucher}'") その後、先頭行の sessionid を captiveportal_remove_entries へ。未認証ログインの INSERT は SQLite3::escapeString を使用。
| ID | CVE 未採番 |
| Class | SQLi |
| Reach | Remote (特記なき限り認証済み WebGUI) |
| CWE | CWE-89 |
| CVSS | Medium: 6.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:L |
| Product | pfSense CE |
| Affected | 2.9.0-DEVELOPMENT (9363ac5b8651a1c7a333180425ce7719070f95f9) |
| Auth | page-status-captiveportal-expire / page-services-captiveportal-vouchers を持つ WebGUI セッション |
| License | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 のみ |
公開 master 9363ac5 を固定した。ラボは固定したシンクの PHP ガジェットで、127.0.0.1:19280 のループバック HTTP。
シリーズ解説: https://abraxaslabs.tech/research/pfsense-ce-leftovers
| Method | Sink | Privilege |
|---|---|---|
| POST voucher expire token | captiveportal_read_db WHERE username = '{$voucher}' | Integrity: ラボ実証: UNION が別の sessionid を選択し、stacked-UPDATE がその行を書き換えた。CONTROL expire は A のみを削除。未認証ログインパスはエスケープされたまま。 |
| 同じ残存箇所 | 同じシンク | Recon: 推測: UNION は captiveportal{zone}.db から他のセッション列を読み取れる。 |
| 同じ残存箇所 | 同じシンク | Availability: ラボ実証: 注入された先頭行の切断。そのゾーン DB 上の別セッションを削除/書き換え可能。 |
Requires: page-status-captiveportal-expire / page-services-captiveportal-vouchers。特記なき限り POST に CSRF-magic。WebGUI PHP-FPM は root。
Requires: page-status-captiveportal-expire / page-services-captiveportal-vouchers。特記なき限り POST に CSRF-magic。WebGUI PHP-FPM は root。特記なき限り POST に CSRF-magic。WebGUI PHP-FPM は root。
未認証ログインのエスケープ。voucher_auth は依然 escapeshellarg。シェルなし。他ゾーン DB なし。GUI cookie なし。
そのページも許可されていない限り Diagnostics: Command なし。
cd lab
./run.sh
ループバック 127.0.0.1:19280。Compose プロジェクト pfsense-voucher-expire-sqli。Witness PFSENSE-VOUCHER-EXPIRE-SQLI-WITNESS。ループバックのみ: 127.0.0.1:19280。Compose プロジェクト pfsense-voucher-expire-sqli。Witness PFSENSE-VOUCHER-EXPIRE-SQLI-WITNESS。固定した行の PHP ガジェット。実行後にスタックは破棄される。
最終行:
SUCCESS PFSENSE-VOUCHER-EXPIRE-SQLI control-expire-only-a=yes control-login-escaped=yes trigger-rewrite-b=yes PFSENSE-VOUCHER-EXPIRE-SQLI-WITNESS
パラメータをバインドする。voucher を SQL へ連結するのをやめる。
9363ac5b8651a1c7a333180425ce7719070f95f9