Path Traversal
Last updated
Last updated
Path traversal còn được gọi là directory traversal. Các lỗ hổng này cho phép kẻ tấn công đọc các tệp tùy ý trên máy chủ đang chạy ứng dụng. Điều này có thể bao gồm:
Mã ứng dụng và dữ liệu.
Chứng chỉ cho các hệ thống phụ trợ.
Các tập tin hệ điều hành nhạy cảm.
Trong một số trường hợp, kẻ tấn công có thể ghi vào các tệp tùy ý trên máy chủ, cho phép chúng sửa đổi dữ liệu hoặc hành vi của ứng dụng và cuối cùng là chiếm toàn quyền kiểm soát máy chủ.
Ví dụ một ứng dụng hiển thị hình ảnh sử dụng HTML sau:
<img src="/loadImage?filename=218.png">
Các tệp hình ảnh được lưu trữ trên đĩa ở vị trí /var/www/images/
. Ưng dụng đọc hình ảnh từ đường dẫn tệp sau:
/var/www/images/218.png
Ứng dụng này không triển khai bất kỳ biện pháp phòng thủ nào chống lại các cuộc tấn công vượt đường dẫn. Do đó, kẻ tấn công có thể yêu cầu URL sau để lấy tệp /etc/passwd
từ hệ thống tệp của máy chủ:
https://insecure-website.com/loadImage?filename=../../../etc/passwd
Trên Windows, cả hai ../
và ..\
đều là chuỗi duyệt thư mục hợp lệ. Sau đây là ví dụ về một cuộc tấn công tương đương vào máy chủ chạy Windows:
https://insecure-website.com/loadImage?filename=..\..\..\windows\win.ini
Nhiều ứng dụng đưa dữ liệu đầu vào của người dùng vào đường dẫn tệp triển khai biện pháp phòng thủ chống lại các cuộc tấn công theo đường dẫn. Những biện pháp này thường có thể bị bỏ qua.
Nếu một ứng dụng xóa hoặc chặn các chuỗi duyệt thư mục khỏi tên tệp do người dùng cung cấp, thì có thể bỏ qua biện pháp phòng thủ này bằng nhiều kỹ thuật khác nhau.
Có thể sử dụng đường dẫn tuyệt đối từ root, chẳng hạn như filename=/etc/passwd
, để tham chiếu trực tiếp đến một tập tin mà không cần sử dụng bất kỳ trình tự duyệt nào.
Có thể sử dụng chuỗi duyệt lồng nhau với các ứng dụng áp dụng xóa các chuỗi duyệt thư mục, chẳng hạn như ....//
hoặc ....\/
. Chúng sẽ trở lại thành chuỗi duyệt đơn giản khi chuỗi bên trong bị xóa.
Trong một số trường hợp, URL hoặc tham số filename của multipart/form-data
request, web server có thể xóa bất kỳ chuỗi duyệt thư mục nào trước khi truyền dữ liệu đầu vào đến ứng dụng. Có thể vượt qua quá trình lọc này bằng cách mã hóa URL hoặc thậm chí mã hóa URL hai lần các ký tự ../
. Điều này tạo ra %2e%2e%2f
và %252e%252e%252f
tương ứng. Ngoài ra, các mã hóa không chuẩn như ..%c0%af
hoặc ..%ef%bc%8f
cũng có thể hoạt động trong một số trường hợp.
Ứng dụng có thể yêu cầu tên tệp do người dùng cung cấp bắt đầu bằng thư mục cơ sở dự kiến, chẳng hạn như /var/www/images
. Trong trường hợp này, có thể bao gồm thư mục cơ sở bắt buộc theo sau là trình tự duyệt phù hợp. Ví dụ: filename=/var/www/images/../../../etc/passw
Một ứng dụng có thể yêu cầu tên tệp do người dùng cung cấp kết thúc bằng phẩn mở rộng mong muốn. Trong trường hợp này, có thể sử dụng byte null để kết thúc đường dẫn tệp trước phần mở rộng bắt buộc. Ví dụ: filename=../../../etc/passwd%00.png
.
Hiệu quả nhất là tránh hoàn toàn việc truyền dữ liệu đầu vào do người dùng cung cấp cho các API hệ thống tệp.
Nếu không thì nên sử dụng hai lớp bảo vệ để ngăn chặn các cuộc tấn công:
Xác thực dữ liệu đầu vào trước khi xử lý: Sử dụng whilelist hoặc xác minh rằng dữ liệu đầu vào chỉ chứa các nội dung được phép, chẳng hạn như chỉ ký tự chữ và số.
Sau khi xác thực dữ liệu đầu vào, hãy thêm dữ liệu đó vào thư mục gốc và sử dụng API hệ thống tệp của nền tảng để chuẩn hóa đường dẫn. Xác minh rằng đường dẫn chuẩn hóa bắt đầu với thư mục gốc mong đợi.
Ví dụ: Xác thực đường dẫn chuẩn hóa của tệp dựa trên dữ liệu đầu vào của người dùng: