...

воскресенье, 9 марта 2014 г.

Приемы неявного вызова php кода, применяемые во вредоносных скриптах

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

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


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


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



echo "Test"


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


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



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


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



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


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



<?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: скрытое объявление функций и передача параметров через extract



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


При запуске http://ift.tt/NMPo5O выполнит системную функцию system(«ls»)


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



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


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


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


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий