Я тестирую одно из наших веб-приложений PHP на предмет проблем безопасности.
Система, на которой работает код, работает как минимум с PHP7.2.
Теперь я нашел что-то вроде следующего в коде (упрощенный для этого вопроса, но сводится к этому):
$file = $_GET['file'];
$path = "/some/directory/" . $file;
$path = str_replace(['../', '..'], '', $path);
echo file_get_contents($path);
Можно ли изменить параметр файла таким образом, чтобымы можем избежать /some/directory
, так что после str_replace()
вызов file_get_contents()
будет выглядеть примерно так: file_get_contents(/some/directory/../../etc/passwd)
?
Редактировать:
Я не могу изменить порядок выполнения кода.Я могу определить значение $_GET['file']
только по моей просьбе.
Кроме того, я знаю, как сделать это более безопасным, но для своих исследований я собираюсь его разбить.
По сути, что-то нужно сделать, так или иначеобманом str_replace()
оставив немного ../
.
Я пытался в течение нескольких часов с различными подходами, но - к счастью для нашего приложения - не смог заставить его работать.
У вас есть какие-нибудь идеи?
Вы можете поиграть с кодом здесь: https://3v4l.org/3ehYA