como usar o comando sed para substituir tudo antes da segunda ocorrência?

1

Meus sites foram infectados por alguns malwares mal-intencionados que inseriram códigos maliciosos em pelo menos 3135 arquivos (todos os meus sites do wordpress).

Este é um dos arquivos infectados: link

E aqui está minha saída desejada: link

Eu não tenho idéia sobre comandos Unix, além de alguns comandos simples find e grep .

Após algumas pesquisas, descobri sobre o comando sed , mas não sei como usá-lo no meu caso.

Como você pode ver no código acima, o padrão geral é que o código é inserido na parte superior de cada arquivo, ou seja, antes da tag <?php original (o que significa que a tag <?php original é a segunda.

Então, achei que poderia encontrar todos os arquivos que contêm cnajwp = e remover tudo antes da segunda tag <?php .

Eu posso encontrar os arquivos contendo cnajwp usando

find * -type f -name "*.php" -exec grep -l "cnajwp =" {} \;

mas não sei como substituir tudo antes da segunda tag <?php nessas ocorrências.

Alguém aqui poderia me dar uma ajuda?

    
por Albo Best 07.08.2016 / 16:04

3 respostas

0

Isso usa o comando para localizar os arquivos infectados e fornece a lista para xargs, que executa uma expressão na primeira linha.

find * -type f -name "*.php" -exec grep -l "cnajwp =" {} \; |
xargs sed -i -E '1s/^(<\?php) \$ocnajwp =.*$//'

De acordo com o seu exemplo de arquivo de entrada, isso deve funcionar.

Desde que você encontrou arquivos, onde a infecção foi colocada de maneira ligeiramente diferente, e você acabou com alguns arquivos, onde ambas as primeiras linhas contêm <?php , você pode executar o seguinte para limpar esses arquivos:

find * -type f -name "*.php" -exec \
gawk -i inplace 'NR==2 && /^<\?php$/ {next} 1' {} \;
    
por 07.08.2016 / 16:31
0

Esta solução acomoda um caso em que o script mal-intencionado abrange mais de uma linha e usará a edição no local para alterar os arquivos diretamente no servidor.

find /base/path/here -type f -name "*.php" -exec \
sed -Ei '/<\?php/{:l1;/.*\?><\?php/!{N;bl1};s/<\?php.*\?>(<\?php)//}' {} \;

Espero que isso se encaixe no requisito.

    
por 07.08.2016 / 18:40
0

Pelo que pude ver, todo o código malicioso que você deseja excluir é colocado na linha 1. Mas esteja ciente de que a tag <?php é colocada nessa linha também, então você deve alterar toda a primeira linha para <?php em vez de excluí-lo.

Tudo que você precisa é usar o comando abaixo:

sed -i '1 s/^.*$/<?php/g' yourFile.php
A opção

-i alterará o arquivo no local.

Então, para o comando de localização que você usou:

find * -type f -name "*.php" -exec sed -i '1 s/^.*$/<?php/g' {} \;

Para arquivos que contêm duas tags <?php na primeira e na segunda linhas, você precisa executar o comando abaixo, depois de executar o comando find acima:

find * -type f -name "*.php" -exec perl -ni -e 'print if $. < 1 or $. > 3 or !$seen{$_}++' {} \;

Portanto, excluirá linhas duplicadas da linha 1 para a linha 3. -i irá alterar o arquivo no local.

    
por 07.08.2016 / 16:27