Yii文件包含漏洞分析

yii文件包含漏洞

  1. 触发点
    public function actionIndex()
    {
       // $this->render('index');
        $name =Yii::app()->request->getParam( 'name' );
        $this->render('index', $name);


    }

render 函数

  public function render($view, $params = [], $context = null)
    {
        $viewFile = $this->findViewFile($view, $context);
        return $this->renderFile($viewFile, $params, $context);
    }

$params 参数保证可控,renderFile函数

public function renderFile($viewFile, $params = [], $context = null)
    {
       ····
       ····
        if ($this->beforeRender($viewFile, $params)) {
            Yii::debug("Rendering view file: $viewFile", __METHOD__);
            $ext = pathinfo($viewFile, PATHINFO_EXTENSION);
            if (isset($this->renderers[$ext])) {
                if (is_array($this->renderers[$ext]) || is_string($this->renderers[$ext])) {
                    $this->renderers[$ext] = Yii::createObject($this->renderers[$ext]);
                }
                /* @var $renderer ViewRenderer */
                $renderer = $this->renderers[$ext];
                $output = $renderer->render($this, $viewFile, $params);
            } else {
                $output = $this->renderPhpFile($viewFile, $params);//
            }
            $this->afterRender($viewFile, $params, $output);
        }

        array_pop($this->_viewFiles);
        $this->context = $oldContext;

        return $output;
    }

文件包含在renderPhpFile 函数中

public function renderPhpFile($_file_, $_params_ = [])
    {
        $_obInitialLevel_ = ob_get_level();
        ob_start();
        ob_implicit_flush(false);
        extract($_params_, EXTR_OVERWRITE);
        try {
            require $_file_;
            return ob_get_clean();
        } catch (\Exception $e) {
            while (ob_get_level() > $_obInitialLevel_) {
                if (!@ob_end_clean()) {
                    ob_clean();
                }
            }
            throw $e;
        } catch (\Throwable $e) {
            while (ob_get_level() > $_obInitialLevel_) {
                if (!@ob_end_clean()) {
                    ob_clean();
                }
            }
            throw $e;
        }
    }
extract函数,变量覆盖,未作限制,如果传进来数组key可控,可以覆盖$_file_值,造成文件包含。在Yii1.0版本中尝试了几个版本,发现没有renderPhpFile函数,对应有renderInternal函数,在extract时有前缀限制,无法覆盖任意变量。

yii1.*

public function renderInternal($_viewFile_,$_data_=null,$_return_=false)
{
   // we use special variable names here to avoid conflict when extracting data
   if(is_array($_data_))
      extract($_data_,EXTR_PREFIX_SAME,'data');
   else
      $data=$_data_;
   if($_return_)
   {
      ob_start();
      ob_implicit_flush(false);
      require($_viewFile_);
      return ob_get_clean();
   }
   else
      require($_viewFile_);
}

漏洞利用条件,render函数param参数,key和value都可控。

这里直接写死

    public function actionIndex()
    {
        $name =Yii::app()->request->getParam( 'name' );
        $data=array();
        $this->render('index', array('_file_'=>'D:\\tools\\111.txt'));
    }

参考:https://xz.aliyun.com/t/5051

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值