Roundcube Webmail(CVE-2025-49113)认证后php反序列化rce复现新视角
字数 1479 2025-08-30 06:50:11
Roundcube Webmail (CVE-2025-49113) PHP反序列化RCE漏洞分析与复现
漏洞概述
Roundcube Webmail是一款广泛使用的开源Web邮件客户端。在1.5.9版本中,存在一个认证后的PHP反序列化远程代码执行漏洞(CVE-2025-49113)。该漏洞允许经过身份验证的攻击者通过精心构造的请求实现远程代码执行。
漏洞分析
漏洞位置
漏洞主要存在于program/actions/settings/upload.php文件中,涉及对type参数的处理不当以及会话数据的反序列化操作。
关键代码分析
- 参数处理逻辑:
$from = rcube_utils::get_input_value('_from', rcube_utils::INPUT_GET);
$type = preg_replace('/^(add-|edit-)/', '', $from);
$type = str_replace('.', '-', $type);
rcube_utils::get_input_value方法用于获取GET、POST或COOKIE参数,_from参数经过处理后赋值给$type变量。
- 会话数据操作:
$rcmail->config->get($type . '_image_size');
$rcmail->session->append('response', $type, $filename);
$rcmail->session->append方法将数据添加到会话中,这是漏洞触发的关键点。
- 自定义反序列化方法:
Roundcube使用自定义的unserialize函数处理会话数据,该函数将自定义格式转换为PHP可识别的序列化格式,最终调用原生unserialize()函数。
反序列化机制
- 自定义反序列化函数解析以
|分隔的键值对 - 值的格式支持多种类型:
s:3:"abc";(字符串)i:123;(整数)N;(null)a:2:{...}(数组)o:8:"stdClass":...(对象)
- 特殊处理:键名前有
!时会将值设为N;(null)
漏洞利用
利用链构造
-
反序列化入口点:
在program/lib/Roundcube/rcube_user.php中,直接从会话数组获取preferences键值并进行反序列化。 -
恶意类选择:
使用./vendor/pear/crypt_gpg/Crypt/GPG/Engine.php中的Crypt_GPG_Engine类,其__closeIdleAgents方法可用于命令拼接和执行。
利用步骤
- 通过上传功能控制会话数据
- 构造恶意反序列化数据注入到
preferences键 - 触发反序列化操作执行任意命令
Payload构造
- 控制
_from参数传入Crypt_GPG_Engine类 - 控制文件名参数传入
preferences键 - 示例Payload:
_from=edit-!";identity
经过Roundcube自定义反序列化处理后,会生成有效的PHP序列化数据。
空字节绕过
由于私有变量包含空字节,而Roundcube存在WAF,可以使用PHPGGC的process_serialized函数进行绕过。
环境搭建与复现
环境准备
- 安装Roundcube 1.5.9版本
- 配置数据库存储会话(默认使用MySQL)
复现步骤
- 以合法用户身份登录
- 访问上传功能页面
- 使用Burp Suite拦截上传请求
- 修改
_from和文件名参数注入恶意Payload - 观察数据库中的会话数据变化
- 触发反序列化操作执行命令
漏洞修复
- 升级到最新版本
- 对用户输入进行严格过滤
- 避免直接反序列化不可信数据
总结
该漏洞展示了认证后反序列化漏洞的利用方式,涉及:
- 自定义反序列化函数的处理
- 会话数据注入
- 恶意类的利用
- 特殊字符处理技巧
通过深入分析此漏洞,可以更好地理解PHP反序列化漏洞的利用原理和防御方法。
参考链接
- https://fearsoff.org/research/roundcube
- Roundcube官方安全公告