После сканирования нашего кода с использованием Acunetix на наличие уязвимостей у нас возникла проблема со следующим сценарием, который сказал:
«HTTP-запрос был инициирован для домена hit0yPI7kOCzl.bxss.me
который указывает, что этот сценарий уязвим для SSRF (сторона сервера
Запрос подделки).
Как я могу предотвратить это?
<?php
$filename = strip_tags($_GET['url']);
if (substr($filename,0,4) !== 'http') {
die("Need a valid URL...");
}
$ext = pathinfo($filename, PATHINFO_EXTENSION);switch ($ext) {
case "gif":
header('Content-Type: image/gif');
readfile($filename);
break;
case "png":
header('Content-Type: image/png');
readfile($filename);
break;
case "jpg":
default:
header('Content-Type: image/jpeg');
readfile($filename);
break;
}
?>
Источник, если проблема в вашем случае заключается в том, что с вашего сервера будет пытаться получить данные с любого переданного URL. Учитывая это имеет http://google.com
внутри url
параметр, скрипт ответит фактическим содержанием сайта Google.
Почему это плохо? Например, это может быть использовано для обхода настроек брандмауэра, доступа к внутренней сети вашего сервера или загрязнения соединений сокетов, так что ваш сервер не сможет подключиться или подключиться к нему и станет не отвечающим.
Прежде всего вы должны подумать, действительно ли вы хотите обслуживать ваши статические файлы с помощью PHP. Скорее всего, эту ответственность можно делегировать веб-серверу. Можно даже «обслуживать» статический контент со стороннего веб-сайта текущими веб-серверами, поэтому вам следует серьезно подумать об избавлении от этого кода.
Если вы на 100% уверены, что хотите использовать с PHP в этом случае, вы должны добавить ограничения в свой код.
url
переменная;В этом случае код будет выглядеть так:
<?php
$whitelist = [
'some.whitelisted.com',
'other.whitelisted.com'
];
$extensionMap = [
'gif' => 'image/gif',
'png' => 'image/png',
'jpg' => 'image/jpeg',
'jpeg' => 'image/jpeg'
];
$filename = strip_tags($_GET['url']);
$host = parse_url($filename, PHP_URL_HOST);
if(empty($host) || !in_array($host, $whitelist)) {
header('HTTP/1.1 404 Not Found');
exit;
}
$ext = pathinfo($filename, PATHINFO_EXTENSION);
if(!isset($extensionMap[$ext])) {
header('HTTP/1.1 404 Not Found');
exit;
}
header(sprintf('Content-Type: %s', $extensionMap[$ext]));
readfile($filename);
Других решений пока нет …