Ghost博客曝出中危漏洞,OSCS开源社区建议开发者进行修复

209 阅读2分钟

OSCS (开源软件供应链安全社区) 致力于让每一个开源项目变的更安全,也帮助每一个开发者更安全的使用开源代码。

漏洞简述

Ghost 是以 Node.js 语言开发的一款开源博客程序,在 Github 上拥有超过4万的 star。

6月15日,Ghost 官方修复了一个 RCE 漏洞。由于 Ghost 调用的 moment.js 库存在已知漏洞(CVE-2022-24785),导致攻击者可以通过帖子编辑器中的文件上传功能上传恶意文件,进而执行任意代码。

漏洞分析

漏洞因为需要后台权限,有一定利用条件,有趣的点在于 Ghost 的 RCE 漏洞是由于moment.js下的路径遍历和文件包含漏洞,再加上 Ghost 中的文件上传和指定 locale 功能。moment.js中存在的文件包含漏洞,在一般情况下可能影响较小,但结合某些功能设计或其他漏洞使得参数和内容可控,从而造成了 RCE 漏洞的产生。

Moment CVE-2022-24785 漏洞

moment.js 是一个用于解析、校验、操作、显示日期和时间的 JavaScript 工具库,在 GitHub上拥有超过4万的 star。4月4日公开了一个moment.js的路径遍历漏洞和潜在的文件包含漏洞。漏洞触发点在lib/locale/locales.js文件的 loadLocale 方法中

aliasedRequire = require;
aliasedRequire('./locale/' + name);

Ghost 路径穿越

在 Ghost 中造成执行命令的漏洞缺陷点是 core/frontend/helpers/date.jslocale参数,漏洞触发点位于登录后台配置中的可自定义参数 locale。

在后台(settings>General>Publication Language)可以看到默认为 en。功能上对应的是为了支持多语言环境,预置了相应的语言配置文件,进行动态加载。

image.png

对应core/frontend/services/theme-engine/i18n/i18n.jslocale参数。

constructor(options = {}) {
this._basePath = options.basePath || __dirname;
this._locale = options.locale || this.defaultLocale();
this._stringMode = options.stringMode || 'dot';
 
this._strings = null;
}
......
defaultLocale() {
return 'en';
}

date.js中会接收前端发送的 locale 参数,通过 moment 中的方法进行解析。

image.png

可以发现 locale 参数没有经过过滤直接拼接,因此如果能够指向一个攻击者可控的地址,则可以执行任意 js 代码。

Ghost 文件上传

文章编辑器默认支持文件上传,并会按照原文件名上传到特定的本地目录,因此攻击者可以上传恶意的js(如evil.js),而后在locale参数填写控制加载对应路径。

 image.png

漏洞验证

前提:经过 Ghost 身份验证的用户

  1. docker 启动 Ghost

  2. 访问页面 http://localhost:3001/ghost 进行管理员配置

image.png

  1. 上传恶意 js 文件,并记录文件路径

image.png

  1. 在 settings>General>Publication Language 处输入刚刚获得的路径,如../../../content/files/2022/06/abc

image.png

  1. 刷新前端页面,可以发现恶意 js 文件被执行

参考链接

  1. github.com/TryGhost/Gh…

  2. github.com/TryGhost/Gh…

  3. github.com/TryGhost/Gh…

使用墨菲安全的 IDE 插件帮您快速检测代码安全

在 Jetbrains IDE 插件市场搜索 murphysec 安装检测插件,一键检测一键修复。

图片

了解更多

基于现行的法律法规约束下,OSCS (开源软件供应链安全社区)社区会第一时间发布开源项目最新的安全风险动态,包括开源组件安全漏洞、事件等信息。社区用户可通过邮件、企微、钉钉、飞书等订阅情报信息,如果您是开源项目作者也可加入 OSCS 社区守护计划。