以DolphinPHP为例的白盒审计分析

零基础学黑客,搜索公众号:白帽子左一

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为 paramvalue以|为间隔分开的值

v a l u e 实 际 上 就 是 value实际上就是 valuematch[1]的遍历

m a t c h 是 通 过 正 则 匹 配 , match是通过正则匹配, matchaction_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,这里目前可能可以控制的就是 logvaluemodel或$details。

图片

在Attachment.php文件中的delete的函数中,存在有调用action_log并且 m o d e l 或 model或 modeldetails可控的地方。

图片

可以发现,此处的$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成功利用。

图片
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值