CVE-2021-40097 concrete cms rce
字数 1518 2025-08-29 08:32:24
Concrete CMS 路径遍历导致远程代码执行漏洞分析 (CVE-2021-40097)
漏洞概述
CVE-2021-40097 是 Concrete CMS 中存在的一个认证后的路径遍历漏洞,最终导致远程代码执行。该漏洞允许经过认证的攻击者通过路径遍历技术包含任意文件,当包含恶意构造的 PHP 文件时,可实现远程代码执行。
漏洞原理
漏洞的核心在于 Concrete CMS 在处理布局设计时,未能正确过滤 bFilename 参数,导致攻击者可以通过路径遍历 (../../) 技术包含系统上的任意文件。结合上传功能,攻击者可上传包含恶意代码的文件,然后通过路径遍历包含该文件,从而实现远程代码执行。
漏洞复现步骤
1. 前提条件
- 拥有 Concrete CMS 后台的有效凭证
- 具备上传文件权限(通常需要管理员权限)
2. 漏洞利用流程
-
上传恶意文件:
- 通过后台任意文件上传功能上传一个包含 PHP 代码的文件(可以伪装成图片文件)
- 获取上传后的文件路径
-
修改布局设计:
- 访问布局设计功能
- 使用抓包工具拦截
save layout design请求 - 修改请求中的
bFilename参数,使用路径遍历技术指向上传的恶意文件(如../../uploads/evil.php)
-
触发文件包含:
- 访问特定页面触发包含操作
- 恶意 PHP 代码将被执行
代码分析
1. 漏洞入口点
漏洞始于 concrete/controllers/dialog/block/design.php 文件的 submit() 方法:
public function submit()
{
// 鉴权检查
if (!$this->canAccess()) {
throw new ForbiddenBootstrapException(t('Access Denied.'));
}
// 获取请求参数
$data = $this->request->request->all();
// 将 bFilename 存入数据库
$this->updateBlockInformation($data);
}
2. 数据库操作
bFilename 参数被存入数据库的 Blocks 表中,通过 updateBlockInformation() 方法实现:
protected function updateBlockInformation($data)
{
$bID = $this->request->request->get('bID');
// 更新数据库操作
// ...
}
3. 渲染过程触发漏洞
当访问页面时,系统会执行以下流程:
-
请求处理:
concrete/src/Http/Middleware/DispatcherDelegate.php处理请求concrete/src/Http/DefaultDispatcher.php进一步处理
-
页面加载:
concrete/src/Page/Page.php的getFromRequest()方法执行数据库查询获取页面信息:$row = $db->fetchAssoc('select pp.cID, ppIsCanonical from PagePaths pp inner join Pages p on pp.cID = p.cID where cPath = ? and siteTreeID in (' . $treeIDs . ')', [$path]);
-
区块加载:
concrete/src/Area/Area.php的getBlocks()方法加载区块:$ab = Block::getByID($row['bID'], $this, $row['arHandle']);
-
文件包含:
concrete/src/Block/Block.php的getByID()方法执行查询获取bFilename:$q = 'select ... bFilename ... from CollectionVersionBlocks inner join Blocks on (CollectionVersionBlocks.bID = Blocks.bID) inner join BlockTypes on (Blocks.btID = BlockTypes.btID) where ...';- 最终在
BlockView的renderViewContents()方法中包含文件:include($this->template);
4. 路径遍历关键点
在 BlockView 类的文件路径处理中,系统未对 bFilename 进行路径规范化检查,导致可以包含任意路径的文件:
// 在 BlockView 类中
public function setupRender()
{
$this->template = $this->block->getBlockFilename();
// 没有对路径进行安全检查
}
漏洞修复建议
-
输入验证:
- 对
bFilename参数进行严格验证,禁止路径遍历字符 (../) - 限制文件路径必须在特定目录下
- 对
-
文件包含安全:
- 实现安全的文件包含机制,限制可包含的文件类型和位置
- 使用白名单验证包含的文件
-
权限控制:
- 加强文件上传功能的权限控制
- 实现上传文件的内容检查
总结
CVE-2021-40097 漏洞展示了文件包含漏洞的典型利用方式,通过路径遍历技术结合文件上传功能实现远程代码执行。该漏洞的利用需要管理员权限,但一旦成功利用,攻击者可以完全控制目标系统。开发人员在实现文件包含功能时应特别注意路径处理和输入验证,避免此类安全问题。