Разработчики свободной системы управления web-контентом Joomla опубликовали (https://www.joomla.org/announcements/release-news/5641-jooml...) экстренное обновление 3.4.6, в котором устранена критическая уязвимость (https://developer.joomla.org/security-centre/630-20151214-co...), позволяющая выполнить произвольный PHP-код на сервере. Проблема усугубляется тем, что она уже активно эксплуатируется (https://blog.sucuri.net/2015/12/remote-command-execution-vul...) злоумышленниками и исправлена после выявления массовой вредоносной активности на сайтах под управлением Joomla. Всем пользователям Joomla рекомендуется незамедлительно установить обновление и провести полный аудит своих систем.По данным (https://blog.sucuri.net/2015/12/remote-command-execution-vul...) компании Sucuri в сети зафиксирована интенсивная автоматизированная атака, нацеленная на поражение систем, подверженных указанной уязвимости. После запуска нескольких подставных honeypot-систем, в течение дня на всех из них было зафиксировано более сотни попыток проникновения, поэтому после обновления следует обязательно проанализировать систему на предмет возможного проникновения атакующих. Очень высока вероятность, что система, использующая CMS Joomla, уже находится под контролем злоумышленников. Уязвимость начала активно эксплуатироваться как минимум за два дня до выхода исправления.
Проблема проявляется начиная с версии Joomla 1.5.0, выпущенной восемь лет назад, и вызвана отсутствием чистки значения строки с идентификатором браузера (User Agent), перед записью в СУБД. Для атаки достаточно отправить запрос к сайту на базе Joomla c определённым образом установленным значением User Agent. В качестве достаточного условия выявления атаки по логу, упоминается наличие запросов с IP-адресов 146.0.72.83, 74.3.170.33 и 194.28.174.106. Признаком атаки также может быть наличие в логах идентификаторов браузера (User Agent), подпадающих под маски "JDatabaseDriverMysqli" и "O:". Если подобные запросы присутствуют в логе, то можно считать систему поражённой злоумышленниками.
<font color="#461b7e">
2015 Dec 12 16:49:07 clienyhidden.access.log
Src IP: 74.3.170.33 / CAN / Alberta
74.3.170.33 - - [12/Dec/2015:16:49:40 -0500] "GET /contact/ HTTP/1.1" 403 5322 "http://google.com/" "}__test|O:21:/x22JDatabaseDriverMysqli/x22:3: ..
{s:2:/x22fc/x22;O:17:/x22JSimplepieFactory/x22:0: .. {}s:21:/x22/x5C0/x5C0/x5C0disconnectHandlers/x22;a:1:{i:0;a:2: {i:0;O:9:/x22SimplePie/x22:5:..
{s:8:/x22sanitize/x22;O:20:/x22JDatabaseDriverMysql/x22:0:{}s:8:/x22feed_url/x22;s:60:..
</font>
URL: https://www.joomla.org/announcements/release-news/5641-jooml...
Новость: http://www.opennet.me/opennews/art.shtml?num=43521
Новость прочитал на одном дыхании как какой то боевик
хорошо что ничего с Joomla меня не связывает, хотя это была одна из первых CMS с которой я знакомился
И как это в 1.5.26 исправить?
https://github.com/PhilETaylor/Joomla1.5.999/commit/95741d8a...@@ -697,39 +697,27 @@ function _validate( $restart = false )
}
}
- // record proxy forwarded for in the session in case we need it later
- if( isset( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
- $this->set( 'session.client.forwarded', $_SERVER['HTTP_X_FORWARDED_FOR']);
- }
-
- // check for client adress
- if( in_array( 'fix_adress', $this->_security ) && isset( $_SERVER['REMOTE_ADDR'] ) )
+ // Check for client address
+ if(in_array('fix_adress', $this->_security) && isset($_SERVER['REMOTE_ADDR']) && filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP) !== false)
{
- $ip = $this->get( 'session.client.address' );
+ $ip = $this->get('session.client.address');
- if( $ip === null ) {
- $this->set( 'session.client.address', $_SERVER['REMOTE_ADDR'] );
+ if($ip === null)
+ {
+ $this->set('session.client.address', $_SERVER['REMOTE_ADDR']);
}
- else if( $_SERVER['REMOTE_ADDR'] !== $ip )
+ elseif($_SERVER['REMOTE_ADDR'] !== $ip)
{
- $this->_state = 'error';
+ $this->_state = 'error';
+
return false;
}
}
- // check for clients browser
- if( in_array( 'fix_browser', $this->_security ) && isset( $_SERVER['HTTP_USER_AGENT'] ) )
+ // Record proxy forwarded for in the session in case we need it later
+ if(isset($_SERVER['HTTP_X_FORWARDED_FOR']) && filter_var($_SERVER['HTTP_X_FORWARDED_FOR'], FILTER_VALIDATE_IP) !== false)
{
- $browser = $this->get( 'session.client.browser' );
-
- if( $browser === null ) {
- $this->set( 'session.client.browser', $_SERVER['HTTP_USER_AGENT']);
- }
- else if( $_SERVER['HTTP_USER_AGENT'] !== $browser )
- {
-// $this->_state = 'error';
-// return false;
- }
+ $this->set('session.client.forwarded', $_SERVER['HTTP_X_FORWARDED_FOR']);
}
return true;
> + $this->set('session.client.forwarded', $_SERVER['HTTP_X_FORWARDED_FOR']);Ух ты! Судя по всему починив дыру с HTTP_USER_AGENT они тут же посадили точно такую же дыру, но с HTTP_X_FORWARDED_FOR. Правим эксплоит на передачу атакующего кода через HTTP-заголовок X-Forwarded-For и имеем новый 0-day.
Вряд ли. Десятью строчками выше у них стоит filter_var, с параметрами намекающими на валидацию поля.
Зато сколько бесполезных +/- по части whitespace... Погромисты на пхп - такие погромисты :)
Благодарю.
обновится до последней версии или закрыть доступ из вне.
а лучше перенести сайт на bitrix например
да-да, где на файлы кидают 777.
whois 146.0.72.83
address: Tussen de Bogen 6, 1013 JB Amsterdam, The Netherlands
OrgName: RIPE Network Coordination Centrewhois 74.3.170.33 | grep address
OrgName: Shaw Telecom G.P.whois 194.28.174.106 | grep address
org-name: ON-LINE Ltd
address: 21029, Ukraine, Vinnitsa Khmelnytske shose str 112-A
> whoiswhob :) (lft)
Я для прикола пишу в кодах сайтов, что это Joomla. Потом столько весёлых действий в логах ;)И ведь находятся индивидуумы, которые ещё этим говнокодов на php пользуются.
чем же прикажете пользоваться кроме как не им?
Я уж совсем не программист, но свои визитки-хелловорлды делал на друпале, т к чуть быстрее и чуть безопаснее.
на bitrix
блин, более бессмысленного гогна чем этот твой битрикс походу вообще не существует.
Ты просто пессимист! Нет предела совершенству! :)))
> чем же прикажете пользоваться кроме как не им?Да почти чем угодно -- жумла по характеру дыр в ней и головах разработчиков сопоставима разве что с тем ещё phpNuke.
Тут как-то приходил человек, который угробил немало времени и сил на попытки данное положение дел исправить. Пришёл к выводу, что не лечится, и покинул проект.
Из примерно той же категории уже названный Drupal, из более мощных систем тоже на PHP -- TYPO3. Оба неидеальны, но ни в какое сравнение с жумловыми проблемы их эксплуатации не идут.
Слушайте, 2015 год на дворе. Кто ещё записывает данные в БД напрямую, без прослойки, которая подставляет+чистит данные?Я думал уже давно все делают через шаблоны, типа "INSERT INTO test({foo}, {bar})"
а потом дальше в коде говоришь возьми вот этот шаблон, и подставь туда вместо {foo} вот это значени, вместо {bar} вот это.
В JDBC это по-моему с рождения было. А сегодня декабрь 2015-го.
кто-кто, похапешники
> кто-кто, похапешникиНу я сам писал на пехапе года 3, 8 лет назад. Но уже тогда использовал какую-то либку (может сам написал, не помню) через которую шли все 100% моих SQL запросов.
Мне кажется это больше говорит о программистах, чем о языке. Тяжёлый недуг -- PHP рук. Слава богу, евросоюз недавно принял законы обязывающие многие IT компании серьёзнее относиться к безопасности. Ну у нас зарплаты вырастут, как следствие.
> Тяжёлый недуг -- PHP рук.Ненене, PHP не в клозетах, а в головах.
ППЦ, на чем можешь написать ты что нибудь серьезное?
А по делу - различных орм, всяких разных, больших и маленьких, тысячи их. На крайний случай есть PDO, в котором можно забиндить значения или переменные. И язык не виноват, что используется для быстрого создания мелких страниц, сайтов и приложений, и благодаря чему в него приходят уроды халявщики.
> ППЦ, на чем можешь написать ты что нибудь серьезное?
> А по делу - различных орм, всяких разных, больших и маленьких, тысячи
> их. На крайний случай есть PDO, в котором можно забиндить значения
> или переменные. И язык не виноват, что используется для быстрого создания
> мелких страниц, сайтов и приложений, и благодаря чему в него приходят
> уроды халявщики.Согласен. Хотя язык всё же виноват, за то что он привлекает "уродов халявщиков". Точно так же как Scala виновата в том, что привлекает эгоистичных самодуров, которые поганят хороший язык операторами вроде :=++ или implicit-ами из которых потом не пойми откуда пуля прилетает прямо в ногу. Пускай бы шли обратно в свой любимый идеальный Lisp.
https://docs.joomla.org/Inserting,_Updating_and_Removing_data_using_JDatabaseвсе там есть
только не все пользуются.в вашем любимом языке X - тоже можно напрямую делать запросы, без фильтрации данных.
Кто-то в 2015 году использует ненужные тормозные прослойки? Мои соболезнования. Вы не далеко ушли от этой самой джумлы.
"PHP головного мозга" детектит.
> Кто-то в 2015 году использует ненужные тормозные прослойки?А вы как эскейпите SQL параметры?
Никак. Нормальные люди юзают подготовленные выражения.
Титеретик? Был бы у тебя практический опыт, ты бы знал, что они не работают для достаточно большого количества реальных запросов в БД и вообще зависят от используемой БД.
> Титеретик? Был бы у тебя практический опыт, ты бы знал, что они
> не работают для достаточно большого количества реальных запросов в БД и
> вообще зависят от используемой БД.Не могу говорить за предыдущего участника, но я вот практик, и что-то не помню таких случаев. Давно SQL не занимался правда. Приведите примеров пару, реально интересно.
Самый простой пример - имена полей и таблиц в большинстве БД не попадают под возможности prepared statement. Смотря на другие ваши комментарии, заострю внимание именно на возможностях самих БД, а не оберток типа DBI или JDBC, которые могут предоставить псевдо prepared statement за счет манипуляций со строками.
Добавлять поля в таблицы в realtime это уже не от php а от mysql наверное :)
> Добавлять поля в таблицы в realtime это уже не от php а
> от mysql наверное :)Он имеет ввиду не добавлять, а выбирать:
SELECT "<someDynamicColumn>", <if someCondition()>AVG(price)</if> FROM <dynamicTableName>...
> Самый простой пример - имена полей и таблиц в большинстве БД не
> попадают под возможности prepared statement. Смотря на другие ваши комментарии, заострю
> внимание именно на возможностях самих БД, а не оберток типа DBI
> или JDBC, которые могут предоставить псевдо prepared statement за счет манипуляций
> со строками.Точно, спасибо.
Хорошо, что в PaaS, с которым я сейчас работаю, такое невозможно, все запросы идут только через драйвер, никак нельзя послать строку. Но он база не реляционная, объекты туда натурально кладутся. И потом JOINить только руками в коде :)
> Никак. Нормальные люди юзают подготовленные выражения.Ну так а я о чём? PreparedStatement и есть прослойка. А вы называете её тормознутой. Противоречите себе.
>> Никак. Нормальные люди юзают подготовленные выражения.
> Ну так а я о чём? PreparedStatement и есть прослойка. А вы
> называете её тормознутой. Противоречите себе.Не совсем так, это прослойка немного другого уровня (которая в части применений позволяет ускорить работу по сравнению с параметрами в sqlText.
> А вы как эскейпите SQL параметры?Query Parameters Binding?
>> А вы как эскейпите SQL параметры?
> Query Parameters Binding?Ну так а я о чём? См мой первый коммент с которого началась ветка: "INSERT INTO test({foo}, {bar})". Потом биндим фуу бары.
> Слушайте, 2015 год на дворе. Кто ещё записывает данные в БД напрямую,
> без прослойки, которая подставляет+чистит данные?Ты точно хорошо вычитал на этот предмет код всех ORM, с которыми приходится сталкиваться? Вдруг окажется, что в одной функции авторы ORM ожидают уже экранированные данные, а в другой чистые. А сможешь всегда держать в голове эти нюансы и не забывать просматривать код всех новых версий?
>> Слушайте, 2015 год на дворе. Кто ещё записывает данные в БД напрямую,
>> без прослойки, которая подставляет+чистит данные?
> Ты точно хорошо вычитал на этот предмет код всех ORM, с которыми
> приходится сталкиваться? Вдруг окажется, что в одной функции авторы ORM ожидают
> уже экранированные данные, а в другой чистые. А сможешь всегда держать
> в голове эти нюансы и не забывать просматривать код всех новых
> версий?Да, я читал код JDBC, именно на предмет экранирования. Да и что там читать, Ctrl-клик на вызов preparedStatement.setString() в своём коде и вот оно экранирование.
Не вдруг, не окажется. НЕТ функций, которые ожидают экранированные данные. Зачем вообще в коде держать экранированные?
Загугли значение ORM, ну или сразу глянь в https://en.wikipedia.org/wiki/Object-relational_mapping
Подсказка, JDBC это не ORM.
> Загугли значение ORM, ну или сразу глянь в https://en.wikipedia.org/wiki/Object-relational_mapping
> Подсказка, JDBC это не ORM.DDL и DML в одну кучу не надо валить.
Нормальные, человеческие ORM-ы, вроде JPA и Hibernate, сидят уже поверх JDBC.
Ох жесть, когда уже наконец выжгут каленным железом на интересных местах о том, что любые входные данные должны фильтроваться и проверяться.
> Ох жесть, когда уже наконец выжгут каленным железом на интересных местах о том, что любые входные данные должны фильтроваться и проверяться.Программисты тут ни при чём.
Приходит заказчик, у тебя-умного сайт можно сделать за 1000 денег, у знакомого студента - за 250. У заказчика физически есть только 250. А ты отказываешься работать за четверть зп, а на остальные три четверти искать вторую работу. Вот они и идут к студентам.
> Приходит заказчик, у тебя-умного сайт можно сделать за 1000 денег,
> у знакомого студента - за 250. У заказчика физически есть только 250.Значит, ему сейчас не нужен сайт. Серьёзно. Потому что потеряет он на нём сперва 2000, а потом и репутацию.
Некоторые понимают это на второй стадии, но многие и на третьей не замечают ничего необычного...
Большинству, не нужны супер мега написанные движки вручную на php, которые соответсвуют стандартам правильности, культуры программирования, надежности, обхода всех нежелательных переполнений буфероф и прочих правильных вещей. Главное, чтобы крутилось и можно было получать с этого выгоду.
> Главное, чтобы крутилось и можно было получать с этого выгоду.Вот такие дебилы, не побоюсь этого слова, и строят скорорушащиеся дома.
Чтоб они все подавились этой "выгодой".
Suhosin ?
Помер?
Спасибо, что просветили.
Похапе-хейтеры в курсе, что Википедия и, если не ошибаюсь, Фейсбук с Вконтактом написаны на пхп?
Конечно в курсе,эти же люди по совместительству ненавидят социальные сети и считают, что википедия давно скатилась.
> Конечно в курсе,эти же люди по совместительству ненавидят социальные сети и считают,
> что википедия давно скатилась.Пусть тогда ненавидят еще и питон за дырки в moinmoin, руби за дырки в гитхабе, си за дырки в системном софте, баш - за shellshock, ...
да, фейсбук и контакт изначально использовали пхп, и сейчас жалеют об этом. Дело дошло до того, что им пришлось написать свои собственные интерпретаторы этого недоязыка и вынести все что можно в библиотеки на C/C++.
> изначально использовали пхп, и сейчас жалеют об этом [...] вынести все что можно в библиотеки на C/C++.Поверь, те, кто одновременно с фейсбуком начали писать социальную сеть на С/C++, сейчас жалеют не меньше.
Без предустановленных дыр тут ничего не взлетает..
Для 2.5.28 патчик
http://pastebin.com/90RnzreF
Пропатчил движки подведомственных сайтов.
Однако на парочке серверов в логах обнаружил __test|O:21:\"JDatabaseDriverMysqli
Двумя часами ранее, чем патчи накатил.Не совсем понял - как могли эту уязвимость заэксплуатировать и что теперь стоит еще проверить?
Сторонних файлов на вскидку не обнаружил в системе. Детально пока не изучал.
А я вчера все обновил, но сегодня в логах появилось такое чудо.
Вот те раз... Это уже не радует. :(
На другом сайте советуют в .htaccess так же докинутьRewriteCond %{HTTP_USER_AGENT} .*\{.* [NC]
RewriteRule .* - [F,L]
а что за сайт, такое рекомендует?
http://habrahabr.ru/company/pt/blog/273213/
Аналогично, нашел в логах упомянутые строки. Поднял старую копию из бэкапа, сверил хэши - ничего не изменено. Провел аудит системы - тоже все чисто.
> Аналогично, нашел в логах упомянутые строки. Поднял старую копию из бэкапа, сверил
> хэши - ничего не изменено. Провел аудит системы - тоже все
> чисто.А вы БД сверяли?
Нет, т.к. это проблематично (делаются регулярные изменения в магазине). Но новых пользователей нет, права админов/суперадминов у определенных пользователей без изменений, доступ в админку закрыт через .htaccess
Чёрт, поздно прочитал новость, просмотр логов дал инфу о сегодняшнем посещении такого Юзер-Агента в 8 вечера с ip из Украины и ближе к 9 вечера с ip из Канады.
А вчера, позавчера, позапоза... - всё чисто. Увидел бы вовремя, раньше бы поужинал.Ушел откатываться на точки автобэкапов хостинга и обновляться...
Судя по всему, эта уязвимость эксплуатировалась годами, просто выявлена была после массовой, автоматической, попытки эксплуатации.
У меня в логах есть подобная запись от 15.12 и на этом всё: ничего не изменено, не удалено и не добавлено. Смысл уязвимости: remote code execution, так что копать нужно ОС сервера на наличие "гостей" а не бэкапы joomla откатывать :).
Если у вас на сервере пользователь, от которого работает сайт, может подсадить "гостей" куда-то вне каталога сайта, то вам еще глубже копать надо.
Да, всё верно! И это уже проблемы хостера если используется хостинг. В любом из случаев: увидел подобного гостя в логах - проверяй всю систему. Хорошо если стоит какой-то *nix, хуже если поделка от майкрософта.
Дал url на эту статью веб мастеру. После не долгого прочтения было – “Та ну нах… Мы за файрволом.”
Вопрос – “Как «стимулировать» веб мастера пропатчить jooml’у?”
Ответ - пригласить для веб мастера помощника и дать возможность поработать в двоем пару деньков.
Пусть опытом обменяются.
> Как «стимулировать» веб мастера пропатчить jooml’у?Попробуйте деньгами? И пообещайте оплатить время, которое (если) потребуется для исправлений, если в результате обновления что-то поломается.
Объяснить мастеру что файервол тут никак не поможет, потому как joomla разрешена в правилах файервола, уязвимость в ней же и "гости" потом могут под её же процесс замаскироваться и спокойно работать. Если веб-мастер этого не понимает - то....а вообще, что взять с веб-мастера? :))
юзайте yii2