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"));
?>

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

Join the Conversation

15 Comments

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

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

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

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

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

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

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

  8. Интересный подход…
    Не в тему конечно, но одного не пойму, зачем в IonCube некоторые включают привязку к домену? Мне например нужно изменить дизайн интернет магазина, и переделать несколько модулей сайта, не проблема конечно, но как же тяжело это делать кривыми методами, как на локалхосте, так и на моем хосте для тестирования не пашет.. хочет свой родной домен.. и это очень раздражает!!!!!!

  9. Спасибо raz0r, это как раз “мой” случй.
    Достал ключ к blowfish, способом описаным тут

Leave a comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.