Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

フィードお問い合わせプライバシー© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
cakephp-window-sqli — CakePHP 5.4.2 - 高 - リモート - SQLi - WindowExpression の range/frame オフセットが SQL に連結される | Kitploit
ツール/GitHubGitHub/abraxas/cakephp-window-sqli
脆弱性スキャナー脆弱性分析コード分析エクスプロイトウェブアプリケーション悪用ウェブセキュリティデータベースセキュリティ
GitHubabraxas/cakephp-window-sqli

cakephp-window-sqli

CakePHP 5.4.2 - 高 - リモート - SQLi - WindowExpression の range/frame オフセットが SQL に連結される

リポジトリを見る
178日前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

Abraxas Labs - cakephp-window-sqli

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  cakephp-window-sqli

解説記事: https://abraxaslabs.tech/research/cakephp-window-sqli

cakephp-window-sqli

分類: SQLi 到達範囲: リモート

CakePHP 5.4.2 (887b641) - Cake Software Foundation

CVE-2026-79752 は FunctionsBuilder の cast / extract / dateAdd を ensureSimpleString() で塞いだ。WindowExpression::range() と frame() はその修正に含まれていなかった。rows() と groups() は ?int を受け取る。range() は今も文字列を受け取る。buildOffsetSql はオフセット、フレーム種別、そして PRECEDING / FOLLOWING を連結して OVER に埋め込む。オフセットがすでに ExpressionInterface でない限り、バインダは使われない。

リクエストデータを func()->count('*')->over()->range($start, $end) に転送するアプリは、呼び出し元の文字列をバインドもクォートもせずに RANGE BETWEEN に挿入してしまう。

IDCVE 未割当
分類SQLi
到達範囲リモート(リクエストデータを range() / frame() に転送するアプリ)
CWECWE-89
CVSSHigh: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N
製品CakePHP (cakephp/database)
影響を受けるバージョン5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63)
認証クエリ/フォームデータを ->over()->range($start, $end) / frame() に転送するアプリケーション
ライセンスGNU Affero GPL v3.0
ラボ127.0.0.1 のみ

攻撃者ができること

アプリが転送するウィンドウ境界(アナリティクスの「直近 N 日間」、レポートビルダーなど)を設定できるユーザーは、OVER 句を追加の SQL に改変できる。

権限メソッド / シンク種類ラボで実証済みか推測か
SQL 断片を OVER (RANGE BETWEEN ...) に挿入するGET /?mode=range&start= を AggregateExpression::range($start, $end) / WindowExpression::frame() に渡すコンパイル済み SQL の完全性ラボで実証済み。コンパイル済み SQL は空のバインダを伴う RANGE BETWEEN 1) /* CAKEPHP-WINDOW-SQLI-WITNESS */ -- PRECEDING となる
アプリの DB ユーザーとして行を読み取りまたは変更する同じクエリを実行するDB の完全性 / 偵察挿入から推測。このラボはコンパイルのみ
同様の方法でフレーム種別や方向を変更するframe($type, $offset, $direction, ...) もこれらの文字列を連結するコンパイル済み SQL の完全性sql() / buildOffsetSql() から推測。ラボでは range() を使用
同様の方法で rows() / groups() を破壊する型付き ?int修正済みラボで修正済みを実証。rows(3) は ROWS BETWEEN 3 PRECEDING となり、クォートもバインドもされない

このピンで修正済み: FunctionsBuilder の cast / extract / dateAdd / jsonValue(CVE-2026-79752 / CVE-2026-77635)、Query::limit / offset(型付き int)。デフォルトの cakephp/app はクエリ文字列データを伴って range() を呼び出さない。残っているのは文書化されたウィンドウ API である。スケルトンアプリにおける未認証 RCE ではない。シェルではない。

同じピンの残り: collate SQLi、attachment CRLF、cache unserialize。

発見の経緯

cakephp/cakephp は、2026年のFunctionsBuilder SQLiに関するGHSAを受けて 5.4.2 に固定しました。このタグで10回の調査を実施しました。この基準では、CSRF / FormProtection、View LFI、BodyParser XXE、マスアサインメント、ヘルパーXSS、および trustProxy なしの clientIp() はいずれも該当なしでした。WindowExpressionTest::testRange は依然として次をアサートしています:

$w = (new WindowExpression())->range("'1 day'", "'10 days'");

buildOffsetSql は文字列のオフセットを決してバインドしません:

protected function buildOffsetSql(
    ValueBinder $binder,
    ExpressionInterface|string|int|null $offset,
    string $direction,
): string {
    if ($offset === 0) {
        return 'CURRENT ROW';
    }
    if ($offset instanceof ExpressionInterface) {
        $offset = $offset->sql($binder);
    }
    return sprintf('%s %s', $offset ?? 'UNBOUNDED', $direction);
}

$binder は、オフセットがすでに ExpressionInterface でない限り使用されません。

すでに記録されている誤った方向性: rows() をホールとして扱うこと(これは int 型です); 標準の cakephp/app が公開フォームでこれを露出していると主張すること; 注入された SQL を SQLite でオラクルとして実行すること(POC-READY はコンパイルのみ); リバースシェル。すべて見せかけです。

ラボ

python3 cakephp-window-sqli-Abraxas-Labs.py

または

cd lab
./run.sh

必ず http://127.0.0.1:19440 のみを対象とすること。小さな PHP アプリ、cakephp/database 5.4.2、SQLite :memory:。GET /?mode=range&start= は文字列として range() に渡される。GET /?mode=rows&n=3 は int のコントロールである。

SUCCESS cakephp-window-sqli pin=5.4.2 range-raw=yes rows-numeric=yes bound=no quoted=no CAKEPHP-WINDOW-SQLI-WITNESS

コンパイル済みIOC SQL:

SELECT (COUNT(*) OVER (RANGE BETWEEN 1) /* CAKEPHP-WINDOW-SQLI-WITNESS */ -- PRECEDING AND CURRENT ROW)) AS n FROM sqlite_master

制御:

SELECT (COUNT(*) OVER (ROWS BETWEEN 3 PRECEDING AND CURRENT ROW)) AS n FROM sqlite_master

修正

数値オフセットをバインドする。フレームタイプ(RANGE / ROWS / GROUPS)と方向(PRECEDING / FOLLOWING)を許可リスト化する。インターバル文字列については、クォートするか ExpressionInterface を必須とする。非 int の range() オフセットが生の SQL ではなくプレースホルダーまたはクォートされたリテラルになることを検証するテストを追加する。

参考資料

  • github.com/cakephp/cakephp タグ 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63)
  • WindowExpression.php · AggregateExpression.php
  • 近接する修正済み: CVE-2026-79752 · CVE-2026-77635
  • 同一ピン: cakephp-collate-sqli · cakephp-attachment-crlf · cakephp-cache-unserialize
  • CWE-89

ライセンス

GNU Affero GPL v3.0。LICENSE を参照。ループバックラボ専用。保証なし。

ツールをダウンロード