LightCMS全版本后台RCE 0day分析 1 min read
本文最后更新于 209 天前,其中的信息可能已经有所发展或是发生改变。

Author:颖奇L’Amore

Blog:www.gem-love.com


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()
    {
        return (bool) filter_var($this->data, FILTER_VALIDATE_URL);
    }

这个方法只是利用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 后记

这个洞还是比较容易被忽视的,虽然利用起来并不复杂,但是触发思路比较新颖,不容易被发现。只能说郭院士太强了。

颖奇L'Amore原创文章,转载请注明作者和文章链接

本文链接地址:https://www.gem-love.com/websecurity/2763.html

注:本站定期更新图片链接,转载后务必将图片本地化,否则图片会无法显示

评论

  1. F

    师傅,太厉害了!!!

    5月前
    2021-6-25 22:12:53

发送评论 编辑评论

上一篇