Joomla 1.5/2.5/3的MySQL注入漏洞
昨天在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?我如何正确地转义选项参数并修复该功能?
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->',我不是程序员... – ol30cean0 2014-09-19 17:26:56
所以我会简单地复制'$ option = ComponentDatabase :: getEscaped($ option);'在Joomla 1.5函数内部,我应该没问题吧? – ol30cean0 2014-09-19 17:27:35
有什么方法可以与您联系以告诉您确切的代码和组件名称? – ol30cean0 2014-09-19 17:38:44
你可以看看'ComponentDatabase :: getEscaped'是否可用吗?或者1.5中的等价物是什么?我希望文档应该可用于旧版本。 – halfer 2014-09-19 17:12:17
我在Joomla 1.5文件中做了一个正则表达式搜索,并且我发现'getEscaped'可以在同一个组件中使用,但是我不知道正确的语法,如果它与2.5版本相同。例如, – ol30cean0 2014-09-19 17:13:49
,Joomla 1中同一组件的另一个文件。5版本具有'$ result = self :: $ _ dbo-> getEscaped($ text,$ extra);' – ol30cean0 2014-09-19 17:16:05