前言某日逛cve ,发现一个后台的rce,倒是发现了一些过程 。,就还是路径的过程中的问题,在渲染的时候可以通过演示的方式通过示例的 后台调用工具包。后台渲染的时候包含了该文件的返回给前端的时候,要通过格式后台上传一个格式的图片(内含php马,然后返回路径../../设置路径,才能达到包含。我想通过下面的主要记录的原因 ,复查到所有的文件名,然后才能看到整个过程中的文件名设置的,顺带显示自己是如何通过一个简单的方式分析的。是设置b文件名: 观察保存布局设计的请求,传递了一些重要的参数,bID和cID等,(因为部分截图在记录前,所以实际有出入)并发布b文件名,
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 进行更新,通过这一步写入到文件就路径数据库中。(文件后台任意选项上传功能上传)
二是渲染执行的过程:
也没有从头开始跟,因为最后是包括,所以我就直接把上传的文件改成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 数据库查询语句:
$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 :
/** * 列出当前加载的集合版本(或其中的特定区域)中的块 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
来源:先知(https://xz.aliyun.com/t/11248)
注:如有侵权请联系删除
欢迎大家加群一起讨论学习和交流
快乐要懂得分享,
才能加倍的快乐。
原文始发于微信公众号(衡阳信安):CVE-2021-40097 混凝土 cms rce
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论