.
12 января 2016

Скрытое выполнение в PHP скриптах

posted in security, Полезности |

Статья настолько мне понравилась, что с указанием источника сделал полный репост!
Знания необходимы для возможности определить «заразу» визуально для дальнейшего его уничтожения.
Далее от автора:

Цель данной статьи — познакомить веб-мастеров с различными подходами, которыми пользуются хакеры, чтобы затруднить обнаружение и анализ исходного кода бэкдора или хакерского шелла.

В процессе лечения сайтов мы обнаруживаем множество разновидностей хакерских шеллов и бэкдоров. Скрипты отличаются функционалом и способом обфускации исходного кода, но у всех есть общая черта — это неявное объявление переменных и функций, а также косвенный вызов функций.

Данный подход с одной стороны значительно усложняет анализ исходного кода, а с другой — позволяет хранить код в текстовых данных. Например, часть вредоносного кода может загружаться со стороннего сайта, из базы данных и мета-данных jpeg/png/gif или передаваться в запросе к скрипту. Кроме того, часть кода, представленная в виде обычной текстовой строки, может быть очень надежно зашифрована.

Эти же приемы используются веб-разработчиками и в мирных целях в скриптах проверки лицензионных ключей и регистрации веб-приложений, чтобы затруднить взлом программных продуктов.

Несмотря на все многообразие вредоносного кода, существует не так много вариантов объявления и косвенного вызова функций.
Ниже представлены примеры различных техник скрытого вызова кода. Для простоты и наглядности пусть «вредоносный код» представлен обычной функцией

echo «Test»

которая выводит слово «Test» на странице. Естественно, имена переменных и функций, а также исполняемый код не хранятся в открытом виде и в большинстве случаев обфусцированы.

Вариант 1: косвенный вызов функции

<?php <br>
    $a = "var_dump";<br>
    $b = "Test";<br>
    $a($b);<br>
?>

Вариант 2: выполнение кода через eval

<?php<br>
  eval('$a = "Test"; echo $a;');<br>
?>

Вариант 3: выполнение кода через assert

<?php<br>
  assert('print("Test")');<br>
?>

Вариант 4: выполнение кода через array_map

<?php<br>
  function evil($a) {<br>
    echo $a;<br>
  }<br>
  array_map('evil', array("Test"));<br>
?>

Вариант 5: выполнение кода через preg_replace ('/.*/e')

<?php<br>
  preg_replace('/.*/e', 'print("Test")', '');<br>
?>

Вариант 6: выполнение кода через preg_replace_callback

<?php<br>
  $a = function () { echo "Test"; };<br>
  preg_replace_callback('/.*/', $a, ''); <br>
?>

Вариант 7: выполнение кода через usort, uasort, uksort

<?php<br>
  $a = function ($x, $y) { echo "Test"; };<br>
  $b = array(1 => '1', 2 => '2');<br>
  usort( $b, $a);<br>
?>

Вариант 8: скрытое объявление функций и передача параметров через extract

<?php<br>
   extract($_REQUEST);<br>
   $a($b);<br>
?>

При запуске http://site.ru/script.php?a=system&b=ls выполнит системную функцию system («ls»)

 

Вариант 9: через регистрацию функции завершения (можно сделать exit () или die () для немедленного выполнения)

<?php<br>
   register_shutdown_function(create_function('', "echo 'Test';")); <br>
?>

Такой же подход можно использовать со всеми вызовами, принимающими в качестве аргумента callable функцию: call_user_func_array (), call_user_func (), forward_static_call_array, forward_static_call (), register_tick_function (). Хотя в реальных шеллах и бэкдорах вызовы через данные функции мы не встречали, обычно используются варианты с 1 по 8.

 

В реальных бэкдорах перечисленные варианты используют в комплексе, причем сами объявления переменных и функций часто выносят за пределы скрипта (например, загружают из базы данных, с удаленного сервера или из мета-данных изображений).

 

Кстати, бОльшая часть данных вызовов успешно детектируется сканером вредоносного кода AI-BOLIT. Это отличает его от обычных сканеров, выполняющих поиск вредоносного кода по хэшу.

Источник

Яндекс.Метрика