g0thamRabb1t/CVE-2026-48908-joomla-sp-page-builder-detection
GitHub: g0thamRabb1t/CVE-2026-48908-joomla-sp-page-builder-detection
针对 Joomla SP Page Builder CVE-2026-48908 漏洞的实验室验证项目,记录完整攻击链证据并提供 SOC 检测建议与缓解指导。
Stars: 0 | Forks: 0
# CVE-2026-48908 — Joomla SP Page Builder 验证与检测
针对 Joomla SP Page Builder 组件中 CVE-2026-48908 的实验室验证,重点关注技术证据、事件重构和防御检测机会。
该仓库记录了一项受控测试,在此测试中,SP Page Builder `asset.uploadCustomIcon` endpoint 接受了上传的图标压缩包,导致在 Joomla 媒体目录下写入了 PHP artifacts。通过 HTTP 调用上传的 PHP 文件导致以 web 服务器进程用户的身份执行命令。最终产生的 HTTP、文件、进程、身份验证和网络活动通过 Apache 容器日志、Linux `auditd`、`tcpdump`、Docker 遥测、文件变更轮询以及 Windows 主机的截图被捕获。
## 报告
- [英文验证报告](reports/CVE-2026-48908_SP_Page_Builder_detection_EN.pdf)
- [波兰语验证报告](reports/CVE-2026-48908_SP_Page_Builder_detection_PL.pdf)
两份报告均包含完整的测试方法、证据摘录、事件时间线、文件变更证据、网络指标、缓解指导、审计建议以及 SIEM 示例逻辑。
## 仓库结构
```
.
├── README.md
├── SHA256SUMS.txt
├── reports/
│ ├── CVE-2026-48908_SP_Page_Builder_detection_EN.pdf
│ └── CVE-2026-48908_SP_Page_Builder_detection_PL.pdf
└── screenshots/
├── 01_poc_upload_and_code_execution.png
├── 02_http_whoami_www_data.png
├── 03_tcp_callback_ncat.png
├── 04_reverse_shell_session.png
└── 05_root_access_and_su_failure_redacted.png
```
不包含任何漏洞利用源码、payload 源码、原始 PCAP、原始 Docker 证据包或 DOCX 源文件。
## 测试环境
| 角色 | 系统 |
|---|---|
| 受害者主机 | Ubuntu 24.04.4 LTS,内核 6.17.0-35-generic,Docker Engine 29.5.3 |
| 目标应用 | Joomla 5.4.7,PHP 8.3.32,Apache HTTP Server,镜像 `joomla:5-php8.3-apache` |
| 组件 | JoomShaper SP Page Builder |
| 容器 | `joomla5-builders` |
| 攻击者工作站 | Microsoft Windows 11 Home 10.0.26200 |
| Joomla 服务 | `http://172.20.10.3:8080` |
| Windows 测试地址 | `172.20.10.2` |
| 容器地址 | `172.21.0.3` |
| 测试日期 | 2026 年 7 月 9 日 |
Joomla webroot `/var/www/html` 由 Docker volume `joomla5-builders_joomla_data` 支撑。这对于检测至关重要:`docker diff` 无法提供 volume 内文件变更的详细可见性,因此文件监控必须依赖于感知 volume 的文件列表和主机端的监控指导。
## 验证内容
测试在隔离且经授权的实验室环境中进行。验证涵盖了以下步骤:
1. 在 Docker 中部署安装了 SP Page Builder 的 Joomla 5。
2. 使用参考中列出的一个公开项目作为初始验证参考。
3. SP Page Builder `asset.uploadCustomIcon` endpoint 在实验室环境中接受了上传的图标压缩包。
4. 在 `/media/com_sppagebuilder/assets/iconfont/` 下创建了新目录和文件。
5. 上传的内容包含大小写混合的 PHP 扩展名和一个更改了 `.PHP` 扩展名 PHP 处理方式的 `.htaccess` 文件。
6. 通过 HTTP 调用上传的 PHP artifact 并执行了受控命令。
7. 向 Windows 主机的一次性 TCP 回调确认了出站连接。
8. 受控的 reverse shell 测试确认了以 web 服务器用户身份进行的交互式命令执行。
9. 尝试访问 `/root` 以及使用 `su -` 切换用户失败。
10. 来自受害者端遥测和 Windows 截图的证据被关联到一个单一的 UTC 时间线中。
这些报告有意记录了证据和检测逻辑,而没有分发可重用的漏洞利用或 payload 实现。
## 确认结果
实验室测试确认了:
- 通过 SP Page Builder `asset.uploadCustomIcon` endpoint 进行未授权上传;
- 在 Joomla 媒体目录下创建 PHP 和 `.htaccess` artifacts;
- 在 HTTP 请求后服务器端执行上传的 PHP artifact;
- 在 Apache/PHP 进程用户上下文中的执行;
- 从 Joomla 容器到 Windows 主机的出站 TCP 连接;
- 作为 `www-data` 的交互式 reverse shell 会话;
- 未确认提权至 root。
在容器内部,有效身份为:
```
uid=33(www-data) gid=33(www-data) groups=33(www-data)
```
失败的提权尝试表现为:
```
cd root
bash: cd: root: Permission denied
su -
Password:
su: Authentication failure
```
## 关键证据
### 公开 PoC 验证与上传行为
公开 PoC 测试了多个扩展名变体,并确认在实验室设置中,包含大小写混合的 PHP 扩展名和 `.htaccess` 的组合可能导致执行。

