【web安全】DolphinPHP RCE漏洞分析

  • Post author:
  • Post category:php




DolphinPHP

DolphinPHP(海豚PHP)是一个基于ThinkPHP5.1.41LTS开发的一套开源PHP快速开发框架,DolphinPHP秉承极简、极速、极致的开发理念,为开发集成了基于数据-角色的权限管理机制,集成多种灵活快速构建工具,可方便快速扩展的模块、插件、钩子、数据包。统一了模块、插件、钩子、数据包之间的版本和依赖关系,进一步降低了代码和数据的冗余,以方便开发者快速构建自己的应用。



漏洞分析

看到application\common.php#action_log函数



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

分别为



p

a

r

a

m

[

1

]

param[1]和






p


a


r


a


m


[


1


]








log[$param[0]]



【查看相关资料】



1、网络安全学习路线

2、电子书籍(白帽子)

3、安全大厂内部视频

4、100份src文档

5、常见安全面试题

6、ctf大赛经典题目解析

7、全套工具包

8、应急响应笔记

首先



p

a

r

a

m

param为






p


a


r


a


m








value以|为间隔分开的值,而



v

a

l

u

e

value实际上就是






v


a


l


u


e




















match[1]的遍历,



m

a

t

c

h

match是通过正则匹配






m


a


t


c


h


























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的第一个参数也可控

至于



l

o

g

[

log[






l


o


g


[





param[0]],需要从



l

o

g

v

a

l

u

e

log中寻找可控的value,这里目前可能可以控制的就是






l


o


g




















v


a


l


u


e















































model或$details



所以需要找调用action_log并且



m

o

d

e

l

model或






m


o


d


e


l








details可控的地方

这里找了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&






i


d


s


[


]




=








c


a


l


c





ids[]=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’,






m


a


t


c


h





=




























d


e


t


a


i


l


s





s


y


s


t


e



m




























param[1]=‘system’,



l

o

g

[

log[






l


o


g


[





param[0]]=$log[‘details’]=‘calc&,9’



执行calc





最后

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



版权声明:本文为HBohan原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。