2013-09-09 3 views
0

Я ищу, чтобы использовать следующую строку регулярных выражений для удаления вредоносного кода с моего сайта;Regex для удаления и сохранения строк

find -type f -name \*.php -exec sed -i 's/.*eval(base64_decode(\"CmVycm.*/<?php/g' {} \;

Это сохранит <?php, который я хочу, но я заметил, что многие из инъекциями в течение PHP файлов на несколько строк, а это означает не только самого первого <?php Так же можно выполнить команду, если сделать иначе заявление где, если его в строке 1 файла php сохранить тэг php, иначе удалить всю строку, если она где-нибудь еще?

+0

Вредоносный код начинается с определенной строки? Всегда ли это начинается с 'eval'? – devnull

+0

Нет, это начинается с ' Scivic

+0

Просто восстановите резервную копию кода сайта до того, как произошла атака. У вас есть резервная копия, справа ? – DaveRandom

ответ

1

Вместо того чтобы сказать:

sed -i 's/.*eval(base64_decode(\"CmVycm.*/<?php/g' 

говорят:

sed -i 's/eval[(]base64_decode[(]["]CmVycm.*//g' 

Это позволит сохранить <?php тег, а также удалить вредоносный код из линий, где тег не существует!

EDIT: Как commented по Birei, вы можете сказать:

sed -i -e '1 s/.*eval[(]base64_decode[(]["]CmVycm.*/<?php/g' -e '2,$ s/.*eval[(]base64_decode[(]["]CmVycm.*//g' 
+0

Нет, я не думаю, что вы понимаете. Тег php существует для всех экземпляров кода. Я хочу, чтобы он удалял тег php EXCEPT, если его первая строка, то есть строка номер 1 в php-файле Вы предоставили удаление, чтобы сохранить тэг php, но он сохранил его для других экземпляров, которые не были в строке 1. – Scivic

+0

'sed' может различать, как применить команду подстановки к разным строкам. Используйте' 1 s /. ..' для первой строки и '2, $ s/...' для остальных. – Birei

+0

@Scivic Вам не нужно беспокоиться об удалении тега PHP, вам просто нужно удалить фактическую строку вредоносного кода, оставив плавающий ' 'ничего не сломает. – DaveRandom

1

Ответ от devnull ISNT принято, так что здесь мое

Если вредоносный код занимает одну строку, вы можете легко сделать :

sed -i "/eval(base64_decode(/d" filename

который Виль l удалите всю строку.

если вы беспокоитесь о первом <?php

sed -i -e "/<?php/! {1 s/^/<?php /}" filename

Он добавит <?php тег, если он не существует на первой линии. Как это работает?

/<?php/! будет соответствовать линиям без <?php в нем.

{1 s/^/<?php /} В первой строке, добавьте <?php в начале

больше?

Если код занимает 2 строки:

<?php 
exec(base64_decode() ... ?> 

sed -i '/<?php/{N;/exec(base64_decode/d;}' filename

Если строка соответствует <?php и следующая строка соответствует exec(base64_decode, удалите обе линии.

N; предназначен для загрузки следующей строки в текущем буфере.d; удалить текущий буфер (= обе линии)

Если код занимает 3 строки:

<?php 
exec(base64_decode() ... 
?> 

sed -i '/<?php/{N;/exec(base64_decode/{N;d;};}' filename

То же, но загрузить третью строку перед удалением (N;d;)

Недостаточно?

Вставить полный пример введенной струны.

Упование эта помощь, ура