Комментарии 43
Главная проблема, по-моему, в том, что кто-то вам залил на сервер свой файл. Гораздо интереснее было бы прочитать анализ того, как это было сделано, а не что этот файл делал дальше.
Мопед не мой © у знакомого на сервере стоят различные покупные php-скрипты, в одном из них была дырка, он обновил его на новую версию.
Видел сегодня точно такой же взлом с db/indx.php (именно в db/). На сайте установлен pivotX. Видимо, выплыл какой-то эксплойт для этой CMS'ки.
Название CMS'и еще бы знать.
В моем случае оказалось, что поломали еще в октябре через timthumb.php в pivotX. С тех пор лежало тихонько, получается.
В последнее время вижу много сайтов, которые поломали 2-3 месяца назад, но какая-то заметная активность началась только сейчас.
Также вижу повышение хитрости взломщиков — скрипты чаще маскируют под поломанную CMS'ку, раньше просто валялись с легкоузнаваемыми названиями в легкоузнаваемых местах.
В последнее время вижу много сайтов, которые поломали 2-3 месяца назад, но какая-то заметная активность началась только сейчас.
Также вижу повышение хитрости взломщиков — скрипты чаще маскируют под поломанную CMS'ку, раньше просто валялись с легкоузнаваемыми названиями в легкоузнаваемых местах.
НЛО прилетело и опубликовало эту надпись здесь
Отнюдь. У меня есть несколько скриптов, которые запускают шелл-вызовы через веб-морду и от них отказаться нет возможности.
Может быть есть способ запретить шелл-вызовы всем скриптам, кроме определенных? А то меня тоже недавно поимели через дырку в забытом phpmyadmin.
Может быть есть способ запретить шелл-вызовы всем скриптам, кроме определенных? А то меня тоже недавно поимели через дырку в забытом phpmyadmin.
НЛО прилетело и опубликовало эту надпись здесь
Ну так там интерактивная веб-морда, которая запускает команды, нужные не по крону, а прям сейчас.
Или я что-то не знаю о взаимодействии пхп с кроном?
Или я что-то не знаю о взаимодействии пхп с кроном?
НЛО прилетело и опубликовало эту надпись здесь
Вариант 1:
Можно приколхозить слежение за каким-либо файлом, хоть на tail -f и просто писать в файл из РНР. А потом в РНР ждать появления определённого файла с ответом и просто его транслировать.
Вариант 2:
Ставим модуль runkit, запрещаем все функции кроме, например, exec(), через ранкит переименовываем стандартную функцию exec() и делаем свою с фильтрацией команд и т.п. Потом уже вызываем переименованную функцию (которая на самом деле стандартная) и возвращаем её результат. Выгода: вызывай хацкер хоть завызывайся эту функцию, если команды не пройдут проверку — в сад.
Вариант 3:
Придумать самим.
Можно приколхозить слежение за каким-либо файлом, хоть на tail -f и просто писать в файл из РНР. А потом в РНР ждать появления определённого файла с ответом и просто его транслировать.
Вариант 2:
Ставим модуль runkit, запрещаем все функции кроме, например, exec(), через ранкит переименовываем стандартную функцию exec() и делаем свою с фильтрацией команд и т.п. Потом уже вызываем переименованную функцию (которая на самом деле стандартная) и возвращаем её результат. Выгода: вызывай хацкер хоть завызывайся эту функцию, если команды не пройдут проверку — в сад.
Вариант 3:
Придумать самим.
Вариант 4: придумать для PHP-файлов специальное расширение, которое никто не будет знать. Например *.somephpstuff. Кулхацкер заливает файл *.php, запрашивает и… Видит свой-же г-внокод. Но есть минус, который я где-то на хабре уже обсуждал — переезд на другой сервер, и все исходники случайно выставляются напоказ. Плюс, хранить php в файлах не *.php — некошерно, ИМХО.
Вариант 5: запретить пользователю, от которого работает PHP записывать файлы на диск. Хранить все, включая небольшие картинки-аватарки, в БД (естественно, нужно фильтровать вх. данные). Тогда никакой шелл залить не получится.
Вариант 6: самостоятельно выдавать имена загружаемым файлам (чтобы не залили картинку «backdoor.php»).
Вариант 5: запретить пользователю, от которого работает PHP записывать файлы на диск. Хранить все, включая небольшие картинки-аватарки, в БД (естественно, нужно фильтровать вх. данные). Тогда никакой шелл залить не получится.
Вариант 6: самостоятельно выдавать имена загружаемым файлам (чтобы не залили картинку «backdoor.php»).
Я примерно о том же и написал в п. 3 :) Вариантов решения одной проблемы всегда >1 :)
Еще есть прекрасная опция auto_prepend_file. Указываем файл, в нем проверяем какой php файл был запущен, если не из списа разрешенных — exit
Вполне неплохое решение, как правило используют mod-rewrite и файл запускают один
Вполне неплохое решение, как правило используют mod-rewrite и файл запускают один
Примерно так с runkit:
runkit_function_rename ('exec', 'execWithBlackjack');
function exec($sCommand) {
if (isValidCommand($sCommand)) {
return execWithBlackjack($sCommand);
}
return FALSE;
}
pro100tak, однако, спасибо за крутой коммент! именно так и сделаю значит на продакшне.
Еще недавно узнал, что можно переопределять в PHP некоторые системные функции. Например, у нас так программер переписал все функции по работе с сессиями под наши нужды.
Еще недавно узнал, что можно переопределять в PHP некоторые системные функции. Например, у нас так программер переписал все функции по работе с сессиями под наши нужды.
upd. Насчет переопределения функций — это я глупость сказал, не подумав: оно ведь работает в пределах одного скрипта, а не глобально.
Оно как раз должно работать глобально, чтобы ни с какого места не смогли бы до него достучаться. Я б ещё использовал auto_prepend_file директиву в ini файле. А там — если адреса страниц не в списке — просто удалять эту функцию (чтоб даже мышь не проскочила). А для разрешённых адресов — переопределять.
Кстати (c php.net):
Замечание: По умолчанию, только пользовательские функции могут быть удалены, переименованы или изменены. Для перекрытия внутренних функций, необходимо включить в php.ini опцию runkit.internal_override.
Мануал: http://php.net/manual/ru/book.runkit.php
Кстати (c php.net):
Замечание: По умолчанию, только пользовательские функции могут быть удалены, переименованы или изменены. Для перекрытия внутренних функций, необходимо включить в php.ini опцию runkit.internal_override.
Мануал: http://php.net/manual/ru/book.runkit.php
runkit достаточно накладен по ресурсам и медленен. Я бы не стал его использовать на часто запрашиваемых страницах. Точно также как и Reflection.
А сам runkit уже продакшн-реди? Я где-то читал, что он сам еще молод, зелен и дыряв!
Что-то я не верю, что может быть задача которая не сможет подождать максимум минуту. Вопросы безопасности это всегда отношение скорость/безопасность. Поэтому, имхо, разумнее схема, при которой из веб морды запускается не команда, а делается запись в БД с описанием задания. В кроне висит скрипт который ежеминутно дергает cli php скрипт который лезет в базу, получает задание и уже сам решает, делать или нет и если да, то выполняет его. Максимальная задержка на запуск — минута, в реальности будет ниже.
Вариант с tail -f пока мне нравится больше всего.
Тут не суть, главное чтобы в файл или БД (или в очередь в памяти) писалась не команда шелла, а команда «наблюдателю», которую он сам будет интерпретировать в команды шелла.
Кстати, хороший, имхо, вариант — реализовать через sysvsem msg_*. Оверхида должно быть куда меньше, чем при работе с БД или ФС. Веб-морда пишет задания в одну очередь, демон или задача хрона (чтоб возможных утечек избежать) их оттуда читает, обрабатывает и пишет результаты в другую очередь, откуда их читает веб-морда.
Кстати, хороший, имхо, вариант — реализовать через sysvsem msg_*. Оверхида должно быть куда меньше, чем при работе с БД или ФС. Веб-морда пишет задания в одну очередь, демон или задача хрона (чтоб возможных утечек избежать) их оттуда читает, обрабатывает и пишет результаты в другую очередь, откуда их читает веб-морда.
Ну ты же знаешь, что это не всегда возможно. Всякие платные скрипты под зендом очень любят дернуть mplayer, imagemagick и тп
Это ж Анонимусы ) Продолжают войну за свободу викиликс )
а тем временем Bank of America грузится очень долго.
Можно было еще посомтреть, кто к этому скрипту обращался и с какого IP. Сейчас многие «хакеры» даже IP не скрывают, так как их никто не ловит все равно.
Помню была такая хреновина достаточно давно. Контрольный центр кажется smerch назывался, а «ноды» — обычные вебшеллы c возможностью exec.
Недавно такое же было на одном из серверов. Было подозрение на открытый PMA (но вход в сам ПМА по логину и паролю) без Basic Auth и на CNStats.
CNStats просто выпили, PMA теперь под Basic Auth. Больше гадость не появлялась.
Коннекты кстати были с айпи 188.240.236.12 (Румыния).
Забивало весь канал пару часов.
CNStats просто выпили, PMA теперь под Basic Auth. Больше гадость не появлялась.
Коннекты кстати были с айпи 188.240.236.12 (Румыния).
Забивало весь канал пару часов.
Itsoknoproblembro. Порадовало название скрипта.
Спасибо за статью, прочитал на одном дыхании, прямо мануал по troubleshoot'ингу ;-)
во многие wordpress-темы, кстати, входит библиотека thumbnail — которая легко и просто кропает картинки, но при этом является ещё и дырой, которую надо умело прикрывать (делов то — назначить false двум переменным).
а изза того, что я вовремя не обновил саму библиотеку на 4 сайтах — у меня на хёцнере целиком сервак стопанули. теперь вот и не знаю как быть то вообще.
а изза того, что я вовремя не обновил саму библиотеку на 4 сайтах — у меня на хёцнере целиком сервак стопанули. теперь вот и не знаю как быть то вообще.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
DDOS-бот на PHP гуляет по серверам