Directory traversal

What is directory traversal, and how to prevent it? | Web Security Academy

1. What is directory traversal?

  • Path traversal( hay còn gọi là Directory traversal) là một lỗ hổng web cho phép kẻ tấn công đọc các file không mong muốn trên server. Nó dẫn đến việc bị lộ thông tin nhạy cảm của ứng dụng như thông tin đăng nhập , một số file hoặc thư mục của hệ điều hành. Trong một số trường hợp cũng có thể ghi vào các files trên server, cho phép kẻ tấn công có thể thay đổi dữ liệu hay thậm chí là chiếm quyền điều khiển server.

2. Reading arbitrary files via directory traversal

  • Để hiểu rõ hơn cách khai thác của dạng này. Chúng ta đi vào ví dụ sau đây:
    • Một ứng dụng web thực hiện hiển thị ảnh. Ảnh được load và hiển thị bằng thẻ html sau:

      <img src="/loadImage?filename=218.png">
      
    • Khi chúng ta gửi một request với một param filename=test_image.png thì sẽ trả về nội dung của file được chỉ định với tệp hình ảnh ở /var/www/images/test_image.png.

    • Với ứng dụng không có cơ chế ngăn ngừa Path Traversal, attacker có thể thực hiện tấn công để đọc các file trong hệ thống.

      <https://hostname.abc/?filename=../../../etc/passwd>
      
      • Trong đó ../ là trở về thư mục cha của thư mục hiện tại. Như vậy với ../../../  thì từ thư mục /var/www/images đã trở về thư mục gốc và file /etc/passwdchính là file được đọc.

      • Trên các hệ điều hành dựa trên Unix thì /etc/passwd/ là một file chứa thông tin về các người dùng.

      • Trên Windows thì có thể dùng cả hai ../ và ..\\ để thực hiện việc tấn công này.

        <https://insecure-website.com/loadImage?filename=>..\\..\\..\\windows\\win.ini
        

3. Common obstacles (trở ngại) to exploiting file path traversal vulnerabilities

a. Strip

  • Ban đầu mình có gg nhưng cái này khá là khó tìm. Thì có thể hiểu đơn giản là cái này sẽ không hoàn toàn block các ký hiệu như . hoặc / mà chỉ loại bỏ 1,2,... các ký hiệu đó. Ví dụ như trong đường dẫn này
<https://hostname.abc/?filename=../../../etc/passwd>
  • Thì sau khi gặp strip . nó sẽ thành

    <https://hostname.abc/?filename=./././etc/passwd>
    
  • Vì vậy để khắc phục chúng ta có thể thêm 1,2,.. các ký tự đặc biệt trong payload như ....// hoặc ....\\/

Lab: File path traversal, traversal sequences stripped non-recursively | Web Security Academy

b. Sử dụng đường dẫn trực tiếp thay vì đường dẫn gián tiếp

  • Câu hỏi đặt ra là tại sao chúng ta không dùng đường dẫn trực tiếp thay vì đường dẫn gián tiếp để rồi gặp một mớ rắc rối vs strip và block. Ví dụ filename=/etc/passwd

Lab: File path traversal, traversal sequences blocked with absolute path bypass | Web Security Academy

c. URL Encoding

  • Trong một số trường hợp, như trong đường dẫn URL web server có thể strip bất cứ ký hiệu liên quan tới directory traversal trước khi đưa vào input.
  • Để ứng phó với trường hợp này, chúng ta có thể dùng url encoding.
    • Ví dụ: ../ ⇒ %2e%2e%2f or %252e%252e%252f

Lab: File path traversal, traversal sequences stripped with superfluous URL-decode | Web Security Academy

d. Start of path

  • Trong một số trường hợp khác, ứng dụng yêu cầu filename lại bắt đầu bằng một thư mục cơ sở nào đó. Lúc này payload của chúng ta sẽ thành:
filename=/var/www/images/../../../etc/passwd

Lab: File path traversal, validation of start of path | Web Security Academy

4. How to prevent a directory traversal attack

  • Nên validate input của người dùng trước khi xử lý nó.
  • Sử dụng whitelist cho những giá trị được cho phép.
  • Hoặc tên file là những kí tự số,chữ không nên chứa những ký tự đặc biệt.

Nhận xét