Substitui uma string complexa em vários arquivos

2

Um hacker entrou em um servidor da Web e adicionou essa sequência (removeu alguns caracteres para fins de segurança e adicionou quebras de linha para legibilidade) em todos os arquivos index.php :

<?php 
eval(gzuncompress(base64_decode('eF5Tcffxd3L0CY5WjzcyNDGGMV4+1dSwqSqzU0LQGAJCPCMM='))); 
eval(gzuncompress(base64_decode('eF5LK81LLsnMzKx+JjNW0rgUAqDUUxQ==')));  
eval(gzuncompress(base64_decode('eF6VlMmy/3sMxOez/iJOojHFT0Ig/8jlTymmN/I='))); 
?>

Eu tentei usar o comando sed para removê-lo (substituindo-o por nada), mas é quase impossível definir uma expressão regular funcional com uma cadeia tão grande.

Existe outra maneira, talvez ler a string de um arquivo .txt?

    
por Kenzier 15.11.2011 / 11:29

1 resposta

1

Supondo que você não use esses truques em nenhum lugar, por que não isso (apropriadamente executado, usando sed -i e talvez find -exec ... , o que não fazia parte da sua pergunta, foi?)

$ sed 's/eval(gzuncompress(base64_decode(.*)));//' << EOF                     
> <?php eval(gzuncompress(base64_decode('eF5Tcffxd3L0CY5WjzcyNDGGMV4+1dSwqSqzU0LQGAJCPCMM=')));eval(gzuncompress(base64_decode('eF5LK81LLsnMzKx+JjNW0rgUAqDUUxQ=='))); eval(gzuncompress(base64_decode('eF6VlMmy/3sMxOez/iJOojHFT0Ig/8jlTymmN/I=')));?>
> EOF
<?php  ?>

... você pode depois lidar com o <?php ?> s vazio (o que não dói muito, não é?).

Editar removeu as quebras de linha para garantir que se ajusta à situação descrita.

Edit2 Seria melhor você apenas substituir tudo por um backup ( bom conhecido ), provavelmente, se tiver um.

Edit3 Acabei de pegar o bit "todos os arquivos index.php". Você pode, assim, tentar algo como

find /path/to/wwwroot -name "index.php" -exec sed -i regex {} \;
    
por 15.11.2011 / 11:57