Những ví dụ về Nginx Misconfiguration có thể khiến lộ dữ liệu nhạy cảm và Docker Compose để tái tạo chúng
Nguồn: haova/nginx-misconfig
Môi trường
Để thiết lập môi trường và chạy các ví dụ dưới đây, sử dụng Docker Compose:
cd <repo-dir>
docker compose up
Để dừng, nhấn Ctrl+C hoặc chạy:
docker compose down
Các vấn đề
Alias Traversal
alias định nghĩa sự thay thế cho location được chỉ định. Tuy nhiên, nếu bạn cấu hình một location không có dấu / ở cuối trong khi giá trị alias kết thúc bằng /, kẻ tấn công có thể truy cập lên các thư mục cha.
Ví dụ:
location /public {
alias /usr/share/nginx/public/;
}
Khi bạn yêu cầu http://localhost:8080/public/content.txt, nginx thay thế phần /public bằng /usr/share/nginx/public/, vì vậy đường dẫn tệp được phân giải là /usr/share/nginx/public//content.txt.
Bằng cách sử dụng .. (điều hướng lên thư mục cha), kẻ tấn công có thể truy cập các thư mục cha qua http://localhost:8080/public../secret.txt, đường dẫn này được phân giải thành /usr/share/nginx/public/../secret.txt.
Nếu location được sửa thành /public/, kẻ tấn công không thể truy cập http://localhost:8080/public../secret.txt nữa vì nó không khớp với location. Nếu kẻ tấn công sử dụng http://localhost:8080/public/../secret.txt, nginx chuẩn hóa .. trong đường dẫn thành /secret.txt trước khi khớp location, vì vậy yêu cầu không còn khớp với location /public/ và việc vượt thư mục thất bại.
Các lệnh kiểm tra:
# public content
curl localhost:8080/public/content.txt
# secret content
curl localhost:8080/public../secret.txt
Absolute Redirect
Trong nginx, absolute_redirect mặc định là on. Khi một yêu cầu chuyển hướng được kích hoạt, nginx luôn tạo một URL chuyển hướng tuyệt đối có định dạng Location: [scheme]://[server_name]:[port][request_uri].
Điều này có thể làm lộ thông tin nhạy cảm, chẳng hạn như IP/cổng gốc.
Ví dụ, với alias, nginx chuyển hướng một location không có dấu gạch chéo (/) cuối đến URL kết thúc bằng dấu gạch chéo (localhost:8080/public -> localhost:8080/public/). Kết hợp với absolute_redirect, nguồn gốc máy chủ sẽ bị lộ.
curl -i localhost:8080/public
Kết quả:
HTTP/1.1 301 Moved Permanently
Server: nginx/1.31.4
Date: Sun, 23 Aug 2026 15:09:11 GMT
Content-Type: text/html
Content-Length: 169
Location: http://localhost:8080/public/
Connection: keep-alive
Điều này rất nguy hiểm khi máy chủ nằm sau WAF/proxy như Cloudflare.
Scan
Để phát hiện các vấn đề trong web của bạn, bạn có thể sử dụng nuclei.
nuclei -u localhost:8080 -no-interactsh -tags nginx,misconfig,traversal