Так как на форуме нет раздела безопасность @dinox, сделай пожалуйста.
Пишу пока в курилку.
Вчера ко мне обратились мои подопечные со странной нагрузкой на сервер!
Их шарашили изо всех пушек, пытаясь пробиться в базу через sql уязвимость менеджера редиректов, и в конце концов базу таки уложили.
Не будем тыкать пальцем чей это модуль, просто проверьте у себя и своих подопечных в Index.php в корне вот такие строки:
// Redirect manager
$url = htmlspecialchars($_SERVER['REQUEST_URI']);
$redirect = $db->query("SELECT * FROM oc_redirect WHERE from_url = '" . $url . "' LIMIT 1");
if($redirect->row) {
header( 'Location: ' . htmlspecialchars_decode($redirect->row['to_url']) , true, 301 );
exit();
}
// End redirect manager
И замените на такое
// Redirect manager
$url = htmlspecialchars($_SERVER['REQUEST_URI']);
$redirect = $db->query("SELECT * FROM oc_redirect WHERE from_url = '" . $db->escape($url) . "' LIMIT 1");
if($redirect->row) {
header( 'Location: ' . htmlspecialchars_decode($redirect->row['to_url']) , true, 301 );
exit();
}
// End redirect manager
Это код из каких-то ранних версий дополнения, на сегодня там все ушло глубже в код и модель закодирована, но я думаю уязвимость осталась.
Данный код присутсвовал в версии модуля редиректа полутарагодичной давности.
Но брежененного бог бережет и да прибудет с вами сила.
Также категорически рекомендую всем, у кого до сих пор 1.5 обновить класс db.php и классы драйверов баз от 1.5.6
https://github.com/opencart/opencart/tree/1.5.6.4/upload/system/database и поменять в конфигах mysql на mysqli.
В силу, того что Mysqli по умолчанию поддерживает singlequery политику, вероятность навредить через подобные дыры несколько уменьшается, но только лишь несколько.
Также в силу того, что данный мод является клоном модуля с офсайта, все кто использует оригинальный модуль - тоже проверьте есть ли у вас экранирование параметра $_SERVER['REQUEST_URI'].
Ну и чтобы не быть голословным и не было возмущений вот структура таблицы моего подопечного от этого дополнения.
CREATE TABLE IF NOT EXISTS `oc_redirect` (
`redirect_id` int(11) NOT NULL DEFAULT '0',
`active` tinyint(1) NOT NULL DEFAULT '0',
`from_url` varchar(512) CHARACTER SET utf8 NOT NULL,
`to_url` varchar(512) CHARACTER SET utf8 NOT NULL,
`response_code` int(3) NOT NULL DEFAULT '301',
`date_start` date NOT NULL DEFAULT '0000-00-00',
`date_end` date NOT NULL DEFAULT '0000-00-00',
`times_used` int(5) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
А вот код в модуле, который распространяет один известный автор:
$sql = "CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "redirect` (";
$sql .= " `redirect_id` int(11) NOT NULL AUTO_INCREMENT,";
$sql .= " `active` tinyint(1) NOT NULL DEFAULT '0',";
$sql .= " `from_url` text COLLATE utf8_bin NOT NULL,";
$sql .= " `to_url` text COLLATE utf8_bin NOT NULL,";
$sql .= " `response_code` int(3) NOT NULL DEFAULT '301',";
$sql .= " `date_start` date NOT NULL DEFAULT '0000-00-00',";
$sql .= " `date_end` date NOT NULL DEFAULT '0000-00-00',";
$sql .= " `times_used` int(5) NOT NULL DEFAULT '0',";
$sql .= " PRIMARY KEY (`redirect_id`)";
$sql .= ") CHARSET=utf8 COLLATE=utf8_general_ci";
$this->db->query($sql);
UPD. Что делать с кодом, который закодирован в модуле и скорее всего такой там и остался?