Pull to refresh

Comments 43

Главная проблема, по-моему, в том, что кто-то вам залил на сервер свой файл. Гораздо интереснее было бы прочитать анализ того, как это было сделано, а не что этот файл делал дальше.
Мопед не мой © у знакомого на сервере стоят различные покупные php-скрипты, в одном из них была дырка, он обновил его на новую версию.
Видел сегодня точно такой же взлом с db/indx.php (именно в db/). На сайте установлен pivotX. Видимо, выплыл какой-то эксплойт для этой CMS'ки.
Название CMS'и еще бы знать.
В моем случае оказалось, что поломали еще в октябре через timthumb.php в pivotX. С тех пор лежало тихонько, получается.

В последнее время вижу много сайтов, которые поломали 2-3 месяца назад, но какая-то заметная активность началась только сейчас.

Также вижу повышение хитрости взломщиков — скрипты чаще маскируют под поломанную CMS'ку, раньше просто валялись с легкоузнаваемыми названиями в легкоузнаваемых местах.
UFO just landed and posted this here
Отнюдь. У меня есть несколько скриптов, которые запускают шелл-вызовы через веб-морду и от них отказаться нет возможности.

Может быть есть способ запретить шелл-вызовы всем скриптам, кроме определенных? А то меня тоже недавно поимели через дырку в забытом phpmyadmin.
UFO just landed and posted this here
Ну так там интерактивная веб-морда, которая запускает команды, нужные не по крону, а прям сейчас.

Или я что-то не знаю о взаимодействии пхп с кроном?
UFO just landed and posted this here
Вариант 1:
Можно приколхозить слежение за каким-либо файлом, хоть на tail -f и просто писать в файл из РНР. А потом в РНР ждать появления определённого файла с ответом и просто его транслировать.
Вариант 2:
Ставим модуль runkit, запрещаем все функции кроме, например, exec(), через ранкит переименовываем стандартную функцию exec() и делаем свою с фильтрацией команд и т.п. Потом уже вызываем переименованную функцию (которая на самом деле стандартная) и возвращаем её результат. Выгода: вызывай хацкер хоть завызывайся эту функцию, если команды не пройдут проверку — в сад.
Вариант 3:
Придумать самим.
Вариант 4: придумать для PHP-файлов специальное расширение, которое никто не будет знать. Например *.somephpstuff. Кулхацкер заливает файл *.php, запрашивает и… Видит свой-же г-внокод. Но есть минус, который я где-то на хабре уже обсуждал — переезд на другой сервер, и все исходники случайно выставляются напоказ. Плюс, хранить php в файлах не *.php — некошерно, ИМХО.

Вариант 5: запретить пользователю, от которого работает PHP записывать файлы на диск. Хранить все, включая небольшие картинки-аватарки, в БД (естественно, нужно фильтровать вх. данные). Тогда никакой шелл залить не получится.

Вариант 6: самостоятельно выдавать имена загружаемым файлам (чтобы не залили картинку «backdoor.php»).
Я примерно о том же и написал в п. 3 :) Вариантов решения одной проблемы всегда >1 :)
Еще есть прекрасная опция auto_prepend_file. Указываем файл, в нем проверяем какой php файл был запущен, если не из списа разрешенных — exit
Вполне неплохое решение, как правило используют mod-rewrite и файл запускают один
Примерно так с runkit:
runkit_function_rename ('exec', 'execWithBlackjack');
function exec($sCommand) {
    if (isValidCommand($sCommand)) {
        return execWithBlackjack($sCommand);
    }
    return FALSE;
}
pro100tak, однако, спасибо за крутой коммент! именно так и сделаю значит на продакшне.

Еще недавно узнал, что можно переопределять в PHP некоторые системные функции. Например, у нас так программер переписал все функции по работе с сессиями под наши нужды.
upd. Насчет переопределения функций — это я глупость сказал, не подумав: оно ведь работает в пределах одного скрипта, а не глобально.
Оно как раз должно работать глобально, чтобы ни с какого места не смогли бы до него достучаться. Я б ещё использовал auto_prepend_file директиву в ini файле. А там — если адреса страниц не в списке — просто удалять эту функцию (чтоб даже мышь не проскочила). А для разрешённых адресов — переопределять.
Кстати (c php.net):
Замечание: По умолчанию, только пользовательские функции могут быть удалены, переименованы или изменены. Для перекрытия внутренних функций, необходимо включить в php.ini опцию runkit.internal_override.

