What is Path Traversal?
Là một lỗ hổng cho phép attacker có thể đọc các file tùy ý ở trên server chạy ứng dụng chẳng hạn như:
- Mã nguồn và dữ liệu của ứng dụng.
- Credentials của các hệ thống back-end.
- Các file nhạy cảm của hệ điều hành.
Trong một số trường hợp, attacker có thể ghi dữ liệu vào các file tùy ý trên web server nhằm thay đổi hành vi hoặc dữ liệu của ứng dụng. Điều này cũng có thể giúp cho attacker chiếm quyền kiểm soát của ứng dụng.
Reading Arbitrary Files via Path Traversal
Giả sử ứng dụng load hình ảnh sử dụng HTML như sau:
<img src="/loadImage?filename=218.png" />Endpoint /loadImage nhận vào đường dẫn của file thông qua query param filename. Các file hình ảnh được lưu ở thư mục /var/www/images/.
Nếu ứng dụng không có các biện pháp bảo vệ khỏi path traversal attack, attacker có thể sử dụng URL sau để đọc nội dung của file /etc/passwd:
https://insecure-website.com/loadImage?filename=../../../etc/passwdFile /etc/passwd chứa thông tin chi tiết về các người dùng có trong hệ điều hành Linux.
Đối với Windows thì chuỗi ../ và chuỗi ..\đều có thể được dùng để tấn công path traversal. Ví dụ:
https://insecure-website.com/loadImage?filename=..\..\..\windows\win.iniLab: File Path Traversal, Simple Case
Mô tả lab:
- Tồn tại lỗ hổng path traversal trong tính năng hiển thị hình ảnh.
- Mục tiêu là đọc file
/etc/passwd.
URL sử dụng là:
/image?filename=../../../etc/passwdCommon Obstacles to Exploiting Path Traversal Vulnerabilities
Nếu ứng dụng xóa bỏ hoặc chặn chuỗi directory traversal (../ hoặc ..\) thì ta vẫn có thể bypass bằng cách sử dụng những kỹ thuật sau:
Lab: File Path Traversal, Traversal Sequences Blocked with Absolute Path Bypass
Dùng đường dẫn tuyệt đối chẳng hạn như /etc/passwd để truy cập đến file thay vì dùng đường dẫn tương đối.
Mô tả lab:
- Tồn tại lỗ hổng path traversal trong tính năng hiển thị hình ảnh.
- Ứng dụng chặn chuỗi directory traversal.
- Mục tiêu là đọc file
/etc/passwd.
Nếu sử dụng chuỗi directory traversal thì ta nhận được response sau:
HTTP/2 400 Bad Request
Content-Type: application/json; charset=utf-8
X-Frame-Options: SAMEORIGIN
Content-Length: 14
"No such file"Thậm chí, nó còn chặn từng ký tự trong chuỗi directory traversal. Ví dụ, khi sử dụng URL là /image?filename=52.jpg thì vẫn nhận được nội dung của hình ảnh nhưng nếu sử dụng URL là /image?filename=52.jpg/ thì sẽ nhận được response như trên.
URL sử dụng là:
/image?filename=/etc/passwdLab: File Path Traversal, Traversal Sequences Stripped Non-recursively
Nếu ứng dụng xóa bỏ chuỗi directory traversal mà không đệ quy (chỉ xóa một lần) thì ta có thể dùng các chuỗi directory traversal lồng nhau chẳng hạn như ....// hoặc ....\/.
Mô tả lab:
- Tồn tại lỗ hổng path traversal trong tính năng hiển thị hình ảnh.
- Ứng dụng xóa bỏ các ký tự có trong chuỗi directory traversal.
- Mục tiêu là đọc file
/etc/passwd.
Nếu sử dụng URL là /image?filename=../1.png thì ta vẫn nhận được nội dung của hình ảnh. Điều này cho thấy chuỗi ../ đã bị xóa.
URL sử dụng là:
/image?filename=....//....//....//etc/passwdLab: File Path Traversal, Traversal Sequences Stripped with Superfluous URL-decode
Sử dụng URL encoding hoặc double URL encoding cho chuỗi ../. Kết quả có thể là %2e%2e%2f hoặc %252e%252e%252f. Cũng có thể sử dụng một số dạng encoding không chuẩn chẳng hạn như ..%c0%af hoặc ..%ef%bc%8f.
Mô tả lab:
- Tồn tại lỗ hổng path traversal trong tính năng hiển thị hình ảnh.
- Ứng dụng xóa bỏ các ký tự có trong chuỗi directory traversal và thực hiện URL decode input trước khi sử dụng.
- Mục tiêu là đọc file
/etc/passwd.
Dùng URL là /image?filename=..//1.jpg hoặc /image?filename=....//1.jpg thì đều nhận được nội dung của hình ảnh. Điều này cho thấy các ký tự trong chuỗi directory traversal đã bị xóa bỏ (một cách đệ quy).
Sử dụng URL sau:
/image?filename=%252E%252E%252F%252E%252E%252F%252E%252E%252Fetc/passwdURL trên sử dụng double URL encoding cho 3 chuỗi directory traversal. Dạng decode là:
/image?filename=../../../etc/passwdLab: File Path Traversal, Validation of Start of Path
Một số ứng dụng bắt buộc đường dẫn phải có một prefix nào đó chẳng hạn như /var/www/images. Đối với trường hợp này thì ta vẫn có thể sử dụng các chuỗi directory traversal.
Ví dụ:
/var/www/images/../../../etc/passwdMô tả lab:
- Tồn tại lỗ hổng path traversal trong tính năng hiển thị hình ảnh.
- Ứng dụng bắt buộc đường dẫn phải có tiền tố là thư mục được chỉ định.
- Mục tiêu là đọc file
/etc/passwd.
Thư mục được chỉ định là /var/www/images. Sử dụng URL như sau:
/image?filename=/var/www/images/../../../etc/passwdLab: File Path Traversal, Validation of File Extension with Null Byte Bypass
Ứng dụng có thể yêu cầu user input kết thúc bằng một file extension nào đó chẳng hạn như .png. Trong trường hợp này, ta có thể thêm vào null byte trước file extension để ngắt file path.
Ví dụ:
filename=../../../etc/passwd%00.pngMô tả lab:
- Tồn tại lỗ hổng path traversal trong tính năng hiển thị hình ảnh.
- Ứng dụng bắt buộc đường dẫn phải kết thúc bằng file extension được chỉ định.
- Mục tiêu là đọc file
/etc/passwd.
File extension được chỉ định là .png. Sử dụng URL như sau:
/image?filename=../../../etc/passwd%00.pngHow to Prevent a Path Traversal Attack
Cách hiệu quả nhất để chống path traversal attack là không truyền user input vào file system API. Nếu không tránh khỏi được việc này thì có thể dùng 2 lớp phòng thủ như sau:
- Validate user input trước khi sử dụng. Lý tưởng nhất là sử dụng một whitlist các ký tự được phép.
- Sau khi validate thì nối user input vào một base directory và dùng file system API để chuẩn hóa đường dẫn. Cần phải đảm bảo rằng đường dẫn được chuẩn hóa có tiền tố là base directory.
Ví dụ bên dưới là đoạn code Java giúp validate đường dẫn chuẩn hóa của một file dựa trên user input:
File file = new File(BASE_DIRECTORY, userInput);
if (file.getCanonicalPath().startsWith(BASE_DIRECTORY)) {
// process file
}