Эксплуатация file_get_contents()
Можно ли прочитать какой-либо файл (не только с расширением .html) с сервера в следующем сценарии?
<?php
echo file_get_contents($_GET['display'].'.html');
?>
Я знаю про фантики (php://
, file://
и т. д.) но добились не слишком многого.
Я жажду услышать все возможные векторы атаки.
Конфигурация PHP по умолчанию:allow_url_fopen On
и давайте предположим, что версия >= 7.0
нулевой символ %00
не работает
3 ответа
Нет, это будет когда-либо читать только файлы, заканчивающиеся на ".html", но это не обязательно означает, что это безопасно! Как правило, чем больше вы можете дезинфицировать и ограничивать входные данные, тем лучше.
Также для тех, кто планирует использовать file_get_contents
так всегда полезно помнить, что при подаче из file_get_contents
вы можете обслуживать файлы, которые обычно не доступны - либо из-за конфигурации сервера, например .htaccess
или файл разрешений.
Как сказал @David, файлы будут заканчиваться только на ".html", но это не очень хорошая практика, если у вас есть html
папку, и вы хотите, чтобы пользователь получал только файлы из этой папки, вы не должны этого делать, используя этот метод, хакер может получить доступ к любому .html
файл на вашем сервере, а не только те, которые вы хотите, чтобы он увидел.
Мое предложение, если у вас есть определенная папка, из которой вы хотите, чтобы пользователь мог получать файлы, отсканируйте папку и проверьте имя файла.
вот пример:
<?php
$paths = scandir('/html');
$file = isset($_GET['display']) : $_GET['display'] ? null;
if(!$file)
{
die('no display provided');
}
$html = '';
foreach($paths as $path) {
if($path !== '.' && $path !== '..' && $path === $file.'.html') {
$html = file_get_contents($path);
}
}
echo $html;
?>
Exploidale в качестве прокси:
http://example.com/script.php?display=https://hackme.com/passwords%3Extension%3D
echo file_get_contents("https://hackme.com/passwords?Extension=.html")
Ваш IP будет зарегистрирован на компьютере hackme.com и вернет вам несколько паролей (если повезет).