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

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


15 комментариев

  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, а на «коком» (с) компилируемом языке умеешь кодить ты? Расскажи-ка нам пожалуйста…

     
  11. _AXE_, 21. мая 2010, 14:47

    Очередной бред.

     
  12. Raz0r, 21. мая 2010, 17:51

    обоснуйте пожалуйста

     
  13. mercury-type, 18. октября 2011, 1:41

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

     
  14.  

    […] PHP-скриптов уже однажды мной затрагивалась в посте PHP и зашифрованный код. В нем я описал способ получения значений всех […]

     
  15. n-p, 13. августа 2012, 13:03

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

     

Write a comment: