Qual é o melhor método para se livrar de um padrão em vários arquivos php? [fechadas]

0

Trabalhando em sites infectados com centenas de arquivos php com o seguinte código de assinatura injetado na parte superior de cada arquivo:

<?php /*457563643457563643*/ ?><?php /*5467543654675436*/ ?><?php /*6745833567458335*/ ?><?php /*87934538793453*/ ?>

seguido pela parte <?php adjacente que possui código php legítimo. Em outras palavras, o código injetado não está em uma linha separada.

Eu compus o seguinte código para me livrar do código injetado:

grep -Rl 457563643457563643 . | xargs sed -i 's/<[?]php.*457563643457563643.*[?]>/<\?php \/\/ RECOVERED FILE \?>/g'

que funciona bem, mas infelizmente também exclui a tag php legítima que vem logo após o código injetado.

Qual seria o melhor método para se livrar exatamente da seguinte parte injetada no topo de cada arquivo:

<?php /*457563643457563643*/ ?><?php /*5467543654675436*/ ?><?php /*6745833567458335*/ ?><?php /*87934538793453*/ ?>
    
por Nick 05.08.2018 / 02:13

1 resposta

2

O método melhor é ir para um de seus backups antes da intrusão e começar a partir daí. Parece que você quer uma maneira não-melhor. Você pode usar sed para fazer isso.

Usando o sed, a maneira mais simples de remover um bloco exato de texto em uma única linha é simplesmente usar o comando s para removê-lo explicitamente:

sed -e 's!<?php /\*457563643457563643\*/ ?><?php /\*5467543654675436\*/ ?><?php /\*6745833567458335\*/ ?><?php /\*87934538793453\*/ ?>!!'

Isto apenas substitui a string exata que você citou com nada - é necessário escapar do * metacaractere de cada vez, mas, caso contrário, isso está diretamente usando s!pattern!replacement! da maneira usual.

Eu gostaria de usar find -exec (melhor, -execdir se você tiver ) em vez de canalizar xargs , < em especial> se eu tivesse uma árvore de diretórios em que não confiava. Pode haver nomes de arquivos com todo tipo de coisas, notavelmente novas linhas, que podem levar à execução de comandos que você não gosta. Para esta linha de comando em particular do sed , é improvável que seja um problema real, mas eu não contaria isso.

Você pode executar o grep dentro do comando find e só agir no arquivo se ele corresponder, ou apenas deixar sed manipulá-lo de qualquer maneira - se o padrão não corresponder ao arquivo, o mesmo será feito depois de qualquer maneira.

Independentemente disso, eu ainda aconselho cautela - esses marcadores não são a parte prejudicial das coisas e os bits que são podem não ser tão óbvios.

Veja também: Como faço para lidar com um servidor comprometido?

    
por 05.08.2018 / 02:38

Tags