YII框架全版本文件包罗破绽发掘和剖析 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

YII框架全版本文件包罗破绽发掘和剖析

申博_安全防护 申博 102次浏览 未收录 0个评论

申博网络安全巴士站

申博-网络安全巴士站是一个专注于网络安全、系统安全、互联网安全、信息安全,全新视界的互联网安全新媒体。

————————————-

框架引见

Yii框架是一个通用的WEB编程框架, 其代码简约文雅,具有机能高,易于扩大等长处,在国内国内均具有重大的运用群体。

破绽引见

起首须要申明的时刻,这个破绽不具备黑盒测试通用性,只需开发者运用yii所编写的运用存在某种用法,才有可以或许致使触发,然则对代码平安审计职员是一个很好的破绽发掘点。

因为掌握器(Controller)向模板(View)注入变量的时刻,采取了extract($_params_, EXTR_OVERWRITE)的形式,致使背面包罗模板文件操纵的$_file_变量可以或许在某些条件下恣意掩盖,从而致使恣意当地文件包罗破绽,严峻可以或许致使在某些低php版本下实行恣意php敕令和长途文件包罗操纵。

破绽概况

题目涌现在 framework/base/View.php:

public function renderPhpFile($_file_, $_params_ = [])
    {
        $_obInitialLevel_ = ob_get_level();
        ob_start();
        ob_implicit_flush(false);
        extract($_params_, EXTR_OVERWRITE);   //overwrite 直接掩盖变量  l4yn3
        try {
            require $_file_;       //直接require $_file_变量,形成文件包罗  l4yn3
            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;
        }
    }

这个要领傍边存在恣意变量掩盖题目,若是$_param_这个变量我们能掌握,就可以掩盖掉下面的$_file_变量。

跟进这个要领的挪用链,发明同一个文件的renderFile($viewFile, $params = [], $context = null)要领挪用了这个要领:

BugBounty:Twitter 蠕虫XSS

概述 在2018年中期,我在推特最不可能出现XSS漏洞的地方——tweet处(转发),找到了一个储存型XSS漏洞。这个储存型XSS有些特殊,它可以转化为一次完全成熟的XSS蠕虫攻击。如果您对XSS蠕虫的概念尚不了解,你可以在维基百科上了解更多。 Exploit 为了方便后续解释这次奇特的XSS蠕虫,这里我先给出利用代码。在Twitter修复该漏洞之前,转发下面这个URL将会创建一个XSS蠕虫,并在整个Twitterverse上从一个账户传播到另一个账户。 https://twitter.com/messages/compose?recipient_id=988260476659404801&welcome_message_id=988274596427304964&text=%3C%3Cx%3E/script%3E%3C%3Cx%3Eiframe%20id%3D__twttr%20src%3D/intent/retweet%3Ftweet_id%3D1114986988128624640%3E%3C%3Cx%3E/iframe%3E%3C%3Cx%3Escript%20src%3D//syndication.twimg.com/timeline/profile%3Fcallback%3D__twttr/alert%3Buser_id%3D12%3E%3C%3Cx%3E/script%3E%3C%3Cx%3Escript%20src%3D//syndication.twimg.com/timeline/profile%3Fcallback%3D__twttr/frames%5B0%5D.retweet_btn_form.submit%3Buser_id%3D12%3E “为什么会这样?这只是一个链接而已”,你可能感到不解。但是朋友,这不是一个普通的链接,而

public function renderFile($viewFile, $params = [], $context = null)
    {
        $viewFile = $requestedFile = Yii::getAlias($viewFile);

        if ($this->theme !== null) {
            $viewFile = $this->theme->applyTo($viewFile);
        }
        if (is_file($viewFile)) {
            $viewFile = FileHelper::localize($viewFile);
        } else {
            throw new ViewNotFoundException("The view file does not exist: $viewFile");
        }

        $oldContext = $this->context;
        if ($context !== null) {
            $this->context = $context;
        }
        $output = '';
        $this->_viewFiles[] = [
            'resolved' => $viewFile,
            'requested' => $requestedFile
        ];

        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);   //这里挪用了破绽要领l4yn3
            }
            $this->afterRender($viewFile, $params, $output);
        }

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

        return $output;
    }

继承跟进,发明一样文件View.phprender()要领挪用了上面的renderFile()要领,就此破绽挪用链涌现。

render($view, $params = [], $context = null)

挪用了

renderFile($viewFile, $params = [], $context = null)

挪用了

renderPhpFile($_file_, $_params_ = [])   //存在破绽

render($view, $params = [], $context = null)这个要领是Yii的Controller用来衬着视图的要领,也就是说我们只需掌握了render()要领的$params变量,就完成了破绽运用。

到此这个破绽生长成了一个和 《codeigniter框架内核设想缺点可以或许致使恣意代码实行》一样的破绽。

破绽运用

存在破绽的写法以下:

public function actionIndex()
    {
        $data = Yii::$app->request->get();
        return $this->render('index', $data);
    }

这类情况下我们可以或许通报_file_=/etc/passwd来掩盖掉require $_file_;从而形成恣意文件包罗破绽。

YII框架全版本文件包罗破绽发掘和剖析

末了

这个破绽已提交给了Yii官方。愿望这篇文章可以或许资助甲方用到Yii框架的代码审计职员,制止由这个题目形成严峻的平安破绽。


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明YII框架全版本文件包罗破绽发掘和剖析
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址