您的位置 首页 php

「web安全」DolphinPHP RCE漏洞分析

DolphinPHP

漏洞分析

看到 application\common.php#action_log 函数

观察到有一处 call_user_func ,向上回溯一下两个参数看是否可控

分别为 $param[1] $log[$param[0]]

【→所有资源关注我,私信回复“资料”获取←】
1、网络安全学习路线
2、电子书籍(白帽子)
3、安全大厂内部视频
4、100份src文档
5、常见安全面试题
6、ctf大赛经典题目解析
7、全套工具包
8、应急响应笔记

首先 $param $value | 为间隔分开的值,而 $value 实际上就是 $match[1] 的遍历, $match 是通过正则匹配 $action_info[‘log’] 得到,这个正则就是匹配中括号内的值,最终的 $action_info 是数据库查询得来,如下图

先看一下这个查询操作

对应的模型为

对应表的内容为

所以这里的查询操作就是通过module和name为条件查询dp_admin_action这一表,然后用log数据去正则匹配

 $action_info = model('admin/action')->where('module', $module)->getByName($action);  

而这里的log是可以自己修改的

也就是说现在可以控制log内的值,也就表示 call_user_func 的第一个参数也可控

至于 $log[$param[0]] ,需要从 $log 中寻找可控的value,这里目前可能可以控制的就是 $model $details

所以需要找调用 action_log 并且 $model $details 可控的地方

这里找了 Attachment.php#delete

可以看到 $ids 完全可控,但是有一处if判断

 if (AttachmentModel::where('id', 'in', $ids)->delete())  

操作肯定就是根据 $ids 删附件了,所以这里还需要随便上传一个附件让他删,随便传个头像就行了

这里的 $ids 对应 call_user_func 的第二个参数,假设传入 calc ,这个 where(‘id’, ‘in’, $ids)->delete() 会找不到文件删,所以每访问一次就需要删一个已存在的附件

经过测试可以用数组的形式,如 $ids[]=calc%26&$ids[]=9 这样,能正常找到 id=9 的图片

然后经过

 $ids = is_array($ids) ? implode(',', $ids) : $ids;
  

变成 calc&,9

两个参数都可控

漏洞利用

系统->行为管理->删除附件->编辑

将所属模块改为系统

将日志规则改为 [details|system] test ([details])

然后随便传一张图片看它的id,之前传的图片id是9,所以

因为这里默认 $module 是admin,所以上面要把所属模块改为系统

此时 $match = ‘details|system’ $param[1]=’system’ $log[$param[0]]=$log[‘details’]=’calc&,9′

执行calc

最后

这里通过IDE的find usages应该还能找到其他触发 action_log 的地方,就不往下看了

文章来源:智云一二三科技

文章标题:「web安全」DolphinPHP RCE漏洞分析

文章地址:https://www.zhihuclub.com/77684.shtml

关于作者: 智云科技

热门文章

网站地图