PHP и зашифрованный код

Обфускация и шифрование кода в веб-приложениях обычно применяется с целью затруднения поиска уязвимостей, скрытия участков кода, осуществляющих проверку лицензионного ключа, невозможности редактирования, а также для защиты важных данных, например для подключения к базе данных. Методы шифрования могут быть самыми разными. В первую очередь проигрывают реализации обфускации на самом PHP – расшифровать такой код задача довольно тривиальная, так как в большинстве случаев ограничивается перехватом пары eval()’ов. Существуют даже универсальные инструменты для расшифровки, например вот этот скрипт на PHP. Что касается более продвинутых средств, таких как Zend Guard и ionCube, то дела здесь обстоят ничуть не лучше. Программа для расшифровки скриптов, закодированных Zend’ом, уже давно появилась в публичном доступе, а расшифровка ionCube также возможна, но пока только платно.

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

Первое, что нужно сделать, – это найти зашифрованный скрипт, который может содержать необходимую информацию, например config.php, settings.php и т.д. Так как для выполнения скриптов используется дополнительное расширение PHP или модуль, который «налету» расшифровывает код без преобразования имен переменных и функций, то получить логин и пароль пользователя базы данных возможно путем выполнения скрипта и извлечения всех инициализированных переменных, констант и т.д. PHP предоставляет такие возможности:

<?php

include("config.php");
print_r(get_defined_constants());

?>

Функция get_defined_constants() вернет массив всех объявленных констант, причем пользовательские будут в конце:

Array
(
    [E_ERROR] => 1
    [E_RECOVERABLE_ERROR] => 4096
    [E_WARNING] => 2
    /* ... */
    [SYS_DSN] => mysql://root:root@localhost/db
)

Аналогично get_defined_vars() возвратит список всех переменных, включая элементы глобальных массивов $_SERVER, $GLOBALS, etc.

Итак, получив доступ к БД, обнаруживаем, что содержащаяся там информация также зашифрована симметричным алгоритмом вроде Blowfish, требующим ключ, или же вовсе неизвестным. Способ получения информации используем, как и прежде – находим ответственный за хранение данных скрипт, например, с именем crypt.class.php, инклудим его и получаем объявленные классы:

<?php

include("crypt.class.php");
print_r(get_declared_classes());

?>

Далее находим имя нужного и извлекаем его методы:

<?php

include("crypt.class.php");
print_r(get_class_methods("cryptPassword"));
?>

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

10 comments:

  1. Pento, 4. Октябрь 2009, 23:28

    Оригинальный способ :)

     
  2. --, 5. Октябрь 2009, 2:13

    ionCube умеет шифровать таким образом, что include зашифрованных файлов извне не возможен. Тогда описанный способ работать не будет.

     
  3. Alek$, 5. Октябрь 2009, 8:13

    Известный подход, но в случае Zend’a с обфускацией он зачастую непрокатывает. Да и алгоритмы узнать не получается (к слову о проверке лицензионности ключа)

     
  4. Raz0r, 5. Октябрь 2009, 10:52

    @Аноним
    Слышал, что ionCube может делать привязку к хосту, но про такое – впервые.

     
  5. nex, 5. Октябрь 2009, 11:12

    Raz0r, заверните подключение к базе напрямую в функцию (или получение параемтров через вызов функции – по ссылкам). В данном случае ваш спопоб работать не будет

     
  6. Raz0r, 5. Октябрь 2009, 11:27

    @nex
    Да, согласен. Но в большинстве случаев данные для подключения к БД хранятся в отдельном файле в виде констант или глобальных переменных. Пример, который я привел в посте, взят из личного опыта.

     
  7. fess, 7. Октябрь 2009, 10:20

    Полезная вещь. Я думаю, пригодится)

     
  8. Anonym, 28. Ноябрь 2009, 21:56

    Это конечно всё перкрасно, но у меня к тебе такой вопрос, извиняюсь что не в тему, просто очень интересно ты умешь кодить на коком-нить компилируемом языке?

     
  9. Raz0r, 28. Ноябрь 2009, 22:28

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

     
  10. INVENT, 29. Ноябрь 2009, 14:46

    Anonym, а на «коком» (с) компилируемом языке умеешь кодить ты? Расскажи-ка нам пожалуйста…

     

Write a comment: