Pull to refresh

Comments 28

UFO just landed and posted this here
Метод можно и доработать. К примеру — сохранять md5 файла, потом по крону запускать проверки и бить тревогу, если содержимое (а не только дата модификации файла) изменилось.
Ну и в дополнение, выдать разработчикам «кнопочку» для пересчета сумм после завершения работы.

Ну а в идеале — прикрутить все это на кои-то системе контроля версий…
Эх, все это уже описали в комментах ниже
У вас на скрипты права 777 чтоли?
1) Большинство шеллов при внедреннии изменяют дату редактирования файла, тем более это очень несложно сделать средствами самого пхп.
2) Вы опять изобрели велосипед, при чем очень кривой. Есть готовые тулзы. Если хотите сканер, то тогда лучше сверять хеш-суммы файлов, которые хранятся отдельно.
Чтобы выставить желаемую дату изменения файла используют функцию touch(), поэтому если скрипт-кидди воспользуются скриптом получше, Ваш способ не сработает.

ИМХО, такой алгоритм получше будет:
1) до заражения проходимся по всем файлам и собираем ихние md5 хеши в файл,
2) после атаки взломщиков опять проходитесь по всем файлам, собирая хеши,
3) сравниваете «чистые» хеши с хешами после заражения — где они разные — файл был изменен
Согласен что что топик мало поможет. Но если есть возможность пройтись до заражения, то имхо лучше уж сделать git init && git commit -a -m «Initial code» && tar -czf /backup/mysite.tar.gz .git, впоследствие можно будет не только проверить что что-то изменилось, но и увидеть что именно и мгновенно отменить (git reset --hard HEAD)
Вынести всё это на запасной сервер, делать диф по расписанию и слать на мыло.
И можно спать почти спокойно :)
надо chmod на папку .git проставить обязательно.
Самый простой сканер с примерно такой же логикой (изменённые за последние 30 дней):
find -name "*.php" -mtime -30 -ls
Можно при желании добавить игнор каких-то папок, а так же слать результат кроном на почтовый ящик.
Отличный пример, к тому же несложно наращивается до варианта с проверкой контрольной суммы, который предложен выше.
Друзья, спасибо за конструктивную критику. Мой пост бесполезен для гуру, главная задача поста — задать направление мысли для новичков, которые сталкиваются с проблемами и не могут их решить.

Алгоритм, предложенный мной прост, и его можно улучшать до бесконечности, а совместив мой пост и изучив ваши комментарии можно придумать свой «велосипед» для борьбы с внедрением.
Это борьба не с внедрением, а его последствиями.
А что мешает просто проверить (?:git|svn|cvs) diff?
"… привлекли к администрированию десяти сайтов, расположенных на одном виртуальном хостинге. Сайты крутились на “полуразложившихся” движках, написанных в 2000-2003 годах..."

По-видимому ни репозитория, ни бекапов сайта не знавали.
а самому положить в репозиторий?
Может, просто искать ключевые слова в файлах?
Например,
find . -name "*.php" -exec grep -q "<iframe" {} \; -print
find . -name "*.ht*" -exec grep -q "<iframe" {} \; -print
если зловред добавляется обфусцированным js, то такой способ не работает
Намного более действенный вариант — список файлов + их контрольная сумма md5, полученные при начальном развертывании системы. Генератор этой информации, равно как и проверяльщик изменений пишутся элементарно, в том числе удаленно по ftp или ssh.
Да не надо ничего писать, всё уже написано давно.
Сохраняем себе контрольные суммы:
ssh myserver.com 'find path/to/site -exec md5sum {} \;' > sum_control.txt
а потом таким же образом получаем текущие суммы в sum.txt и смотрим разницу
diff sum.txt sum_control.txt
Файл хранится локально на машине разработчика, злоумышленник к нему никак не доберётся.
Примерно такой вариант я и имел ввиду под «элементарно» :)
Понятно. Просто «писать генератор и проверяльщик изменений» в моём понимании нечто более сложное, чем «запустить команду», примерно как в этом посте написан генератор на php, выполняющий то же самое, что и find с mtime.
А почему не просто chmod -w? Админ из меня никакой, сильно не бейте… но все равно не понимаю.
Я бы просто раздел с скриптами в R/O смонтировал.
Вы помоему сам недавно программируете? Вы меня простите, но ставте комментарии к коду НАД строкой кода, а не после.

И научитесь уже называть методы по-человечески. Что вообще значит scan_tree? Отсканировать_Дерево. Вы словно пишите код, который установлен на ваших сайтах (старый и дерьмовый).
Называйте так, чтобы другой человек понял о чем идет речь.
get_changed_files() какой-нибудь, но никак не scan_tree.
Вы правы, я программирую не так давно и часто выдумываю велосипеды, от чего и страдаю.
Данный скрипт не использую в реальной жизни.

Доступа по SSH у меня к серверу нет и я ещё не силен в системах контроля версий.

Для себя я нашел, как мне кажется самый простой способ:

Работаю я в PHP Storm, которая имеет возможность сравнивать текущие локальные файлы и файлы на FTP сервере, сравнивает именно по содержимому файла. На мой взгляд это самый простой способ слежения за изменениями для начинающего разработчика (вроде меня) не имеющего опыта работы с SHH или системами контроля версий.
Sign up to leave a comment.

Articles