漏洞影响:V1.5.0
源码下载:https://github.com/caiweiming/DolphinPHP/releases
环境搭建参考文章:https://segmentfault.com/a/1190000021779583
1、漏洞分析
漏洞点
application/common.php中的call_user_func函数
关于call_user_func函数是 PHP 中的一个函数,用于调用回调函数或方法。它允许你在运行时决定要调用哪个函数。
如果call_user_func函数中的参数可控,可导致RCE漏洞。
call_user_func($param[1], $log[$param[0]])
意思:call_user_func
调用一个函数,并使用 $log
变量的某个部分作为参数传递给该函数
继续对call_user_func(log[$param[0]])
中的参数进行分析
分析参数$param
$param = explode('|', $value);
意思:将字符串 $value
使用竖线字符 |
作为分隔符拆分成一个数组,并将结果赋值给 $param
。
查看$value
foreach ($match[1] as $value)
意思:遍历数组$match[1]
中的每一个元素,并将当前元素的值赋给$value
变量
查看$match[1]
if(preg_match_all('/\[(\S+?)\]/', $action_info['log'], $match))
意思:匹配 $action_info['log']
中所有符合正则表达式 '/\[(\S+?)\]/'
的子字符串,并将匹配结果存储在 $match 数组中。
$match[1]
的值为不带方括号的字符串,其值从$action_info['log']
中匹配
对应的模型为
$action_info = model('admin/action')->where('module', $module)->getByName($action)
意思:从数据表admin_action中过滤module 列等于 $module 的记录,通过 name 字段(或其他相关字段)来获取记录。
所以这里以module和name为条件进行查询admin_action表,在以$action_info['log']去匹配
关于call_user_func中调用函数$param[1]总结,只要保证log中有我们想要使用的回调函数,比如system
在系统⏩系统功能⏩行为管理中。log是可以修改的。即log值是可控的,则call_user_func的第一个参数可控。
分析参数
查看$log
基于上述,查找可控的值,model或details
调用函数 action_log,且对model或details可控
查看$details
定位到application/user/admin/Role.php中,details = data['name']
查看$data['name']
2、漏洞复现
1、登录使用admin/admin进行登录
2、针对call_user_func
的第一个参数可控,即$param可控
在功能点 :系统--系统功能--行为管理中。编辑角色role_edit字段
在日志规则处进行编辑
[details|system] test ([details])
3、针对call_user_func的第二个参数可控,即param[0]]可控。
在功能点在:用户->权限管理->角色管理。
编辑该角色,并使用burp抓包,将name参数的值修改为系统命令。
参考文章
https://xz.aliyun.com/t/14379
https://mp.weixin.qq.com/s/-wbnz7HvXrvZWDv480juQQ
标签:审计,log,DolphinPHP,白盒,param,call,user,func,action From: https://www.cnblogs.com/o-O-oO/p/18533708原创 LULU 红队蓝军