Почему оператор PHP include обрабатывает содержимое после '? /../' как путь из текущего каталога? - PullRequest
1 голос
/ 18 апреля 2020

При наличии скрипта temp.php в текущем каталоге пользователя ~:

#!/usr/bin/php
<?php
$p=$argv[$argc-1];
$a=file_exists($p);
echo "File exists?". $a ."\n";
include $p
?>

Используя приведенный выше скрипт, можно передать имя файла в качестве аргумента и получить его текстовое содержимое. Я не думаю, что у этого есть какие-либо практические применения, кроме иллюстрации моей проблемы. Однако некоторые решения CTF используют искаженную строку пути для включения любого файла. Кажется, что независимо от того, что предшествует строке '? /../' или существует ли она, следующее содержимое будет обрабатываться как путь из текущего каталога.

cd ~
# Make the script executable
chmod +x temp.php
# Create a temporary file
echo empty > empty

./temp.php empty # Output "File exists?1" and "empty". It's fine and expected.
./temp.php 'test?/../empty' # Ouput 'empty' and a newline
./temp.php 'test?/../../../../../etc/hosts' # Output contents in /etc/hosts

Я не могу найти связанный информация, документированная на PHP странице оператора включения . У кого-нибудь есть знания по этой топике c?

2020/04/18 21:06 Обновление. Моя PHP версия - 7.2.24 в Ubuntu 18.04.

2020/04/18 21:20 Обновление. Или, может быть, я понял, что проблема была вызвана .., а не вопросительным знаком ?. PHP include, кажется, разрушается подряд .. с. Мне все еще интересно, было ли это поведение где-то надлежащим образом задокументировано?

ubuntu@VM-0-5-ubuntu:~$ ./temp.php 'test/../empty'
File exists?
empty
ubuntu@VM-0-5-ubuntu:~$ ./temp.php 'test/../../ubuntu/empty'
File exists?
empty
ubuntu@VM-0-5-ubuntu:~$ 
...