0

次の正規表現を使用して、サイトから悪意のあるコードを削除しようとしています。

find -type f -name \*.php -exec sed -i 's/.*eval(base64_decode(\"CmVycm.*/<?php/g' {} \;

これは<?php私が望むものを保持しますが、インジェクションの多くは複数行のphpファイル全体にあることに気付きました。つまり、最初の行だけではありません<?php .phpファイルの1行目にある場合、 if do else ステートメントを実行することは可能ですか?それ以外の場合、php タグは行全体を削除しますか?

4

2 に答える 2

1

devnull からの応答は受け入れられないので、これが私のものです

悪意のあるコードが 1 行しかない場合は、次のことを簡単に実行できます。

sed -i "/eval(base64_decode(/d" filename

これにより、すべての行が削除されます。

最初に気になるなら<?php

sed -i -e "/<?php/! {1 s/^/<?php /}" filename

<?php最初の行にタグが存在しない場合は、タグを追加します。それはどのように機能しますか?

/<?php/!その中にない行に一致<?phpします。

{1 s/^/<?php /}<?php最初の行で、先頭に追加します

もっと ?

コードが 2 行かかる場合:

<?php
exec(base64_decode() ... ?>

sed -i '/<?php/{N;/exec(base64_decode/d;}' filename

行が一致<?phpし、次の行が一致する場合はexec(base64_decode、両方の行を削除します。

N;現在のバッファに次の行をロードするためのものです。d;現在のバッファを削除します (= 両方の行)

コードが 3 行かかる場合:

<?php
exec(base64_decode() ...
?> 

sed -i '/<?php/{N;/exec(base64_decode/{N;d;};}' filename

同上ですが、削除する前に 3 行目を読み込みます ( N;d;)

十分ではない?

注入された文字列の完全な例を貼り付けます。

この助けを願って、乾杯

于 2013-09-09T11:37:58.233 に答える
1

言う代わりに:

sed -i 's/.*eval(base64_decode(\"CmVycm.*/<?php/g'

いう:

sed -i 's/eval[(]base64_decode[(]["]CmVycm.*//g'

これにより、タグが保持され、<?phpタグが存在しない行から悪意のあるコードが削除されます!

編集: Bireiがコメントしたように、次のように言えます。

sed -i -e '1 s/.*eval[(]base64_decode[(]["]CmVycm.*/<?php/g' -e '2,$ s/.*eval[(]base64_decode[(]["]CmVycm.*//g'
于 2013-09-09T08:35:36.607 に答える