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);

漏洞原理

  1. 回调函数调用

    • call_user_func()函数用于调用回调函数,当参数可控时可导致代码执行
    • 示例:call_user_func('system', 'whoami'); 可执行系统命令
  2. 参数来源分析

    • 第一个参数$callback来自$param[1]
    • $param = explode('|', $value);$value|分割为数组
    • $value来自$match[1],通过正则`/

\[(\S+?) \]

/$action_info['log']`中提取方括号内的内容

  1. 数据库关联

    • $action_info来自admin_action表,查询条件为module=$modulename=$action
    • log字段存储行为日志规则,可通过后台修改
  2. 第二个参数来源

    • $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

复现过程

  1. 登录后台

    • 访问后台登录页面
    • 使用默认凭证admin/admin登录
  2. 修改行为日志规则

    • 导航至:系统->系统功能->行为管理
    • 搜索role_edit行为
    • 点击编辑,修改"日志规则"为:[details|system]
      • details:指定从$log数组中取值的键
      • system:将作为call_user_func的第一个参数
  3. 触发漏洞

    • 导航至:用户->权限管理->角色管理
    • 创建一个新角色(如未存在)
    • 编辑该角色,同时抓取请求数据包
    • 修改POST请求中的name参数值为要执行的系统命令,如:
      POST /admin/role/edit
      ...
      name=whoami
      
  4. 验证执行

    • 命令执行结果将显示在响应中或系统日志中

0x03 漏洞修复

官方在V1.5.1版本中修复了此漏洞,建议升级到最新版本。临时修复方案包括:

  1. 限制后台行为管理功能的访问权限
  2. $action_info['log']内容进行严格过滤
  3. 避免在日志规则中使用用户可控的敏感函数

0x04 技术总结

该漏洞的核心在于:

  1. 后台允许用户自定义日志规则中的回调函数
  2. 前台用户可控制回调函数的参数
  3. 未对回调函数和参数进行安全过滤

攻击链:

后台设置恶意日志规则 -> 前台触发行为日志记录 -> 执行任意代码

0x05 参考链接

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() 函数用于调用回调函数,当参数可控时可导致代码执行 示例: 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=$action log 字段存储行为日志规则,可通过后台修改 第二个参数来源 : $log[$param[0]] 从 $log 数组中取值 $log 数组包含用户可控的 $details 参数 $details 通常来自POST请求中的 name 参数 关键代码流程 0x02 漏洞复现步骤 环境准备 DolphinPHP V1.5.0 默认后台账号密码:admin/admin 复现过程 登录后台 访问后台登录页面 使用默认凭证admin/admin登录 修改行为日志规则 导航至:系统->系统功能->行为管理 搜索 role_edit 行为 点击编辑,修改"日志规则"为: [details|system] details :指定从 $log 数组中取值的键 system :将作为 call_user_func 的第一个参数 触发漏洞 导航至:用户->权限管理->角色管理 创建一个新角色(如未存在) 编辑该角色,同时抓取请求数据包 修改POST请求中的 name 参数值为要执行的系统命令,如: 验证执行 命令执行结果将显示在响应中或系统日志中 0x03 漏洞修复 官方在V1.5.1版本中修复了此漏洞,建议升级到最新版本。临时修复方案包括: 限制后台行为管理功能的访问权限 对 $action_info['log'] 内容进行严格过滤 避免在日志规则中使用用户可控的敏感函数 0x04 技术总结 该漏洞的核心在于: 后台允许用户自定义日志规则中的回调函数 前台用户可控制回调函数的参数 未对回调函数和参数进行安全过滤 攻击链: 0x05 参考链接 原始漏洞分析文章 官方修复版本:DolphinPHP V1.5.1