0x00 前言▸
LightCMS是一款基于Laravel框架的CMS,但前台没什么东西,主要作为一个后台管理系统。这个CMS我在春节期间就挖过了,但是因为全部都是一些数据库操作,最终放弃了。今天在伟大的郭院士的指导下,终于调出了这个郭院士挖到的0day。
0x01 文件上传▸
这个0day是一个Phar反序列化打Laravel RCE的洞,因此需要能够将phar文件上传,在后台的内容管理中不难发现图像上传位点
查看其HTML源代码,js Event 提交图片到一个上传接口
跟进其模板中来看一下 resources/views/admin/content/add.blade.php
上传接口是渲染的一个Laravel的路由,来看一下这个路由,使用了NEditorController
这个控制器
跟到控制器,uploadImage
方法处理图像上传,没啥可以利用的 app/Http/Controllers/Admin/NEditorControllers.php
0x02 继续深入▸
尽管这个上传没找到什么有价值的东西,我们可以在这个控制器下找到另一个比较有趣的方法
catchImage()
方法接收file参数并传入fetchImageFile()
,跟进
在fetchImageFile()
中,它会curl访问这个url并将读取到的内容传入Image::make()
中 通过debug的不断跟进,最终来到了这个init()
,然后传入decoder->init()
vendor/intervention/image/src/intervention/Image/AbstractDriver.php
而接下来的这个init()
则是一个switch case,根据传入内容的类型返回不同的东西
注意我们现在传入init()
中的$data
是提交的一个url的curl读取结果,而case $this->isUrl()
看上去很有趣,因为url的内容似乎还可以是url。那么不妨我们就直接将url的内容设置为一个新的url并传入,来看看initFormUrl()
到底做了什么。 这里它继续读取了这个url的内容,然后作为binary数据处理
然后我们来看看这个case
的判断函数isUrl
做了什么
public function isUrl() |
这个方法只是利用FILTER VAR判断是否为url,这意味着前面的http协议可以替换成其他协议,比如phar协议。 于是我们将url内容改成一个phar,再次下断点,果然依旧进到了这里并且传给了file_get_contents()
然后就会触发phar反序列化了。
0x03 利用▸
首先去网上找一个现成的Laravel RCE的gadget,生成phar文件 然后来到内容管理-新增文章内容,上传文件,就会得到一个这样的图片url:
http://127.0.0.1:12334/upload/image/202105/cbf1k61csMcM1pAheP34DxrcUIjDS1kF5bPaCYnC.gif
然后来到我们自己的vps,新建一个txt,内容为:
phar://./upload/image/202105/cbf1k61csMcM1pAheP34DxrcUIjDS1kF5bPaCYnC.gif |
然后POST提交到这个路由即可触发phar反序列化
0x04 后记▸
这个洞还是比较容易被忽视的,虽然利用起来并不复杂,但是触发思路比较新颖,不容易被发现。只能说郭院士太强了。