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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
cakephp-cache-unserialize — CakePHP 5.4.2 - 高 - リモート - アンシリアライズ - キャッシュエンジンがクラス許可リストなしでオブジェクトをアンシリアライズする | Kitploit
ツール/GitHubGitHub/abraxas/cakephp-cache-unserialize
脆弱性分析エクスプロイトウェブアプリケーション悪用セキュリティ仮想化ウェブセキュリティペネトレーションテストラボと実践
GitHubabraxas/cakephp-cache-unserialize

cakephp-cache-unserialize

CakePHP 5.4.2 - 高 - リモート - アンシリアライズ - キャッシュエンジンがクラス許可リストなしでオブジェクトをアンシリアライズする

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

人気

すべて見る →

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

すべてのツールを探索

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

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

Abraxas Labs - cakephp-cache-unserialize

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

cakephp-cache-unserialize

クラス: オブジェクトインジェクション 到達範囲: リモート (Redis/Memcached 書き込み) / ローカル (FileEngine)

CakePHP 5.4.2 (887b641) - Cake Software Foundation

5.3.7 ではこの理由から Redis の allowedClasses が追加され、後方互換性のためにデフォルトは true (すべて許可) のままでした。RedisEngine は、そのデフォルトが適用される場合、依然として素の unserialize() を呼び出します。FileEngine には許可リストがまったくありません。MemcachedEngine は依然として serialize のデフォルトを php にしています。

Redis 上で cake_ キーを SET できる、またはキャッシュファイルを書き込める攻撃者は、シリアライズされたオブジェクトを仕込みます。次の Cache::read (または CacheSession のロード) が、それを PHP ワーカー内で実行します。

IDCVE 未割り当て
クラスオブジェクトインジェクション
到達範囲攻撃者から Redis または Memcached に書き込み可能な場合は リモート。tmp/cache 上の FileEngine の場合は ローカル。
CWECWE-502
CVSSHigh: 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H (キャッシュストアへの書き込みが必要)。FileEngine は AV:L。
製品CakePHP
影響を受けるバージョン5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63)
認証キャッシュストアへの書き込み (Redis SET、Memcached set、またはキャッシュファイル)。ロックダウンされた localhost Redis への未認証 HTTP ではありません。
ライセンスGNU Affero GPL v3.0
ラボ127.0.0.1 のみ

攻撃者ができること

アプリケーションキャッシュにシリアライズされたオブジェクトを仕込みます。次の読み取りが、PHP ワーカー内でそれを実行します。このラボは証拠ファイルの作成で止まります。ガジェットチェーンやシェルは実証しません。

ラボで実証済み (完全性)

  • Redis SET cake_<key> の後に Cache::read。 デフォルトのプレフィックスは cake_。RedisEngine の unserialize() は、allowedClasses がデフォルトの true の場合、素の unserialize($value) を使用します。LabMarker としてインスタンス化された仕込み済みの LabMarker オブジェクトと __wakeup が、PHP の UID で証拠ファイルを書き込みました。
  • FileEngine がキャッシュパス配下に {expiry}\n{serialize($obj)} を仕込む。 FileEngine::get() は依然として素の unserialize($data) を呼び出します。同じマーカー、同じ証拠。ファイル名は prefix とキー (cake_labfile) です。
  • 対照: allowedClasses => false はオブジェクトを拒否する。 同じ Redis ペイロードは __PHP_Incomplete_Class として返されました。__wakeup は実行されませんでした。証拠ファイルは存在しませんでした。

推測 (ここでは実行していない)

  • オートロードにガジェットが含まれていれば、アプリの UID での RCE。ラボのマーカーはフラグファイルを書き込むだけです。
  • セッションの defaults => cache の場合、CacheSession::read は同じシンクです。すべてのセッションロードが、攻撃者が制御するキャッシュバイトの unserialize になります。
  • MemcachedEngine の serialize => php は同種のバグです。このラボでは Memcached を起動していません。

クローズ済み / この残存問題ではないもの

  • Redis を公開していない素の cakephp/app への未認証 HTTP。
  • 攻撃者からの書き込みがない、ロックダウンされた localhost Redis。
  • リバースシェル、カスタムマルウェア、公開ガジェットチェーン。このパックには含まれません。
  • Redis の allowedClasses => false (または厳格なリスト) は、運用者が設定すればすでにオブジェクトをブロックします。これはデフォルトではありません。

同じピンの残存問題: window SQLi、collate SQLi、attachment CRLF。

発見の経緯

2026 年の FunctionsBuilder / jsonValue / Smtp CRLF / View element の波の後、cakephp/cakephp 5.4.2 をピン留めしました。RedisEngine はこのオプションを文書化しながら、依然としてデフォルトで開いたままにしています:

 * - `allowedClasses` ... Defaults to `true` (allow all) for backwards compatibility.
...
        'allowedClasses' => true,

読み取りパス:

    protected function unserialize(string $value): mixed
    {
        if (preg_match('/^[-]?\d+$/', $value)) {
            return (int)$value;
        }

        $allowedClasses = $this->getConfig('allowedClasses');
        if ($allowedClasses !== true) {
            return unserialize($value, ['allowed_classes' => $allowedClasses]);
        }

        return unserialize($value);
    }

FileEngine には同等のオプションがありません:

        if ($data !== '' && !empty($this->_config['serialize'])) {
            $data = unserialize($data);

すでに記録済みの誤った道: ロックダウンされた localhost Redis を未認証 HTTP RCE として扱うこと、ガジェットチェーンを提供すること、FileEngine をリモートと主張すること、リバースシェル。すべて見せかけです。オラクルは、フラグファイルを書き込むマーカーの __wakeup です。

ラボ

python3 cakephp-cache-unserialize-Abraxas-Labs.py

または

cd lab
./run.sh

対象は 127.0.0.1:19470 のみ。Docker 内のタグ 5.4.2 からのライブ CakePHP 5.4.2。ホストが SET できるように protected-mode をオフにした Redis 7。ext-redis 付きの PHP 8.3。/tmp/CAKEPHP-CACHE-UNSERIALIZE-WITNESS を書き込む __wakeup を持つマーカークラス LabMarker。シェルはありません。

SUCCESS cakephp-cache-unserialize redis-default-wakeup=yes redis-denied-wakeup=no file-wakeup=yes pin=5.4.2 sha=887b641de9f7aba06071f98f17edcbc573cbcf63 how=live CAKEPHP-CACHE-UNSERIALIZE-WITNESS

修正

Redis の allowedClasses のデフォルトを false、またはアプリが実際に保存するクラスの厳格なリストにします。同じオプションを FileEngine に追加し、get() でそれを尊重します。Memcached の serialize のデフォルトを json にします。CacheSession がキャッシュエンジンの unserialize ポリシーを継承することを文書化します。

参考資料

  • github.com/cakephp/cakephp タグ 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63)
  • RedisEngine.php · FileEngine.php
  • 同じピン: cakephp-window-sqli · cakephp-collate-sqli · cakephp-attachment-crlf
  • CWE-502

ライセンス

GNU Affero GPL v3.0。LICENSE を参照。ループバックラボのみ。無保証。

ツールをダウンロード