CVE-2021-40097 混凝土 cms rce

admin 2025年1月12日21:44:41评论29 views字数 5016阅读16分43秒阅读模式

前言某日逛cve ,发现一个后台rce,倒是发现了一些过程 。,就还是路径的过程中的问题,在渲染的时候可以通过演示的方式通过示例的 后台调用工具包。后台渲染的时候包含了该文件的返回给前端的时候,要通过格式后台上传一个格式的图片(内含php马,然后返回路径../../设置路径,才能达到包含。我想通过下面的主要记录的原因 ,复查到所有的文件名,然后才能看到整个过程中的文件名设置的,顺带显示自己是如何通过一个简单的方式分析的。是设置b文件名: 观察保存布局设计的请求,传递了一些重要的参数,bID和cID等,(因为部分截图在记录前,所以实际有出入)并发布b文件名,CVE-2021-40097 混凝土 cms rceCVE-2021-40097 混凝土 cms rceCVE-2021-40097 混凝土 cms rce

POST /index.php/ccm/system/dialogs/block/design/submit?ccm_token=1650357492:7676740d3352aabc79c4f5a0be7581d0&cID=230&arHandle=Main&bID=195 HTTP/1.1Host: www.concretetest.comUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:99.0) Gecko/20100101 Firefox/99.0Accept: application/json, text/javascript, */*; q=0.01Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateContent-Type: application/x-www-form-urlencoded; charset=UTF-8X-Requested-With: XMLHttpRequestContent-Length: 383Origin: http://www.concretetest.comConnection: closeReferer: http://www.concretetest.com/index.php?cID=230&ctask=check-out-first&ccm_token=1650357434:13fd818e280cd778e785055e257ed9e6Cookie: CONCRETE5=0cba5r25gampmlu1glq65fgmk7; CONCRETE5_LOGIN=1; ConcreteSitemapTreeID=1bFilename=&textColor=&linkColor=&alignment=&backgroundColor=&backgroundImageFileID=0&backgroundRepeat=no-repeat&backgroundSize=auto&backgroundPosition=left+top&borderColor=&borderStyle=&boxShadowColor=&hideOnDevice%5B10%5D=0&hideOnDevice%5B20%5D=0&hideOnDevice%5B30%5D=0&hideOnDevice%5B40%5D=0&customID=&customElementAttribute=&enableBlockContainer=-1&__ccm_consider_request_as_xhr=1

通过请求到后台的concrete/controllers/dialog/block/design.php:36 submit() 简单分析一下(多的也不会):38行鉴权,通过47行获取到传递的参数,68行bFilename 了$data 输入,接下来调用 updateBlockInformation($data) 看注释,这是一个数据库更新的操作,通过 bID 进行更新,通过这一步写入到文件就路径数据库中。(文件后台任意选项上传功能上传)

CVE-2021-40097 混凝土 cms rce

CVE-2021-40097 混凝土 cms rceCVE-2021-40097 混凝土 cms rce

二是渲染执行的过程:

也没有从头开始跟,因为最后是包括,所以我就直接把上传的文件改成php后缀打位置,在代码执行上断点,便直接开始了: 因为返回的过程中s,s,s,s,s,s,也只是想查看最后一个文件 (后面分析)Dispatcher 请求 rc 请求处理:concrete/src/src 请求处理:concrete/src/Http/DefaultDispatch 请求处理:concrete /src/Http/DefaultDispatch:130:concrete/Page/Page.php getFromRequest:476 数据库查询语句:

CVE-2021-40097 混凝土 cms rceCVE-2021-40097 混凝土 cms rceCVE-2021-40097 混凝土 cms rceCVE-2021-40097 混凝土 cms rceCVE-2021-40097 混凝土 cms rce

$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通过60行返回该语句实现从请求到cID。然后查看返回页面的过程,从concrete/src/Http/DefaultDispatcher.php handleDispatch131进入,这里是一些关键的地方,从concrete/src /View/View.php:288 renderTemplate函数之后,先是包含了concrete/themes/elemental/default.php,进行了一些页面头文件的渲染,9行进入正题: 这里的$c已经根据前面开始的分析,带入了cID,跟进到get1行:load:771中调用areaBlocks:getBlocks:接着get1BlockIDs :CVE-2021-40097 混凝土 cms rceCVE-2021-40097 混凝土 cms rceCVE-2021-40097 混凝土 cms rceCVE-2021-40097 混凝土 cms rceCVE-2021-40097 混凝土 cms rce

/**      * 列出当前加载的集合版本(或其中的特定区域)中的块 ID 和关联的区域句柄。     *      * @param string|false $arHandle 区域的句柄(或者falsy获取集合版本中的所有块)     *      * @return array 返回一个数组列表,每个都是字典,如['bID' => <block ID>, 'arHandle' => <area handle>]      */     public function getBlockIDs($arHandle = false)     {         $blockIDs = CacheLocal::getEntry(                               'collection_block_ids',                               $this->getCollectionID() . ':' . $this->getVersionID()         );        if (!is_array($blockIDs)) {             $v = [$this->getCollectionID(), $this->getVersionID()]; //cID             $db = Loader::db();             $q = '从 CollectionVersionBlocks 中选择 Blocks.bID、CollectionVersionBlocks.arHandle 内连接块 (CollectionVersionBlocks.bID = Blocks.bID) 内连接块类型 (Blocks.btID = BlockTypes.btID) where CollectionVersionBlocks.cID = ? 和 (CollectionVersionBlocks.cvID = ? or CollectionVersionBlocks.cbIncludeAll=1) 按 CollectionVersionBlocks.cbDisplayOrder asc' 排序;            $r = $db->GetAll($q, $v);             $blockIDs = [];             if (is_array($r)) {                 foreach ($r as $bl) {                     $blockIDs[strtolower($bl['arHandle'])][] = $bl;                }             }             CacheLocal::set('collection_block_ids', $this->getCollectionID() . ':' . $this->getVersionID(), $blockIDs);         }        $结果 = [];         if ($arHandle != false) {             $key = strtolower($arHandle);             if (isset($blockIDs[$key])) {                 $result = $blockIDs[$key];             }         } else {             foreach ($blockIDs as $arHandle => $row) {                 foreach ($row as $brow) {                     if (!in_array($brow, $blockIDs)) {                         $result[] = $brow;                     }                 }             }         }        返回$结果;    }

这里通过cID到了bID,接下来,getBlocks函数的94:

foreach ($blockIDs as $row) {                 $ab = Block::getByID($row['bID'], $this, $row['arHandle']);

具体/src/Block/Block.php:168,getByID函数的数据库查询:

$q = '选择 CollectionVersionBlocks.isOriginal、CollectionVersionBlocks.cbIncludeAll、Blocks.btCachedBlockRecord、BlockTypes.pkgID、CollectionVersionBlocks.cbOverrideAreaPermissions、CollectionVersionBlocks.cbOverrideBlockTypeCacheSettings、CollectionVersionBlocks.cbRelationID、CollectionVersionBlocks.cbOverrideBlockTypeContainerSettings、CollectionVersionBlocks.cbEnableBlockContainer、CollectionVersionBlocks.cbDisplayOrder、Blocks.bIsActive、Blocks.bID、Blocks.btID、bName、bDateAdded、bDateModified、bFilename、btHandle、Blocks.uID 来自 CollectionVersionBlocks 内部加入 Blocks on (CollectionVersionBlocks.bID = Blocks. bID) 内连接 BlockTypes on (Blocks.btID = BlockTypes.btID) where CollectionVersionBlocks.arHandle = ? 和 CollectionVersionBlocks.cID = ? 和 (CollectionVersionBlocks.cvID = ? 或 CollectionVersionBlocks.cbIncludeAll=1) 和 CollectionVersionBlocks.bID = ?';         }

至此成功获取了写入的内容。那么一开始,其实是到这个数据库的那个路径的文件名包含的,写入数据库的文件名也只是个../../../剧情的文件路径,那么必然还有一个扩展的。前面的操作,有疑问,又是调试波到了。结果是在concrete/src/Area/area.php:824加载了b文件名,然后是853$bv-> render('view'); 161的setupRender: 1533( 通过$this->block->getBlockFilename) 跟进返回,这里还是.././的形式,接着往下BlockViewTemplate的构造函数: 在computeView:105行断点的地方,发现了对魁祸首。后面就行 了,在renderViewContents中包括:结语偶然遇到的rce学习代码还有 一些新的认识。最后参考https://hackerone。com/reports/1102067

CVE-2021-40097 混凝土 cms rceCVE-2021-40097 混凝土 cms rceCVE-2021-40097 混凝土 cms rceCVE-2021-40097 混凝土 cms rceCVE-2021-40097 混凝土 cms rce

源:先知(https://xz.aliyun.com/t/11248)

注:如有侵权请联系删除

CVE-2021-40097 混凝土 cms rce

CVE-2021-40097 混凝土 cms rce

欢迎大家加群一起讨论学习和交流

CVE-2021-40097 混凝土 cms rce

快乐要懂得分享,

才能加倍的快乐。

原文始发于微信公众号(衡阳信安):CVE-2021-40097 混凝土 cms rce

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年1月12日21:44:41
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   CVE-2021-40097 混凝土 cms rcehttps://cn-sec.com/archives/1110337.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息