Удаление вирусов на сайте используя Find
Зачастую нам приходится сталкиваться с вирусами, но простых и легких скриптов по их удалению в интернете попросту нет. Так что пишу памятку для всех кто сталкивается с вирусами на сайтах.
Поиск файлов содержащих текст:
Смотрим в каких файлах они есть.
find . -type f -exec grep -Ho 'topengineer.ru' {} \;
Пример вывода:
Пример удаления вредоносных <iframe> на сайте.
В данном случае нам требуется удалить все iframe содержащие определенный текст на всем сайте. При этом нужно удалить весь тег целиком во всех файлах, не повредив других iframe
find . -type f -exec grep -Ho 'topengineer.ru' {} \; -exec sed -i 's// /g' "{}" \;
- find.
- — ищет от текущего каталога и ниже
- -type -f
- — поиск только по файлам
- -grep -Ho
- — выводит только пути к файлам удовлетворяющих условию.
- {}
- — в первом случае подставит пути найденные find, в sed подставляет только найденные ранее файлы.
- -exec
- — выполнит стороннюю команду
- sed
- — в данном случае заменит в найденных файлах, удалит часть строки удовлетворяющую условию
Пример вывода:
Найдет все файлы содержащие слово «topengineer.ru» передаст список в sed и полностью удалит весь тег целиком: «текст<iframe>...topengineer.ru...</iframe>текст»
Пусть в выводе вас не смущает отображение строк в файлах, в sed передаваться в любом случае будут только пути к этим файлам.
Поиск ВСЕХ! файлов содержащих eval(base64_decode(’
find . -type f -exec grep -Ho '<.php.*eval[(]base64_decode[(].*=.[)][)]\;' {} \;
Обратите внимание, в регулярке учтен факт того, что расстояние между <php и eval может быть разное, а вот новая строка нет, так же в самом base64_decode может быть что угодно. Однако нам следует понимать что некоторые движки сайтов могут использовать эту конструкцию и в случае сайта в котором реально работает base64_decod такой фокус не прокатит, поскольку он найдет и строки реального кода.
Удаление вируса eval(base64_decode(’...........=’));
Фактически мы могли бы уже удалить столь точное выражение из строки find, но нам куда проще просто дописать -exec к существующей и рабочей конструкции, да и при удаление будет виден процесс в каких файлах он удалил, при повторном же запуске скрипта на экране должно быть пусто, что сигнализирует нам о качественной отработки скрипта. Главное преимущество данного подхода в том что удаление происходит не построчно, а именно части строки от и до, не затрагивая другую часть кода.
Будьте внимательны! Данная конструкция подходит исключительно при 100% отсутствие такой конструкции в движке вашего сайта, и все eval(base64_decode( вредоносны. В противном случае вы рискуете удалить реальный код.
find . -type f -exec grep -Ho '<.php.*eval[(]base64_decode[(].*=.[)][)]\;' {} \; -exec sed -i 's/<.php.*eval[(]base64_decode[(].*=.[)][)]\;/ /g' "{}" \;
Удаление вируса eval(base64_decode(’ZXJyb3JfcmVw...........=’)); более точное.
Рекомендуемый способ удаления вирусов. Для этого нам понадобится запустить поиск вредоносного кода на сайте и, просмотрев его, найти что-то общее, присущее именно этому вирусу, зачастую, вирус дописывает мусор в начале и в конце строки, за частую меняет свою структуру дабы весь вредоносный код отличался друг от друга. В таком случае нам подойдет следующий механизм.
Определяем уникальную часть кода не изменяющуюся у данного вируса во всех файлах. Как правило это или конец или начало кода вируса после или перед мусорным текстом. Пример:
<?php eval(base64_decode('ZXJyb3JfcmVw.............Ld20dDlf,andlafaf8dfak=')) <?php eval(base64_decode('ZXJyb3JfcmVw.............3lfa.dmadfsdasfgcDla=')) <?php eval(base64_decode('ZXJyb3JfcmVw.............3la.an4sadfa,='))
Следовательно, нам требуется лишь слегка уточнить регулярку и удалить только вирус.
find . -type f -exec grep -Ho '<.php.*eval[(]base64_decode[(].*=.[)][)]\;' {} \; -exec sed -i 's/<.php.*eval[(]base64_decode[(].ZXJyb3JfcmVw.*=.[)][)]\;/ /g' "{}" \;
В результате мы удалим только нужные нам строки, все остальные base64_decode не будут затронуты.
Дополнительно можно таким тем же способом удалить тег noindex, ведь нам потребуется удалить только сам тег, не затрагивая его содержимого.
find . -type f -exec grep -Ho 'noindex' {} \; -exec sed -i 's/<.*noindex.*>//g' "{}" \;
Оставить комментарий