### 以 Web 服务器用户身份执行代码
受控的 HTTP 请求执行了 `whoami`,并且浏览器显示了有效的进程用户。

### 一次性 TCP 回调
在交互式测试之前,使用了一个更安全的单消息回调,以确认目标环境到 Windows 主机在 TCP 端口 4444 上的出站连接。

### Reverse shell 会话
交互式会话确认了作为 `www-data` 执行、操作系统为 Linux,以及位于 Joomla SP Page Builder 媒体路径下的工作目录。

### 失败的 root 访问尝试
访问 `/root` 和使用 `su -` 进行身份验证的尝试均失败了。截图已脱敏,以避免发布测试密码。

## 重构的事件时间线
完整的时间线可在两份 PDF 报告中找到。最重要的事件如下:
| UTC | 事件 |
|---|---|
| 19:33:56 | Linux audit、tcpdump、Docker 事件和文件变更轮询启动 |
| 19:34:23 | 一系列向 `/index.php?option=com_sppagebuilder&task=asset.uploadCustomIcon` 发送的 POST 请求 |
| 19:34:23.291 | GET 请求访问一个带有受控算术命令的上传 `.PHP` 文件 |
| 19:34:23.329 | GET 请求访问一个带有受控算术命令的上传 `.pHp` 文件 |
| 19:34:23.361 | GET 请求访问一个带有受控算术命令的上传 `.Php` 文件 |
| 19:34:23.398 | GET 请求访问最终的 `.PHP` artifact,带有受控算术命令 |
| 19:34:23.411 | 公开 PoC 通过上传的 PHP artifact 执行 `id` 并收到 HTTP 200 |
| 19:35:05 | 手动 `whoami` 请求返回 `www-data` |
| 19:35:27 | 到 `172.20.10.2:4444` 的一次性 TCP 回调成功 |
| 19:35:59 | HTTP 请求发起到 `172.20.10.2:4444` 的反向 TCP 连接 |
| 19:36:22-19:36:31 | `whoami`、`uname`、`id` 和 `pwd` 确认了执行上下文 |
| 19:37:13 | `cd root` 返回 `Permission denied` |
| 19:37:21-19:37:28 | `su -` 尝试失败,显示 `Authentication failure` |
| 19:39:25 | 审计收集停止,artifact 已打包 |
## 证据收集方法
### Linux 与 Docker
受害者主机收集了:
- 针对 `execve` 的 `auditd` 事件;
- 使用 `tcpdump` 的数据包捕获;
- Docker 容器元数据、日志、事件、进程列表和文件系统差异;
- 来自容器内部的定期文件变更轮询;
- Joomla webroot、临时目录和相关媒体路径的文件列表;
- 测试前后选定的容器状态。
测试还发现了一个监控限制:由于 `/var/www/html` 由 Docker volume 支撑,`docker diff` 没有显示 `/var/www/html/media/com_sppagebuilder/assets/iconfont/` 下详细的文件创建情况。因此,文件完整性监控应覆盖支撑该 volume 的实际主机路径。
### Windows
Windows 主机证据被有意限制为与报告相关的截图:
- 公开 PoC 输出;
- `whoami` 的浏览器输出;
- 一次性回调的 Ncat 输出;
- Reverse shell 会话的 Ncat 输出;
- 失败的 `/root` 和 `su -` 尝试,密码已脱敏。
## 最重要的检测机会
### 1. 通过 SP Page Builder 上传
监控 HTTP、反向代理、WAF 或网络遥测,查找以下组合:
```
POST /index.php?option=com_sppagebuilder&task=asset.uploadCustomIcon
User-Agent contains: sppb-rce-poc
Status: 200, 201, or 204
```
在生产环境中,不要仅依赖公开 PoC 的 User-Agent。endpoint 和意外的上传模式比 User-Agent 值是更稳定的指标。
### 2. SP Page Builder 图标路径下的可执行文件或 `.htaccess`
监控文件遥测以发现匹配以下内容的新文件或修改过的文件:
```
/media/com_sppagebuilder/assets/iconfont/*/fonts/*.php
/media/com_sppagebuilder/assets/iconfont/*/fonts/*.PHP
/media/com_sppagebuilder/assets/iconfont/*/fonts/*.pHp
/media/com_sppagebuilder/assets/iconfont/*/fonts/*.Php
/media/com_sppagebuilder/assets/iconfont/*/fonts/.htaccess
```
在媒体上传目录中存在包含 `AddType application/x-httpd-php .PHP` 的 `.htaccess` 是一个高价值指标。
### 3. 带有命令参数的对上传 PHP 文件的 GET 请求
将上传活动与随后的 HTTP 请求关联至以下路径:
```
/media/com_sppagebuilder/assets/iconfont/*/fonts/*
```
当请求针对类 PHP 扩展名并包含诸如 `t=` 和 `c=` 的参数时,置信度更高。
### 4. 来自 Web 服务账户的 Shell 或解释器活动
高价值进程指标包括:
```
user: www-data, apache, or nginx
process: bash, sh, dash, or php
command line contains: /dev/tcp, bash -i, redirection operators, or unusual interpreter execution
```
### 5. 来自 Web 容器的出站连接
当由 web 服务器进程启动的 shell 或解释器发起连接到工作站或不寻常目标端口的出站连接时,应触发告警。实验室事件使用了 TCP 端口 4444,但生产环境的检测不应依赖于单一端口。
### 6. Web 执行后失败的提权尝试
测试产生了一次失败的 `su -` 尝试。监控诸如 `unix_chkpwd` 的身份验证助手、对 `/var/log/btmp` 的写入操作,以及在 web 服务账户被攻陷后的交互式命令。
## SOC 分诊指导
当检测到 HTTP 上传指标时,SOC 应立即将其与以下内容相关联:
- 源 IP、user agent 和 HTTP 状态;
- 目标 Joomla 实例是否安装了 SP Page Builder 以及版本是否易受攻击;
- `/media/com_sppagebuilder/assets/iconfont/` 下的新目录;
- Joomla 媒体目录下类 PHP 的新文件或 `.htaccess` 文件;
- 上传后不久对新创建文件的 HTTP GET 请求;
- 诸如 `t=` 和 `c=` 之类的类命令查询参数;
- web 服务器用户创建的进程,尤其是 shell 或解释器进程;
- 来自 web 容器或 web 服务账户的出站连接;
- 诸如 `whoami`、`id`、`uname`、`hostname`、`pwd`、`ip`、`ifconfig`、`netstat` 或 `ss` 的发现命令;
- 初始执行后的身份验证失败、凭据访问尝试、持久化或横向移动。
单一的上传事件本身并不总是足够的。最强的告警是在同一短时间窗口内结合了上传、文件创建、文件访问、进程执行和出站网络遥测。
## 推荐的缓解措施
1. 将 SP Page Builder 更新至 6.6.2 或更高版本。
2. 检查 `/media/com_sppagebuilder/assets/iconfont/` 和更广泛的 Joomla 媒体目录中是否存在类 PHP 文件和 `.htaccess` artifacts。
3. 从上传目录中删除任何意外的 PHP、`.htaccess`、`.phtml`、`.phar`、压缩包或可执行 artifacts。
4. 在 Apache、Nginx 和 PHP-FPM 层禁用上传和媒体目录中的 PHP 执行。
5. 限制或告警来自不受信任的网络对 `asset.uploadCustomIcon` endpoint 的访问。
6. 监控 Web 服务子进程以及来自 web 容器的出站连接。
7. 为包含应用 webroot 的 Docker volume 部署 FIM、eBPF、auditd 或 EDR 覆盖。
8. 当应用数据存储在 Docker volume 或 bind mount 中时,不要仅依赖 `docker diff` 进行 webroot 监控。
## 范围与限制
- 验证是针对一个安装了 SP Page Builder 的 Joomla 5 Docker 实例进行的。
- 观察到的影响是作为 web 服务器进程用户 `www-data` 的代码执行;未确认提权至 root。
- 结果确认了测试路径和配置。它并不证明每个部署、反向代理、web 服务器、PHP handler 或操作系统的行为都是相同的。
- 本仓库不分发攻击性漏洞利用代码、payload 源码、原始 PCAP 文件、原始 Docker 证据包和 DOCX 源文件。
- 报告包含精选的证据摘录,而不是完整的原始日志,以保持材料的可读性并专注于检测。
## 参考
- [N - CVE-2026-48908](https://nvd.nist.gov/vuln/detail/CVE-2026-48908)
- [CVE.org - CVE-2026-48908](https://www.cve.org/CVERecord?id=CVE-2026-48908)
- [CISA 已知被利用漏洞目录](https://www.cisa.gov/known-exploited-vulnerabilities-catalog)
- [作为初始验证参考的公开项目](https://github.com/papageo75/CVE-2026-48908-PoC)
- [JoomShaper SP Page Builder](https://www.joomshaper.com/page-builder)
## 负责任使用声明
本材料仅供防御性安全研究、漏洞管理、检测工程、事件响应准备和授权测试使用。未经明确许可,请勿将其用于针对任何系统。
标签:CISA项目, Joomla, Maven, 安全报告, 漏洞验证, 请求拦截