DolphinPHP_V1.5.0 RCE漏洞分析与复现
字数 1272 2025-08-23 18:31:34
DolphinPHP V1.5.0 RCE漏洞分析与复现教学文档
0x00 漏洞概述
DolphinPHP(海豚PHP)是基于ThinkPHP5.1.41 LTS开发的开源PHP快速开发框架。在V1.5.0版本中存在一个远程代码执行(RCE)漏洞,该漏洞源于行为日志功能中的不安全回调函数调用,攻击者可通过精心构造的请求实现任意代码执行。
0x01 漏洞分析
漏洞位置
漏洞触发点位于application/common.php文件的1086行:
call_user_func($callback, ...$parameters);
漏洞原理
-
回调函数调用:
call_user_func()函数用于调用回调函数,当参数可控时可导致代码执行- 示例:
call_user_func('system', 'whoami');可执行系统命令
-
参数来源分析:
- 第一个参数
$callback来自$param[1] $param = explode('|', $value);将$value按|分割为数组$value来自$match[1],通过正则`/
- 第一个参数
\[(\S+?) \]
/从$action_info['log']`中提取方括号内的内容
-
数据库关联:
$action_info来自admin_action表,查询条件为module=$module且name=$actionlog字段存储行为日志规则,可通过后台修改
-
第二个参数来源:
$log[$param[0]]从$log数组中取值$log数组包含用户可控的$details参数$details通常来自POST请求中的name参数
关键代码流程
// 从行为日志中提取方括号内容
if(preg_match_all('/
$$
(\S+?)
$$
/', $action_info['log'], $match)){
foreach($match[1] as $value){
$param = explode('|', $value);
$callback = $param[1]; // 第一个参数
$parameter = $log[$param[0]]; // 第二个参数
call_user_func($callback, $parameter);
}
}
0x02 漏洞复现步骤
环境准备
- DolphinPHP V1.5.0
- 默认后台账号密码:admin/admin
复现过程
-
登录后台
- 访问后台登录页面
- 使用默认凭证admin/admin登录
-
修改行为日志规则
- 导航至:系统->系统功能->行为管理
- 搜索
role_edit行为 - 点击编辑,修改"日志规则"为:
[details|system]details:指定从$log数组中取值的键system:将作为call_user_func的第一个参数
-
触发漏洞
- 导航至:用户->权限管理->角色管理
- 创建一个新角色(如未存在)
- 编辑该角色,同时抓取请求数据包
- 修改POST请求中的
name参数值为要执行的系统命令,如:POST /admin/role/edit ... name=whoami
-
验证执行
- 命令执行结果将显示在响应中或系统日志中
0x03 漏洞修复
官方在V1.5.1版本中修复了此漏洞,建议升级到最新版本。临时修复方案包括:
- 限制后台行为管理功能的访问权限
- 对
$action_info['log']内容进行严格过滤 - 避免在日志规则中使用用户可控的敏感函数
0x04 技术总结
该漏洞的核心在于:
- 后台允许用户自定义日志规则中的回调函数
- 前台用户可控制回调函数的参数
- 未对回调函数和参数进行安全过滤
攻击链:
后台设置恶意日志规则 -> 前台触发行为日志记录 -> 执行任意代码
0x05 参考链接
- 原始漏洞分析文章
- 官方修复版本:DolphinPHP V1.5.1