Мануал: http://php.net/manual/ru/book.runkit.php
runkit достаточно накладен по ресурсам и медленен. Я бы не стал его использовать на часто запрашиваемых страницах. Точно также как и Reflection.
И чего такого медленного и накладного в приведенном примере? Вроде бы речь не о sandbox.
Я стараюсь вообще такую магию не пользовать или кешировать напрочь результаты работы заклинаний :)
Хотя, я даже не задумывался — что же там накладного… Наверное — это условный рефлекс уже: runkit — медленно.
А сам runkit уже продакшн-реди? Я где-то читал, что он сам еще молод, зелен и дыряв!
Что-то я не верю, что может быть задача которая не сможет подождать максимум минуту. Вопросы безопасности это всегда отношение скорость/безопасность. Поэтому, имхо, разумнее схема, при которой из веб морды запускается не команда, а делается запись в БД с описанием задания. В кроне висит скрипт который ежеминутно дергает cli php скрипт который лезет в базу, получает задание и уже сам решает, делать или нет и если да, то выполняет его. Максимальная задержка на запуск — минута, в реальности будет ниже.
Вариант с tail -f пока мне нравится больше всего.
Тут не суть, главное чтобы в файл или БД (или в очередь в памяти) писалась не команда шелла, а команда «наблюдателю», которую он сам будет интерпретировать в команды шелла.

Кстати, хороший, имхо, вариант — реализовать через sysvsem msg_*. Оверхида должно быть куда меньше, чем при работе с БД или ФС. Веб-морда пишет задания в одну очередь, демон или задача хрона (чтоб возможных утечек избежать) их оттуда читает, обрабатывает и пишет результаты в другую очередь, откуда их читает веб-морда.
Ну ты же знаешь, что это не всегда возможно. Всякие платные скрипты под зендом очень любят дернуть mplayer, imagemagick и тп
Это ж Анонимусы ) Продолжают войну за свободу викиликс )
да не скорей подобные скрипты залитые на другие сервера.
Хм… DDOS второго порядка (через хабраэффект)…
Можно было еще посомтреть, кто к этому скрипту обращался и с какого IP. Сейчас многие «хакеры» даже IP не скрывают, так как их никто не ловит все равно.
Разумеется, я сразу настроил лог на этот локейшен. Обращались всего один раз, отсюда 184.22.135.184. Какой-то сервант в штатах.
Помню была такая хреновина достаточно давно. Контрольный центр кажется smerch назывался, а «ноды» — обычные вебшеллы c возможностью exec.
2006 год, кажется. Не думал что кто-то вспомнит про эту технологию.
шеловый ботнет. они сейчас актуальны
Недавно такое же было на одном из серверов. Было подозрение на открытый PMA (но вход в сам ПМА по логину и паролю) без Basic Auth и на CNStats.

CNStats просто выпили, PMA теперь под Basic Auth. Больше гадость не появлялась.

Коннекты кстати были с айпи 188.240.236.12 (Румыния).

Забивало весь канал пару часов.
Совершенно очевидно, что используются эксплоиты, заливается файл и дальше пошло-поехало. Держите софт обновленным, а необновленным — скрытым от посторонних глаз.

Хорошо, что сервер был не продакшен, ничего особенного на нем не вертелось.
Спасибо за статью, прочитал на одном дыхании, прямо мануал по troubleshoot'ингу ;-)
во многие wordpress-темы, кстати, входит библиотека thumbnail — которая легко и просто кропает картинки, но при этом является ещё и дырой, которую надо умело прикрывать (делов то — назначить false двум переменным).

а изза того, что я вовремя не обновил саму библиотеку на 4 сайтах — у меня на хёцнере целиком сервак стопанули. теперь вот и не знаю как быть то вообще.
Сейчас уже, в свежих версиях этой библиотеки беда «прикрыта».
в 2011 году — библиотека thumbnail была дырой.
Теперь уже не акутально.
Sign up to leave a comment.

Articles