LightCMS全版本后台RCE 0day分析
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 后记

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

Author: Y1ng
Link: https://www.gem-love.com/2021/05/09/lightcms全版本后台rce-0day分析/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
【腾讯云】热门云产品首单特惠秒杀,2核2G云服务器45元/年    【腾讯云】境外1核2G服务器低至2折,半价续费券限量免费领取!