文章目錄
  1. 1. 漏洞测试
  2. 2. 代码分析
  3. 3. 修复方式
  4. 4. 总结思考
  5. 5. 漏洞报告

漏洞测试

测试版本:最新版2.0.10

当Yii框架开启了debug和dev模式的时候,报错页面存在通用性的反射XSS。Yii提供的demo中默认是开启了dev模式的。

// comment out the following two lines when deployed to production
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');

虽然有提示说正式发布到线上需要关闭。但是由于众所周知的原因,总是会有人在线上开启了dev模式。

如图所示,由于报错页面的输出的环境变量的信息,没有做转移,直接写入页面导致的反射XSS。

代码分析

使用vscode和php debug插件进行代码调试。触发异常之后的调用过程如下。

/**
* Renders the global variables of the request.
* List of global variables is defined in [[displayVars]].
* @return string the rendering result
* @see displayVars
*/
public function renderRequest()
{
    $request = '';
    foreach ($this->displayVars as $name) {
        if (!empty($GLOBALS[$name])) {
            $request .= '$' . $name . ' = ' . VarDumper::export($GLOBALS[$name]) . ";\n\n";
        }
    }

    return '<pre>' . rtrim($request, "\n") . '</pre>';
}

请求中的参数会直接输出。导致了XSS。

修复方式

Yii框架本身有各种安全的函数。这里可以采用

use yii\helpers\Html;
    return '<pre>' . rtrim(**Html::encode($request)**, "\n") . '</pre>';

的方式解决XSS的问题。

总结思考

一个问题是debug模式下的安全问题是否是安全漏洞。可能的有的观点是框架都已经建议开发者在线上关闭debug模式了。我觉得评判的标准应该是这个问题是否可以利用,是否存在危害。
只有debug模式才存在只是大幅减少了漏洞的影响面,而不能否认漏洞本身。可以参考struts2开发模式存在的安全问题。比较巧的是struts2开发模式也出现过XSS的问题。

漏洞报告

20170116 邮件汇报给Yii官方
20170118 得到确认

20170721 发布patch

文章目錄
  1. 1. 漏洞测试
  2. 2. 代码分析
  3. 3. 修复方式
  4. 4. 总结思考
  5. 5. 漏洞报告