Удаление вирусов на сайте используя 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' "{}" \;

Оставить комментарий