1. 1
  2. 2
  3. 3
  4. 4
  5. 5

# конспект · шаг 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 сегодня ничего не говорит о том, что отдавалось вчера, - найденную утечку считают состоявшейся.

Комментарии

Пока нет комментариев. Будь первым!

Оставить комментарий

Комментарий появится после проверки. Email не публикуется. Войти, чтобы не вводить имя каждый раз.