2017-02-16 4 views
1

Один из моих сайтов заражен каким-то вредоносным кодом. Код добавляется только к первой строке всех PHP файлов и выглядят следующим образом:Удаление длинной строки с помощью sed

<?php $ulhmjwklj = '#-#O#-#N# .......xqxe-1; ?> /*BEGIN LEGIT CODE HERE*/ <?php.... 

вредоносный код тысяча символов с большим количеством специальных символов и расстояния, так что я попытался создать сценарий, чтобы удалить его :

for i in $(find . -name \*.php); do 
    sed -i -E "s/<\?php\s$ulhmjwklj.*\?>//" $i; 
    echo $i; 
done; 

Эта sed команды будет корректно удалить вредоносный код, оставляя легитимную код на первую линию, но затем во всех последующих строках он удаляет все <?php ... ?> тегов. Так что я попытался изменения команды sed только поиск/заменить на первой линии:

for i in $(find . -name \*.php); do 
    sed -i -E "1s/<\?php\s$ulhmjwklj.*\?>//" $i; 
done; 

Теперь команда sed будет работать только на первой строке каждого файла, но он также удаляет любые законные PHP-теги, которые прилагаются в первую строку сразу после вредоносного кода.

Может кто-нибудь объяснить, где я здесь не так?

+0

ли длина вредоносного кода фиксированного во всех файлах? Или это зависит от файла к файлу? – anacron

+0

Кроме того, сколько всего файлов PHP у вас есть? Все ли они затронуты? – anacron

+0

'. *' Is greedy ... – jm666

ответ

0

The results of find should not be put through a loop. И, как я уже упоминал в комментариях, $ является специальным символом для Bash и регулярного выражения, поэтому его нужно решать соответствующим образом.

Наконец, как указано в комментариях jm666, .* является жадным, поэтому .*? ограничивает поиск как можно меньшим. Но this won't work in sed поэтому мы должны использовать вместо perl:

find . -name '*.php' -print -exec perl -p -i -e 's/<\?php \$ulhmjwklj.*?\?>//' {} \; 
+0

Большое спасибо за ваш ответ. К сожалению, это не помогло, сначала мне пришлось добавить параметры sed -i -E отдельно, а не комбинированные, как вы предложили, иначе каждый файл PHP был добавлен с символом «E» в конце имени файла. Как только я исправил это, вышеуказанный запрос на поиск/замену приводит к той же проблеме, что и раньше, когда также удаляются законные теги PHP и любой контент в конце строки 1. : -/So weird .. – blazebro

+0

См. Мой обновленный ответ. Как и в 'sed', опция' -i' для 'perl' разрешает редактирование встроенного файла и может быть удалена для выполнения« сухого запуска »без изменения файлов. – miken32

+0

УСПЕХ !!! Огромное спасибо. Я бы хотел, чтобы sed вернул мне некоторые указания на это. *? не будет работать. – blazebro

Смежные вопросы