Linux

如何從包含特定字元串的 PHP 文件中刪除 1 行程式碼?

  • March 10, 2014

巧合的是,我注意到我託管的網站的很多 PHP 文件都注入了惡意軟體:它們在原始/正確程式碼之前都有以下行:

<?php eval(gzinflate(base64_decode('[malware code]')));?>

對我的所有站點進行遞歸掃描並從包含它的任何文件中刪除此行(始終是第一行)的最佳方法是什麼?

我對盒子有完全的root訪問權限。我不確定這是否是通過一個現已關閉的孔進入的,或者盒子是否仍然容易受到攻擊,因此我想徹底清除並密切監視文件的更改。

問候, 埃弗特

您可以使用如下命令行來遞歸 刪除malware code所有文件中包含的行:*.php

find . -name "*.php" -exec sed -i '/malware code/d' {} \;

不確定“惡意軟體程式碼”是否是您用來匿名的替代品,因此您可以使用:

find . -name "*.php" -exec sed -i '/eval(gzinflate(base64_decode/d' {} \;

但是,我建議您在執行此之前執行備份。

然後,您最好的選擇是修復您的安全漏洞。

該解決方案適用於類 UNIX 系統。如果您安裝 Cygwin 或類似的東西,它也可以在 Windows 系統上執行。

如果違規行始終是第一行,那麼“tail +2”將是擺脫它的最佳方法。

我建議您將“tail”的輸出重定向到一個新文件,以便您可以進行一些驗證。使用僅包含惡意軟體​​行的第三個文件(例如,malware_line.txt)將使您能夠驗證您沒有以某種意外方式更改文件。

如果腳本輸出以下消息,您將需要手動檢查文件:

Files FILENAME.orig and FILENAME.check differ

這是一個腳本,它只會刪除名為 *.php 或 *.PHP 的第一行表單文件(如果惡意軟體行存在於文件中的其他位置但隨後驗證將不起作用,則提供替代解決方案。)

find . -name "*.php" -o -name "*.PHP" 2>/dev/null | while read FILENAME
do
   BADFILE=0

   # If the file contians the malware line, we want to remove it
   grep -q 'eval(gzinflate(base64_decode' $FILENAME && BADFILE=1

   if [[ $BADFILE != 0 ]]
   then
       echo "Processing: $FILENAME"

       cp $FILENAME ${FILENAME}.orig  # Save a backup copy of  file

       # Remove the offending "first" line.
       tail +2 ${FILENAME}.orig > ${FILENAME}.fixed
       ##
       ## Alternatively, you could use "grep -v" here instead of the above "tail +2" 
       ## to stip the malware line form anywhere in the file.
       ##grep -v 'eval(gzinflate(base64_decode' $FILENAME > ${FILENAME}.fixed

       # Validate that we did not munge up our file
       cat malware_line.txt ${FILENAME}.fixed > ${FILENAME}.check  # Recreate the bad file

       # Compare the original with the recreated file to prove that you only removed 
       # the malware line
       diff -q ${FILENAME}.orig ${FILENAME}.check && cp ${FILENAME}.fixed $FILENAME

       # Cleanup after ourselves
       rm -f ${FILENAME}.check
   fi
done

引用自:https://serverfault.com/questions/580967