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. 漏洞利用流程

  1. 上传恶意文件

    • 通过后台任意文件上传功能上传一个包含 PHP 代码的文件(可以伪装成图片文件)
    • 获取上传后的文件路径
  2. 修改布局设计

    • 访问布局设计功能
    • 使用抓包工具拦截 save layout design 请求
    • 修改请求中的 bFilename 参数,使用路径遍历技术指向上传的恶意文件(如 ../../uploads/evil.php
  3. 触发文件包含

    • 访问特定页面触发包含操作
    • 恶意 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. 渲染过程触发漏洞

当访问页面时,系统会执行以下流程:

  1. 请求处理

    • concrete/src/Http/Middleware/DispatcherDelegate.php 处理请求
    • concrete/src/Http/DefaultDispatcher.php 进一步处理
  2. 页面加载

    • concrete/src/Page/Page.phpgetFromRequest() 方法执行数据库查询获取页面信息:
      $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]);
      
  3. 区块加载

    • concrete/src/Area/Area.phpgetBlocks() 方法加载区块:
      $ab = Block::getByID($row['bID'], $this, $row['arHandle']);
      
  4. 文件包含

    • concrete/src/Block/Block.phpgetByID() 方法执行查询获取 bFilename
      $q = 'select ... bFilename ... from CollectionVersionBlocks 
            inner join Blocks on (CollectionVersionBlocks.bID = Blocks.bID) 
            inner join BlockTypes on (Blocks.btID = BlockTypes.btID) 
            where ...';
      
    • 最终在 BlockViewrenderViewContents() 方法中包含文件:
      include($this->template);
      

4. 路径遍历关键点

BlockView 类的文件路径处理中,系统未对 bFilename 进行路径规范化检查,导致可以包含任意路径的文件:

// 在 BlockView 类中
public function setupRender()
{
    $this->template = $this->block->getBlockFilename();
    // 没有对路径进行安全检查
}

漏洞修复建议

  1. 输入验证

    • bFilename 参数进行严格验证,禁止路径遍历字符 (../)
    • 限制文件路径必须在特定目录下
  2. 文件包含安全

    • 实现安全的文件包含机制,限制可包含的文件类型和位置
    • 使用白名单验证包含的文件
  3. 权限控制

    • 加强文件上传功能的权限控制
    • 实现上传文件的内容检查

总结

CVE-2021-40097 漏洞展示了文件包含漏洞的典型利用方式,通过路径遍历技术结合文件上传功能实现远程代码执行。该漏洞的利用需要管理员权限,但一旦成功利用,攻击者可以完全控制目标系统。开发人员在实现文件包含功能时应特别注意路径处理和输入验证,避免此类安全问题。

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() 方法: 2. 数据库操作 bFilename 参数被存入数据库的 Blocks 表中,通过 updateBlockInformation() 方法实现: 3. 渲染过程触发漏洞 当访问页面时,系统会执行以下流程: 请求处理 : concrete/src/Http/Middleware/DispatcherDelegate.php 处理请求 concrete/src/Http/DefaultDispatcher.php 进一步处理 页面加载 : concrete/src/Page/Page.php 的 getFromRequest() 方法执行数据库查询获取页面信息: 区块加载 : concrete/src/Area/Area.php 的 getBlocks() 方法加载区块: 文件包含 : concrete/src/Block/Block.php 的 getByID() 方法执行查询获取 bFilename : 最终在 BlockView 的 renderViewContents() 方法中包含文件: 4. 路径遍历关键点 在 BlockView 类的文件路径处理中,系统未对 bFilename 进行路径规范化检查,导致可以包含任意路径的文件: 漏洞修复建议 输入验证 : 对 bFilename 参数进行严格验证,禁止路径遍历字符 ( ../ ) 限制文件路径必须在特定目录下 文件包含安全 : 实现安全的文件包含机制,限制可包含的文件类型和位置 使用白名单验证包含的文件 权限控制 : 加强文件上传功能的权限控制 实现上传文件的内容检查 总结 CVE-2021-40097 漏洞展示了文件包含漏洞的典型利用方式,通过路径遍历技术结合文件上传功能实现远程代码执行。该漏洞的利用需要管理员权限,但一旦成功利用,攻击者可以完全控制目标系统。开发人员在实现文件包含功能时应特别注意路径处理和输入验证,避免此类安全问题。