Обфускация и шифрование кода в веб-приложениях обычно применяется с целью затруднения поиска уязвимостей, скрытия участков кода, осуществляющих проверку лицензионного ключа, невозможности редактирования, а также для защиты важных данных, например для подключения к базе данных. Методы шифрования могут быть самыми разными. В первую очередь проигрывают реализации обфускации на самом 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")); ?>
Таким образом, для расшифровки базы данных потребуется лишь запустить скрипт, вызывающий в цикле метод, преобразующий данные в исходное состояние.
Leave a Reply