DolphinPHP
DolphinPHP(海豚PHP)是一个基于ThinkPHP5.1.41LTS开发的一套开源PHP快速开发框架,DolphinPHP秉承极简、极速、极致的开发理念,为开发集成了基于数据-角色的权限管理机制,集成多种灵活快速构建工具,可方便快速扩展的模块、插件、钩子、数据包。统一了模块、插件、钩子、数据包之间的版本和依赖关系,进一步降低了代码和数据的冗余,以方便开发者快速构建自己的应用。
漏洞分析
看到application\common.php#action_log函数
![](https://img.haomeiwen.com/i26545687/40a5b2bc84c92595.png)
观察到有一处call_user_func,向上回溯一下两个参数看是否可控
分别为log[$param[0]]
【查看相关资料】
1、网络安全学习路线
2、电子书籍(白帽子)
3、安全大厂内部视频
4、100份src文档
5、常见安全面试题
6、ctf大赛经典题目解析
7、全套工具包
8、应急响应笔记
首先value以|为间隔分开的值,而
match[1]的遍历,
action_info['log']得到,这个正则就是匹配中括号内的值,最终的$action_info是数据库查询得来,如下图
![](https://img.haomeiwen.com/i26545687/1c9789be4e8151b7.png)
先看一下这个查询操作
![](https://img.haomeiwen.com/i26545687/2cd40a063caf33ec.png)
对应的模型为
![](https://img.haomeiwen.com/i26545687/2803a2711d07becb.png)
对应表的内容为
![](https://img.haomeiwen.com/i26545687/aa3b60cb30c4705b.png)
所以这里的查询操作就是通过module和name为条件查询dp_admin_action这一表,然后用log数据去正则匹配
$action_info = model('admin/action')->where('module', $module)->getByName($action);
而这里的log是可以自己修改的
![](https://img.haomeiwen.com/i26545687/4447bff0c8256732.png)
![](https://img.haomeiwen.com/i26545687/c33410149d6c2e51.png)
也就是说现在可以控制log内的值,也就表示call_user_func的第一个参数也可控
至于param[0]],需要从
model或$details
![](https://img.haomeiwen.com/i26545687/c859731706aba3f8.png)
所以需要找调用action_log并且details可控的地方
这里找了Attachment.php#delete
![](https://img.haomeiwen.com/i26545687/4ef4becc15b0c429.png)
可以看到$ids完全可控,但是有一处if判断
if (AttachmentModel::where('id', 'in', $ids)->delete())
操作肯定就是根据$ids删附件了,所以这里还需要随便上传一个附件让他删,随便传个头像就行了
![](https://img.haomeiwen.com/i26545687/7b6c2edb00163293.png)
![](https://img.haomeiwen.com/i26545687/012e7a597f494bd2.png)
这里的ids)->delete()会找不到文件删,所以每访问一次就需要删一个已存在的附件
经过测试可以用数组的形式,如ids[]=9这样,能正常找到id=9的图片
然后经过
$ids = is_array($ids) ? implode(',', $ids) : $ids;
变成calc&,9
两个参数都可控
漏洞利用
系统->行为管理->删除附件->编辑
![](https://img.haomeiwen.com/i26545687/735edc70d590343e.png)
将所属模块改为系统
![](https://img.haomeiwen.com/i26545687/b028064a4e8a737c.png)
将日志规则改为[details|system] test ([details])
![](https://img.haomeiwen.com/i26545687/da020ba29ff1eae9.png)
然后随便传一张图片看它的id,之前传的图片id是9,所以
![](https://img.haomeiwen.com/i26545687/799256933baaa816.png)
因为这里默认$module是admin,所以上面要把所属模块改为系统
![](https://img.haomeiwen.com/i26545687/e6605a5d3e08b6e3.png)
此时param[1]='system',
param[0]]=$log['details']='calc&,9'
![](https://img.haomeiwen.com/i26545687/9da5bb7292158336.png)
执行calc
![](https://img.haomeiwen.com/i26545687/60bbb8a18b93eb80.png)
最后
这里通过IDE的find usages应该还能找到其他触发action_log的地方,就不往下看了
网友评论