как спрятать eval?

Тема в разделе "Как сделать...", создана пользователем Finnland, 14 июн 2015.

  1. Finnland

    Finnland Создатель

    Заблокирован
    Регистр.:
    22 авг 2014
    Сообщения:
    10
    Симпатии:
    35
    Собсно сабж.
    имеется строка
    PHP:
    eval(base64_decode(gzuncompress(base64_decode($J4331C22D4FD20FC9F9DD8557D15F3CD7))));
    На сервере идет скан php файла на наличие плохих слов, и доступ к выполнению скрипта обламывается, собственно нужно заменить евал етот.

    Так проканывает, но правильно ли это?
    PHP:
    str_replace('.','','e.v.a.l');(base64_decode(gzuncompress(base64_decode($J4331C22D4FD20FC9F9DD8557D15F3CD7))));
    Имеет ли место, замена через регулярку base64_decode

    PHP:
    str_replace('*','','b*a*s*e*6*4*_*d*e*c*o*d*e');
    аналогичным способом?

    Или есть более радикальные способы. Спасибо.
     
    Последнее редактирование: 14 июн 2015
    Duймовочка нравится это.
  2. denverkurt

    denverkurt Denve®

    Регистр.:
    23 дек 2013
    Сообщения:
    610
    Симпатии:
    347
    главное чтобы работало, а правильно или неправильно - мне кажется так вопросы не ставят
    еще можно наверно сделать через массив, как то так:
    Код:
    $str = array('e', 'v', 'a', 'l');
    implode('', $str);
    еще массив можно перевернуть чтобы еще больше запутать следы... вариантов масса

    только в итоге всегда получается код, который у более-менее понимающего пхп-кодера вызывает вопросы: что он делает и для чего это так закодировано. а расколоть это труда не составит.

    для строки есть еще более интересная функция
    Код:
    str_rot13('riny');
     
    Последнее редактирование модератором: 14 июн 2015
    Finnland нравится это.
  3. Finnland

    Finnland Создатель

    Заблокирован
    Регистр.:
    22 авг 2014
    Сообщения:
    10
    Симпатии:
    35
    Спс. Это понятно.
    Мне не для человека, а для скрипта проверки.
    А по поводу перевернуть строчку - вообще отличная идея... strrev('lave');
    ))))))
     
    Duймовочка нравится это.
  4. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.403
    Симпатии:
    1.185
    Это просто 2 бесполезные операции, выполнения вирусного кода не происходит.
    почитайте http://php.net/manual/ru/functions.variable-functions.php и вот для наглядности код:
    PHP:
    @ini_set('error_reporting'E_ALL);

    $str 'echo 1;'#классический вызов - всё работает
    eval($str); 

    $sec_str 'eval'#это работать не будет Поскольку это языковая конструкция, а не функция, она не может вызываться при помощи переменных функций. 
    $sec_str($str);

    $sec_str 'base64_encode'#а это будет
    var_dump($sec_str($str));
    Обсуждение чем можно заменить eval уже было здесь - https://www.nulled.cc/threads/252175/
     
    Finnland нравится это.
  5. Finnland

    Finnland Создатель

    Заблокирован
    Регистр.:
    22 авг 2014
    Сообщения:
    10
    Симпатии:
    35
    Вот. Это уже дело!
    Значит вопрос ставился верно. Вывод: это не правильно! Спасибо.
    Заливаться заливается, а проверить на выполнение - забыл.
    Вопрос еще один и тему можно закрыть.
    Скорее всего нельзя, вызываться не будет, но всё же спрошу))). А можно слово eval объявить пользовательской функцией и вызвать?
     
    Duймовочка нравится это.
  6. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.403
    Симпатии:
    1.185
    Переопределить не получится.
    Можно сделать вот так:
    PHP:
    function user_func($str) {
      eval(
    $str); # Но тут все равно спалят
    }
    $sec_str 'user_func';
    $sec_str($str);
     
    Finnland нравится это.
  7. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    Вместо eval можно использовать unserialize. Гугли "unserialize code execution", так взламывали и Wordpress и SugarCMS и много других, это распространенный баг. Вкратце - делаешь объект со своим кодом и сериалайзишь его в строку, а при unserialize твой код выполнится. Так можно уйти от eval да и сам 'uns'.'erial'.'ize'() спрятать тоже, потому что он обычная функция, а не конструкция языка как eval.

    UPD: получилось засунуть eval в строку:
    preg_replace('/\d/e',"ev"."al('?>hahaha ')", '11');
     
    Последнее редактирование: 13 июл 2015
  8. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.403
    Симпатии:
    1.185
    unserialize предполагает наличие подключенного уязвимого класса.

    2й пример это выполнение кода через preg_replace с параметром e, eval туда нет смысла совать, он и без того выполнит почти любой php код.