Найдите обход каталога в конфиге nginx с alias
Этот location в nginx отдаёт статику через alias. В нём есть обход каталога. Определите его и опишите исправление.
Ограничения:
- у префикса
locationнет завершающего слэша - цель
aliasоканчивается слэшем
location /assets {
alias /var/www/webapp/static/;
}
Определите причину.
Обход каталога через alias из-за отсутствия завершающего слэша у location. Раз у /assets нет завершающего слэша, nginx дописывает к alias часть URI после /assets как есть, поэтому /assets../app/db.php превращается в /var/www/webapp/app/db.php — на уровень выше static/. Фикс: добавить завершающий слэш и к location, и к alias.
- ✗Считать отсутствие завершающего слэша стилевым, а не security-изъяном
- ✗Думать, что nginx сам нормализует
..до сопоставления с alias - ✗Принимать обход каталога за раскрытие информации или DoS
- →Почему завершающий слэш на
locationустраняет дописывание остатка URI? - →Чем поведение
aliasотличается отrootпри сопоставлении пути?
Уязвимость
location /assets без завершающего слэша означает префиксное совпадение. nginx берёт часть URI после /assets и дописывает её к alias как есть:
location /assets {
alias /var/www/webapp/static/;
}
Запрос GET /assets../app/db.php → nginx подставляет ../app/db.php после static/ → /var/www/webapp/static/../app/db.php = /var/www/webapp/app/db.php. Это обход каталога на уровень выше.
Исправление
Дайте завершающий слэш и location, и alias:
location /assets/ {
alias /var/www/webapp/static/;
}
✅ Теперь nginx сопоставляет ровно /assets/ и дописывает остаток внутри static/. ⚠️ Несовпадение слэшей у location/alias — классическая мисконфигурация.