
CakePHP 5.4.2 - 高 - リモート - SQLi - COLLATE照合順序は生のSQLフラグメントです
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-collate-sqli
Class: SQLi Reach: Remote
CakePHP 5.4.2 (887b641) - Cake Software Foundation
StringExpression::sql は文字列値をバインドし、照合順序を連結します。IdentifierExpression も同様です。ensureSimpleString は存在しません。Postgres の quoteIdentifier は '"' . trim($collation, '"') . '"' であるため、埋め込まれた引用符が CAST を早期に閉じてしまいます。
リクエスト/ロケールの照合順序を new StringExpression($term, $collation) に転送するアプリは、その文字列を COLLATE に挿入してしまいます。値はバインドされたままです。照合順序はそうではありません。
| ID | CVE 未割当 |
| Class | SQLi |
| Reach | Remote (照合順序/ロケールを StringExpression / IdentifierExpression に転送するアプリ) |
| CWE | CWE-89 |
| CVSS | High: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| Product | CakePHP (cakephp/database) |
| Affected | 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) |
| Auth | 照合順序/ロケールをこれらのコンストラクタに転送するアプリケーション |
| License | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 のみ |
ユーザー/ロケールの照合順序をこれらのコンストラクタに渡すアプリケーションが必要です。素の cakephp/app は、それ自体では公開フォームで照合順序を公開していません。
| 権限 | メソッド / シンク | 種類 | ラボ実証または推測 |
|---|---|---|---|
COLLATE の後に SQL を挿入 | StringExpression::sql が $this->collation を連結 | コンパイルされた SQL の完全性 | ラボ実証済み。生の SQL にペイロードがバインドされずに含まれる |
| 識別子に対する同様の挿入 | IdentifierExpression の note COLLATE <payload> | コンパイルされた SQL の完全性 | ラボ実証済み。id_raw_sql にペイロードが含まれる |
Postgres の "..." ラップからの脱出 | quoteIdentifier = '"' . trim($collation, '"') . '"' | コンパイルされた SQL の完全性 | ラボ実証済み。コンパイルされた SQL は COLLATE "C" AS text)) || (SELECT ... |
| 脱出を実行して別のテーブルを読み取る | CAST(... ) || (SELECT note FROM lab_secret ...) | DB の偵察 | ラボ実証済み。結果 xCAKEPHP-COLLATE-SQLI-WITNESS、実行エラーなし |
| 接続ロールで行を変更 / さらなる SQL | 同じインジェクション | DB の完全性 | 推測。ラボは SELECT オラクル |
| ネガティブコントロール | 照合順序 C | クローズ | ラボ実証済み。結果 x、witness なし、コンパイル結果 COLLATE "C" |
この残存箇所でクローズ済み: バインドされた文字列値 (:c0 はリテラル x のまま); ensureSimpleString (^[a-zA-Z0-9]+$) を通過する照合順序はこのペイロードではありません。スケルトンアプリにおける未認証 RCE ではありません。シェルでもありません。
同じピンの残存箇所: window SQLi、attachment CRLF、cache unserialize。
FunctionsBuilder / filename= のメモの後、5.4.2 にピンを固定しました。10 回の調査。残存 SQLi パスがこれです。StringExpression::sql:
$placeholder = $binder->placeholder('c');
$binder->bind($placeholder, $this->string, 'string');
return $placeholder . ' COLLATE ' . $this->collation;
Postgres の quoteIdentifier は ASCII 引用符でラップし、trim($collation, '"') を適用します。埋め込まれた " が識別子を閉じてしまいます。-- が、Cake がまだ追加する残りの閉じ引用符を食べてしまいます。
すでに記録済みの誤った道: SQLite のみをドライバとする (連結は実在するが、ラップ脱出は Postgres のもの); バインドされた値をインジェクションとして扱う; ensureSimpleString がここで既に実行されていると主張する (実行されていない); リバースシェル。茶番です。
python3 cakephp-collate-sqli-Abraxas-Labs.py
または
cd lab
./run.sh
ターゲットは http://127.0.0.1:19450 のみ。cakephp/database 5.4.2 と Postgres 16。小さなアプリが ?collation= を StringExpression / IdentifierExpression に転送し、CAST(... AS text) を実行します。シークレットテーブルに witness が保持されています。
SUCCESS cakephp-collate-sqli pin=5.4.2 raw=concat pg-wrap=breakout exec=yes CAKEPHP-COLLATE-SQLI-WITNESS
照合順序引数に ensureSimpleString() (または照合順序の許可リスト) を適用します。Postgres は trim とラップではなく、識別子を適切に引用する必要があります。
887b641de9f7aba06071f98f17edcbc573cbcf63)StringExpression.php · IdentifierExpression.php · Postgres.phpensureSimpleString()GNU Affero GPL v3.0。LICENSE を参照。ループバックラボのみ。無保証。