Joomla 3.4.6 RCE 分析
字数 1400 2025-08-26 22:11:22
Joomla 3.4.6 远程代码执行漏洞分析与利用
漏洞概述
- 影响版本: Joomla 3.0.0 至 3.4.6
- PHP版本限制: 不支持PHP 7.0 (Joomla 3.4及之前版本)
- 漏洞类型: Session反序列化导致的远程代码执行
- 漏洞成因: 对session处理不当,可伪造session导致反序列化漏洞
漏洞分析
Session处理机制问题
Joomla的session处理存在以下关键问题:
- Session存储方式:未经验证的用户名和密码存储在
_session表中 - 登录流程:登录过程中存在303跳转,先执行write函数再执行read函数
- 特殊字符替换:
- 写入时将
\x00*\x00替换为\0\0\0(MySQL不能存储NULL) - 读取时将
\0\0\0替换回\x00*\x00
- 写入时将
替换机制导致的溢出漏洞
关键替换行为:
- 3字节的
\0\0\0被替换为6字节的\x00*\x00 - 当提交的用户名为
per\0\0\0i0d时:- 读取后变为
s:8:s:"username";s:12:"perNNNi0d"(N代表NULL) - 声明长度为12字节但实际只有9字节,导致无效对象
- 读取后变为
利用原理
-
Session逃逸:
- 使用
\0\0\0溢出逃逸密码value - 重新构建有效对象
- 密码字段内容逃逸出来直接进行反序列化
- 使用
-
EXP构造示例:
- 数据库存储:
s:8:s:"username";s:54:"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";s:8:"password";s:6:"123456" - 读取替换后:
s:8:s:"username";s:54:"NNNNNNNNNNNNNNNNNNNNNNNNNNN";s:8:"password";s:6:"123456" - 实现对象注入:
s:8:s:"username";s:54:"NNNNNNNNNNNNNNNNNNNNNNNNNNN";s:8:"password";s:6:"1234";s:2:"HS":O:15:"ObjectInjection"
- 数据库存储:
POP链构造
第一段利用链
位于libraries/joomla/database/driver/mysqli.php:
public function __destruct() {
$this->disconnect();
}
public function disconnect() {
if ($this->connection) {
foreach ($this->disconnectHandlers as $h) {
call_user_func_array($h, array(&$this));
}
mysqli_close($this->connection);
}
$this->connection = null;
}
- 触发条件:
$this->connection为true - 利用方式:通过
disconnectHandlers数组执行任意函数
第二段利用链
位于libraries/simplepie/simplepie.php:
- 触发条件:
$this->cache必须为true$parsed_feed_url['scheme']不为空
- 优势:函数和参数值都可控
漏洞验证
成功利用后,返回页面中会出现字符串zopatkgieeqqmifstiih作为判断依据。
漏洞修复方案
- 对session信息进行base64或其他编码处理
- 升级到修复版本
参考资源
总结
该漏洞利用Joomla对session处理的缺陷,通过精心构造的序列化数据实现对象注入,最终导致远程代码执行。理解此漏洞需要对PHP序列化机制、Joomla框架的session处理流程以及POP链构造有深入认识。