Обфускация и шифрование кода в веб-приложениях обычно применяется с целью затруднения поиска уязвимостей, скрытия участков кода, осуществляющих проверку лицензионного ключа, невозможности редактирования, а также для защиты важных данных, например для подключения к базе данных. Методы шифрования могут быть самыми разными. В первую очередь проигрывают реализации обфускации на самом 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")); ?>
Таким образом, для расшифровки базы данных потребуется лишь запустить скрипт, вызывающий в цикле метод, преобразующий данные в исходное состояние.
15 replies on “PHP и зашифрованный код”
Оригинальный способ 🙂
ionCube умеет шифровать таким образом, что include зашифрованных файлов извне не возможен. Тогда описанный способ работать не будет.
Известный подход, но в случае Zend’a с обфускацией он зачастую непрокатывает. Да и алгоритмы узнать не получается (к слову о проверке лицензионности ключа)
@Аноним
Слышал, что ionCube может делать привязку к хосту, но про такое – впервые.
Raz0r, заверните подключение к базе напрямую в функцию (или получение параемтров через вызов функции – по ссылкам). В данном случае ваш спопоб работать не будет
@nex
Да, согласен. Но в большинстве случаев данные для подключения к БД хранятся в отдельном файле в виде констант или глобальных переменных. Пример, который я привел в посте, взят из личного опыта.
Полезная вещь. Я думаю, пригодится)
Это конечно всё перкрасно, но у меня к тебе такой вопрос, извиняюсь что не в тему, просто очень интересно ты умешь кодить на коком-нить компилируемом языке?
В этом блоге я по большей части пишу не о себе, а о веб-безопасности. Если уж вас так интересует компилируемость языков, которые я знаю, то пишите на email.
Anonym, а на “коком” (с) компилируемом языке умеешь кодить ты? Расскажи-ка нам пожалуйста…
Очередной бред.
обоснуйте пожалуйста
Интересный подход…
Не в тему конечно, но одного не пойму, зачем в IonCube некоторые включают привязку к домену? Мне например нужно изменить дизайн интернет магазина, и переделать несколько модулей сайта, не проблема конечно, но как же тяжело это делать кривыми методами, как на локалхосте, так и на моем хосте для тестирования не пашет.. хочет свой родной домен.. и это очень раздражает!!!!!!
[…] PHP-скриптов уже однажды мной затрагивалась в посте PHP и зашифрованный код. В нем я описал способ получения значений всех […]
Спасибо raz0r, это как раз “мой” случй.
Достал ключ к blowfish, способом описаным тут