Что называется {$ {phpinfo()}}? (Выполнение удаленной команды)

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

Теперь, на вопрос. В качестве примера я воспользуюсь уязвимостью выполнения удаленных команд.

<?php echo preg_replace('/(.*)/e', 'strtoupper("\\1")', $argv[1]); ?>

Чтобы использовать это, злоумышленник просто вводит {${phpinfo()}}, например. Мои вопросы таковы:

  • Что такое фигурные скобки {}, и почему это выглядит как переменная?
  • Есть ли у него какое-то имя? Я не верю, что это переменная функция, поскольку они разные, нет?

Спасибо!

Ответ 1

Это сложный (фигурный) синтаксис.

Функции, вызовы методов, статические переменные класса и константы класса  внутри {$} работает с PHP 5. Однако доступная ценность будет интерпретируется как имя переменной в области, в которой строка определено. Использование отдельных фигурных скобок ({}) не будет работать для доступа возвращаемые значения функций или методов или значения класса константы или переменные статического класса.

Итак, для простой переменной будет работать один {}, например "{$foo}", но phpinfo() - это функция, когда вам нужно ее вызвать, вам нужно два {}, которые в вашем примере "{${phpinfo()}}", который вызовет функцию phpinfo().

И поэтому модификатор e обескуражен, например, отображая это

{${eval($_GET['php_code'])}}, что дает злоумышленнику возможность выполнять произвольный PHP-код и, как таковой, дает ему почти полный доступ к вашему серверу.

Чтобы предотвратить это, используйте preg_replace_callback().