yii文件包含漏洞
- 触发点
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'));
}

本文详细探讨了Yii框架中的一个文件包含漏洞,该漏洞存在于`render`函数的`params`参数中,允许攻击者通过可控的键值对覆盖`_file_`变量,从而实现文件包含。由于在`renderPhpFile`函数中使用了`extract`函数且未进行限制,攻击者可以利用此漏洞读取或执行任意文件。在Yii1.0版本中,虽然存在类似函数`renderInternal`,但由于提取变量时有前缀限制,因此无法直接利用。要触发此漏洞,需确保`render`函数的参数键和值都可控。提供的示例代码展示了如何构造利用条件。
9893

被折叠的 条评论
为什么被折叠?



