# конспект · шаг 5 из 5
Конспект: типовые дыры
Шесть дыр, которые находят в чужих конфигах чаще всего.
1. alias-traversal
location /files { # ← нет слеша
alias /var/www/shop/uploads/;
}
URI /files../backup.sql
получилось /var/www/shop/uploads/../backup.sql → /var/www/shop/backup.sql
Правило одной фразой: alias - только с location, оканчивающимся на /, и
сам alias тоже со слешем. Нужен префикс без слеша - бери root.
2. .git и .env в корне сайта
location ~ /\.(?!well-known) {
deny all;
}
Исключение для .well-known обязательно - иначе сломается выпуск сертификатов.
3. autoindex on, оставленный после отладки
Листинг каталога показывает бэкапы, дампы и старые версии файлов.
4. Исполнение загруженных файлов
location ~ ^/uploads/.*\.php$ { deny all; } # до общей php-локации
5. Потерянные заголовки безопасности
Один add_header в location отменяет все унаследованные. С 1.29.3 есть
add_header_inherit on|off|merge, но по умолчанию правило прежнее - всё или
ничего.
6. server_tokens on
server_tokens off; # не сообщать точную версию в ответах и на страницах ошибок
Что ещё стоит знать
max_headers(1.29.8, умолчание 1000) - до неё число заголовков не ограничивал никто;- CVE-2026-27654 - переполнение буфера в
COPY/MOVEв location сalias, закрыт в 1.29.7; secure_link- ссылки с подписью и сроком годности;valid_referers- защита от хотлинка (но не от воровства контента).
Ловушка джокера
Проверять безопасность конфига чтением. Все шесть дыр проверяются curl'ом
за минуту: запрос с .., запрос к /.git/config, запрос к загруженному
.php, curl -I на заголовки. Читать глазами - значит найти половину.
Что показал стенд
| запрос | голый конфиг | с двумя запретами |
|---|---|---|
/.env |
200, DB_PASS=secret |
403 |
/.git/HEAD |
200 | 403 |
/dump.sql |
200 | 403 |
/files/ при autoindex on |
200, список файлов | - |
/trav../secrets/db.env при location /trav с alias |
200, содержимое | 404 со слешем |
server_tokens off меняет Server: nginx/1.31.5 на Server: nginx - убирает
версию, но не продукт.
Список проверок для чужого конфига
for p in /.env /.git/HEAD /.git/config /dump.sql /config.php.bak \
/uploads../etc/passwd /files/ /server-status /stub_status; do
printf '%-28s %s\n' "$p" "$(curl -s -o /dev/null -w '%{http_code}' https://shop.local$p)"
done
Любая двухсотка - находка. И помни: 403 сегодня ничего не говорит о том, что отдавалось вчера, - найденную утечку считают состоявшейся.
Комментарии
Пока нет комментариев. Будь первым!
Оставить комментарий