hack

Nginx Misconfiguration

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