零基础学黑客,搜索公众号:白帽子左一
DolphinPHP
1.简介
DolphinPHP(海豚PHP)是一个基于ThinkPHP5.1.41LTS开发的一套开源PHP快速开发框架,DolphinPHP秉承极简、极速、极致的开发理念,为开发集成了基于数据-角色的权限管理机制,集成多种灵活快速构建工具,可方便快速扩展的模块、插件、钩子、数据包。
统一了模块、插件、钩子、数据包之间的版本和依赖关系,进一步降低了代码和数据的冗余,以方便开发者快速构建自己的应用。
官网地址下载:http://www.dolphinphp.com/
2.搭建
第一步:下载完成后,直接解压缩到服务器内
第二步:访问网站,勾选已阅读,并点下一步。
第三步:下拉网页,继续下一步。
第四步:输入好配置之后,再点下一步。
第五步:安装成功
3.代码分析
在源码,application文件夹下的common.php的action_log函数,有一处call_user_func
其中,参数可控分别为 p a r a m [ 1 ] 和 param[1]和 param[1]和log[$param[0]]
首先 p a r a m 为 param为 param为value以|为间隔分开的值
而 v a l u e 实 际 上 就 是 value实际上就是 value实际上就是match[1]的遍历
m a t c h 是 通 过 正 则 匹 配 , match是通过正则匹配, match是通过正则匹配,action_info[‘log’]得到,这个正则就是匹配中括号内的值,最终的$action_info是数据库查询得来。
在这个$action_info的查询中
对应的日志模型
对应的数据,可以发现,所以这里的查询操作就是通过module和name为条件查询dp_admin_action这一表,然后用log数据去正则匹配。
$action_info = model('admin/action')->where('module', $module)->getByName($action);
然而,这里的log内的值是可以控制的,也就表示call_user_func的第一个参数$param[1]可控
call_user_func的另外一个参数 l o g [ log[ log[param[0]],需要从 l o g 中 寻 找 可 控 的 v a l u e , 这 里 目 前 可 能 可 以 控 制 的 就 是 log中寻找可控的value,这里目前可能可以控制的就是 log中寻找可控的value,这里目前可能可以控制的就是model或$details。
在Attachment.php文件中的delete的函数中,存在有调用action_log并且 m o d e l 或 model或 model或details可控的地方。
可以发现,此处的$ids完全可控,但是有一处if判断。
可以看出,这里的判断应该就是删除附件的内容,所以这里只需要到时候删除附件就可以满足此条件。
这里的$ids对应call_user_func的第二个参数,假设传入calc,这个where(‘id’, ‘in’, $ids)->delete()会找不到文件删
所以每访问一次就需要删一个已存在的附件
经不断测试,这里可是使用数组的形式如 i d s [ ] = c a l c ids[]=calc%26& ids[]=calcids[]=2这样,能正常找到id=2的图片,其中%26是&。经过
$ids = is_array($ids) ? implode(',', $ids) : $ids;
就变成了
calc&,9
所以参数全部可控。
4.漏洞利用
在:系统->行为管理->删除附件->编辑处
将所属模块改为系统,并且将日志规则改为[details|system] test ([details])
这里我们可以点击删除按钮的时候,并且构造参数:ids[]=calc%26&ids[]=2
最终导致RCE成功利用。