Сегодня с дата центра пришло сообщение, с жалобой на спам-абузы поступающие от spam-cop.net — соответственно, жалоба на почтовый спам с сайта одного из моих клиентов.
Сайт висит на выделенном виртуальном сервере, с выделенным IP адресом на котором хостится один единственный сайт — интернет-магазин под управлением Joomla CMS + virtuemart.
Механизм поиска уязвимости описанный ниже можно применять независимо от системы управления — главное понять, что за скрипт рассылает, а далее уже пофиксить это дело.
Первое, что я сделал — это в php.ini
добавил 2 строчки:
1 2 |
mail.add_x_header = On mail.log = /var/log/php.mail.log |
и перезапустил веб-сервер (не забываем вернуть назад, после разбора полётов)
Далее, через некоторое время в /var/log/php.mail.log я увидел, что рассылка ведётся из скрипта /libraries/phpmailer/phpmailer.php
Проанализировав время логов из этого файла и логов самого веб-сервера, вижу частые обращения по адресу /index.php?options=com_contact&id=1
Для того, чтобы понять откуда именно вызывается отправка сообщений в phpmailer.php я встроил в него собственное логирование
1 2 3 4 5 6 |
$res = debug_backtrace(); file_put_contents(__DIR__.‘/_mail.log’, var_export($res,true)); ну и до кучи file_put_contents(__DIR__.‘/_get.log’, var_export($_GET,true)); file_put_contents(__DIR__.‘/_post.log’, var_export($_POST,true)); file_put_contents(__DIR__.‘/_cookie.log’, var_export($_COOKIE,true)); |
Анализ этих логов уже на 100% подтвердил, что проблема именно в компоненте com_contact, в который я встроил проверку — чтобы только авторизованные пользователи могли работать с этим компонентом (тут ключевой момент — вызов debug_backtrace() который показывает всю вложенность на уровне функций и самих скриптов
1 2 3 4 |
// Access check if ($user->guest) { return JError::raiseWarning(404, JText::_(‘JERROR_ALERTNOAUTHOR’)); } |
после чего спам прекратился
PS
Данное решение я применил, по аналогии с решением для компоненты com_mailto (которое тоже внедрил, на всякий случай)
1 2 3 4 |
// Access check if (!JFactory::getUser()->authorise(‘core.manage’, ‘com_mailto’)) { return JError::raiseWarning(404, JText::_(‘JERROR_ALERTNOAUTHOR’)); } |
которое я чуток переделал (см.выше), т.к. у меня ругался на метод JFactory::getUser()->authorise() который видимо с 3й версии в джумле …
Так же попутно, я пофиксил дыру в com_virtuemart так же позволяющую организовать спам рассылку с Вашего сайта — источник
Проверить можно по ссылке
http://ваш-сайт/index.php?page=shop.recommend&product_id=1&pop=1&tmpl=component&option=com_virtuemart&Itemid=1&vmcchk=1&Itemid=1
Фиксится добавлением редиректа на морду в начале файла /administrator/components/com_virtuemart/html/shop.recommend.php
1 |
header(‘Location: /’); exit; |
Один комментарий на «“Почтовый спам — поиск и устранение уязвимости на примере Joomla”»
Вы уверены, что ровно того же эффекта нельзя было добиться, не хакая системные файлы Joomla, а всего лишь изменив настройки доступа к компоненту в панели управления? Кроме того, «частые обращения по адресу /index.php?options=com_contact&id=1» не говорят ли о каких-то заведомо неверных настройках Joomla, а?
Прочел данный спич — трендец, нет слов. «com_contact, в который я встроил проверку — чтобы только авторизованные пользователи могли работать». Почему бы не сделать то же самое, переключив соответствующий триггер доступа в админке? Ну, уж коль скоро у гениального прогера пришла фантазия запретить напрочь доступ пользователям категории public, так чего ж. ))