0
点赞
收藏
分享

微信扫一扫

【web安全】DolphinPHP RCE漏洞分析

DolphinPHP

漏洞分析

看到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是数据库查询得来,如下图

先看一下这个查询操作

对应的模型为

对应表的内容为

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

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

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

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

至于 l o g [ log[ log[param[0]],需要从 l o g 中 寻 找 可 控 的 v a l u e , 这 里 目 前 可 能 可 以 控 制 的 就 是 log中寻找可控的value,这里目前可能可以控制的就是 logvaluemodel或$details

所以需要找调用action_log并且 m o d e l 或 model或 modeldetails可控的地方

这里找了Attachment.php#delete

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

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

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

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

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

然后经过

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

变成calc&,9

两个参数都可控

漏洞利用

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

将所属模块改为系统

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

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

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

此时 m a t c h = ′ d e t a i l s ∣ s y s t e m ′ , match = 'details|system', match=detailssystemparam[1]=‘system’, l o g [ log[ log[param[0]]=$log[‘details’]=‘calc&,9’

执行calc

最后

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

举报

相关推荐

0 条评论