Joomla 1.5 / 2.5 / 3的MySQL注入漏洞

时间:2014-09-19 17:03:55

标签: php mysql security joomla

昨天在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中?如何正确转义选项参数并修复函数?

1 个答案:

答案 0 :(得分:0)

ComponentDatabase默认情况下不属于Joomla的类,因此它属于您的组件。

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

假设ComponentDatabase也属于此组件的Joomla 1.5兼容版本,应该应该能够执行与其他修复相同的操作:

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

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