csrf — Как я могу предотвратить SSRF через pathinfo, передавая URL в PHP?

После сканирования нашего кода с использованием 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;
}
?>

2

Решение

Источник, если проблема в вашем случае заключается в том, что с вашего сервера будет пытаться получить данные с любого переданного URL. Учитывая это имеет http://google.com внутри url параметр, скрипт ответит фактическим содержанием сайта Google.

Почему это плохо? Например, это может быть использовано для обхода настроек брандмауэра, доступа к внутренней сети вашего сервера или загрязнения соединений сокетов, так что ваш сервер не сможет подключиться или подключиться к нему и станет не отвечающим.

Прежде всего вы должны подумать, действительно ли вы хотите обслуживать ваши статические файлы с помощью PHP. Скорее всего, эту ответственность можно делегировать веб-серверу. Можно даже «обслуживать» статический контент со стороннего веб-сайта текущими веб-серверами, поэтому вам следует серьезно подумать об избавлении от этого кода.

Если вы на 100% уверены, что хотите использовать с PHP в этом случае, вы должны добавить ограничения в свой код.

  1. добавить белый список доменов, чтобы разрешить использование списка доверенных доменов только внутри url переменная;
  2. не обрабатывать файлы с неизвестными расширениями.

В этом случае код будет выглядеть так:

<?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);
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]