【问题标题】:MySQL injection vulnerability for Joomla 1.5/2.5/3Joomla 1.5/2.5/3 的 MySQL 注入漏洞
【发布时间】:2014-11-14 08:22:18
【问题描述】:

昨天在 Joomla VEL 中宣布了一个组件中的漏洞,为了不传播此信息,我不想在这里提及,我想修复它。

此漏洞同样适用于Joomla 1.5 版本的组件,但组件团队仅修复了Joomla 2.5 和3.x 版本中的漏洞。我将在这里发布在Joomla 2.5和Joomla 3中已经修改的功能,我想知道我是否可以以相同的方式或以不同的方式修改相同的功能以兼容Joomla 1.5版本.

在以下示例中,请考虑我将编辑代码以删除组件的名称。

所以,Joomla 3 中的原始功能是:

function _setExtension($option) {
    static $components = array();

    if (!isset($components[$option])) {
        $filter = ComponentUtility::getSkippedComponents();
        $component = ComponentDatabase::loadResult("SELECT `element` FROM `#__extensions` WHERE `type` = 'component' AND `element` NOT IN ({$filter}) AND `element` = '{$option}'");

此问题已通过以下方式修复:

function _setExtension($option) {
    static $components = array();

    if (!isset($components[$option])) {
        $filter = ComponentUtility::getSkippedComponents();
        $option = ComponentDatabase::escape($option);
        $component = ComponentDatabase::loadResult("SELECT `element` FROM `#__extensions` WHERE `type` = 'component' AND `element` NOT IN ({$filter}) AND `element` = '{$option}'");

在 Joomla 2.5 中,原来的功能是:

function _setExtension($option) {
    static $components = array();

    if (!isset($components[$option])) {
        $filter = ComponentUtility::getSkippedComponents();
        $component = ComponentDatabase::loadResult("SELECT `element` FROM `#__extensions` WHERE `type` = 'component' AND `element` NOT IN ({$filter}) AND `element` = '{$option}'");

此问题已通过以下方式修复:

function _setExtension($option) {
    static $components = array();

    if (!isset($components[$option])) {
        $filter = ComponentUtility::getSkippedComponents();
        $option = ComponentDatabase::getEscaped($option);
        $component = ComponentDatabase::loadResult("SELECT `element` FROM `#__extensions` WHERE `type` = 'component' AND `element` NOT IN ({$filter}) AND `element` = '{$option}'");

在Joomla 1.5中,原来的功能是:

function _setExtension($option) {
    static $components = array();

    if (!isset($components[$option])) {
        $filter = "'com_sef', 'com_sh404sef', 'com_joomfish', 'com_config', 'com_media', 'com_installer', 'com_templates', 'com_plugins', 'com_modules', 'com_cpanel', 'com_cache', 'com_messages', 'com_menus', 'com_massmail', 'com_languages', 'com_users'";
        $component = ComponentDatabase::loadResult('SELECT `option` FROM `#__components` WHERE `parent` = "0" AND `option` NOT IN ('.$filter.') AND `option` = "'.$option.'"');

这个问题还没有解决。

所以,在 Joomla 3 中,固定线是:

            $option = ComponentDatabase::escape($option);

在 Joomla 2.5 中,固定行是:

        $option = ComponentDatabase::getEscaped($option);

在 Joomla 1.5 中呢?如何正确转义选项参数并修复功能?

【问题讨论】:

  • 您能自己看看ComponentDatabase::getEscaped 是否有空吗?或者 1.5 中的等价物是什么?我希望文档应该可用于旧版本。
  • 我在 Joomla 1.5 文件中进行了正则表达式搜索,我看到 getEscaped 在同一个组件中可用,但我不知道正确的语法,如果它与2.5版本与否。
  • 例如,Joomla 1.5 版本中相同组件的另一个文件有$result = self::$_dbo->getEscaped($text, $extra);
  • 因为我不知道该怎么做,我只是想自己修复这个漏洞但是...我没有很好的知识..所以...我正在尝试获取一些在 StackOverflow 中点亮这里!

标签: php mysql security joomla


【解决方案1】:

ComponentDatabase默认不是属于Joomla的类,所以属于你的组件。

getEscaped 是一个属于 Joomla 1.5 的函数,它简单地从数据库中获取一个转义字符串。

假设ComponentDatabase也属于这个组件的Joomla 1.5兼容版本,应该可以和其他修​​复一样:

$option = ComponentDatabase::getEscaped($option);

如果ComponentDatabase 不属于组件的 Joomla 1.5 版本,则将其从 Joomla 2.5 版本(不是 3.x)复制过来,并记住您可能需要对其进行一些调整。

【讨论】:

  • 是的,ComponentDatabase 属于 Joomla 1.5 版本的组件,我看到其他文件带有 getEscaped 的东西,但其中一些在变量之前有 $this->,嗯,我不是程序员……
  • 所以我将简单地复制 Joomla 1.5 函数中的 $option = ComponentDatabase::getEscaped($option); 应该没问题,对吧?
  • 有什么联系方式可以告诉您确切的代码和组件名称吗?
  • 首先尝试像其他版本一样添加$option = ComponentDatabase::getEscaped($option);,看看结果如何。唯一的问题是我无法测试 SQL 注入,因为这是我没有经验的
猜你喜欢
  • 1970-01-01
  • 2013-05-01
  • 1970-01-01
  • 2022-12-05
  • 2013-02-24
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
  • 2014-03-01
相关资源
最近更新 更多