代码审计之Finecms任意文件下载漏洞

Posted 可我浪费着我寒冷的年华

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代码审计之Finecms任意文件下载漏洞相关的知识,希望对你有一定的参考价值。

PS:该漏洞已被公布,只是学习。故自己跟着大佬的步伐审计。

漏洞所在文件地址:\controllers\ApiController.php Line 57

    public function downAction() {
        $data = fn_authcode(base64_decode($this->get(‘file‘)), ‘DECODE‘);
        $file = isset($data[‘finecms‘]) && $data[‘finecms‘] ? $data[‘finecms‘] : ‘‘;
        if (empty($file)) {
            $this->msg(lang(‘a-mod-213‘));//该方法可以不管。
        }
        if (strpos($file, ‘:/‘)) {//查找:/第一次出现的位置,如果有就执行header否则...
            //远程
            header("Location: $file");
        } else {
            //本地
            $file = str_replace(‘..‘, ‘‘, $file);//将变量file里的..替换为空
            $file = strpos($file, ‘/‘) === 0 ? APP_ROOT.$file : $file;//找$file出现在第一位,则返回根路径+$file
            if (!is_file($file)) {
                $this->msg(lang(‘a-mod-214‘) . ‘(#‘ . $file . ‘)‘);
            };
            header(‘Pragma: public‘);
            header(‘Last-Modified: ‘ . gmdate(‘D, d M Y H:i:s‘) . ‘ GMT‘);
            header(‘Cache-Control: no-store, no-cache, must-revalidate‘);
            header(‘Cache-Control: pre-check=0, post-check=0, max-age=0‘);
            header(‘Content-Transfer-Encoding: binary‘);
            header(‘Content-Encoding: none‘);
            header(‘Content-type: ‘ . strtolower(trim(substr(strrchr($file, ‘.‘), 1, 10))));//strchr是从首个出现.的地方开始截断。strolower转换为小写。
            header(‘Content-Disposition: attachment; filename="‘ . basename($file) . ‘"‘);
            header(‘Content-length: ‘ . sprintf("%u", filesize($file)));//springtf:把%号替换成一个作为参数,进行传递的变量。
            readfile($file);
            exit;
        }
    }

从这个函数当中可以看出$file是可控的一个变量。

 

以上是关于代码审计之Finecms任意文件下载漏洞的主要内容,如果未能解决你的问题,请参考以下文章

代码审计两个任意文件读取漏洞实例

代码审计CLTPHP_v5.5.3 前台任意文件上传漏洞

2019-04-13 FineCMS文件上传漏洞靶场实验

Bagecms v3.1.3代码审计

代码审计CLTPHP_v5.5.3后台任意文件下载漏洞分析

代码审计CLTPHP_v5.5.3后台任意文件删除漏洞分析