这里用74cms做分析

漏洞发生在ApplicationHomeControllerMController.class.php中

《thinkphp中display方法可控导致文件包含》

$type变量未做处理带到了display函数中(这里故意将判断代码注释)

追踪display函数

《thinkphp中display方法可控导致文件包含》

再追踪parent::display()

《thinkphp中display方法可控导致文件包含》

继续追

《thinkphp中display方法可控导致文件包含》

最后定位到如下代码:

$content = $this->fetch($templateFile,$content,$prefix);

追踪函数

    public function fetch($templateFile='',$content='',$prefix='') {

        if(empty($content)) {
            $templateFile   =   $this->parseTemplate($templateFile);
            // 模板文件不存在直接返回
            if(!is_file($templateFile)) E(L('_TEMPLATE_NOT_EXIST_').':'.$templateFile);
        }else{
            defined('THEME_PATH') or    define('THEME_PATH', $this->getThemePath());
        }
        // 页面缓存
        ob_start();
        ob_implicit_flush(0);
        if('php' == strtolower(C('TMPL_ENGINE_TYPE'))) { // 使用PHP原生模板
            $_content   =   $content;
            // 模板阵列变量分解成为独立变量
            extract($this->tVar, EXTR_OVERWRITE);
            // 直接载入PHP模板
            empty($_content)?include $templateFile:eval('?>'.$_content);
        }else{
            // 视图解析标签
            $params = array('var'=>$this->tVar,'file'=>$templateFile,'content'=>$content,'prefix'=>$prefix);
            Hook::listen('view_parse',$params);
        }
        // 获取并清空缓存
        $content = ob_get_clean();
        // 内容过滤标签
        Hook::listen('view_filter',$content);
        // 输出模板文件
        return $content;
    }

再看parseTemplate函数

《thinkphp中display方法可控导致文件包含》

如果该文件存在就return

最后进行文件包含

《thinkphp中display方法可控导致文件包含》

poc:
网站根目录下放置1.txt 内容 <?php phpinfo(); ?>

《thinkphp中display方法可控导致文件包含》