В процессе лечения сайтов обнаруживается множество типов хакерских оболочек и бэкдоров.
Скрипты различаются функционалом и способом обфускации исходного кода, но все они имеют общую особенность — неявное объявление переменных и функций, а также косвенный вызов функций.
Такой подход популярен среди разработчиков вредоносного кода, поскольку, с одной стороны, существенно усложняет анализ исходного кода, а с другой – позволяет хранить код в текстовых данных.
Например, часть вредоносного кода может быть загружена со стороннего сайта, из базы данных, метаданных 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 #ревизия #обфускация #информационная безопасность #разработка сайтов
-
Обучение Rpa В Пуне
19 Oct, 24 -
Дорабатываем Оборудование Turnigy 9X
19 Oct, 24 -
Кризис Жанра: Демпинг На Биржах Контента
19 Oct, 24 -
Звуковая Карта Как Консольное Устройство
19 Oct, 24