Linux
如何從包含特定字元串的 PHP 文件中刪除 1 行程式碼?
巧合的是,我注意到我託管的網站的很多 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