2014-09-19 290 views
0

昨天在Joomla VEL已經宣佈了一個組件中的漏洞,爲了不傳播這些信息,我不想在這裏提到這個漏洞,我想修復這個漏洞。Joomla 1.5/2.5/3的MySQL注入漏洞

此漏洞也適用於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); 

並且在1.5的Joomla?我如何正確地轉義選項參數並修復該功能?

+0

你可以看看'ComponentDatabase :: getEscaped'是否可用嗎?或者1.5中的等價物是什麼?我希望文檔應該可用於舊版本。 – halfer 2014-09-19 17:12:17

+0

我在Joomla 1.5文件中做了一個正則表達式搜索,並且我發現'getEscaped'可以在同一個組件中使用,但是我不知道正確的語法,如果它與2.5版本相同。例如, – ol30cean0 2014-09-19 17:13:49

+0

,Joomla 1中同一組件的另一個文件。5版本具有'$ result = self :: $ _ dbo-> getEscaped($ text,$ extra);' – ol30cean0 2014-09-19 17:16:05

回答

0

ComponentDatabase默認情況下不屬於Joomla的類,因此它屬於您的組件。

getEscaped是一個屬於Joomla 1.5的函數,它簡單地從數據庫中獲取一個轉義字符串。

假設ComponentDatabase也屬於此組件的Joomla 1.5兼容的版本,應該應該能夠做到像其他修復:

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

如果ComponentDatabase不屬於的Joomla 1.5版本該組件,然後從Joomla 2.5版本(而不是3.x)複製它,並記住你可能需要對它進行一些調整。

+0

是的,'ComponentDatabase'屬於組件的Joomla 1.5版本,我用'getEscaped'看到其他文件,但其中一些在變量前面有'$ this->',我不是程序員... – ol30cean0 2014-09-19 17:26:56

+0

所以我會簡單地複製'$ option = ComponentDatabase :: getEscaped($ option);'在Joomla 1.5函數內部,我應該沒問題吧? – ol30cean0 2014-09-19 17:27:35

+0

有什麼方法可以與您聯繫以告訴您確切的代碼和組件名稱? – ol30cean0 2014-09-19 17:38:44