Server-side vulnerabilities - Path traversal

 

Bài viết gốc

Path traversal

Trong phần này, tôi sẽ giải thích:

  • Lỗ hổng đường dẫn là gì.
  • Cách thực hiện các cuộc tấn công xuyên đường và vượt qua các cách phòng chống thông thường.
  • Cách ngăn chặn lỗ hổng đường dẫn.




What is path traversal?

Lỗ hổng duyệt đường dẫn còn được gọi là lỗ hổng duyệt thư mục. Những lỗ hổng này cho phép kẻ tấn công đọc các tập tin bất kỳ trên máy chủ đang chạy ứng dụng. Điều này có thể bao gồm:

  • Mã và dữ liệu của ứng dụng.
  • Thông tin xác thực cho hệ thống back-end.
  • 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 tin bất kỳ trên máy chủ, cho phép họ thay đổi dữ liệu hoặc hành vi của ứng dụng, và cuối cùng là kiểm soát hoàn toàn máy chủ.

Reading arbitrary files via path traversal

Hãy tưởng tượng một ứng dụng mua sắm hiển thị hình ảnh của các mặt hàng bán. Ứng dụng này có thể tải một hình ảnh bằng cách sử dụng HTML sau:

<img src="/loadImage?filename=218.png">

URL  loadImage nhận một tham số filename và trả về nội dung của tệp được chỉ định. Các tệp hình ảnh được lưu trữ trên đĩa ở vị trí /var/www/images/. Để trả về một hình ảnh, ứng dụng nối tên tệp được yêu cầu với thư mục gốc này và sử dụng một API hệ thống tệp để đọc nội dung của tệp. Nói cách khác, ứng dụng đọc từ đường dẫn tệp sau:

/var/www/images/218.png

Ứng dụng này không thực hiện bất kỳ biện pháp phòng thủ nào chống lại các cuộc tấn công đường dẫn. Do đó, một 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

Điều này khiến ứng dụng đọc từ đường dẫn tệp sau:

/var/www/images/../../../etc/passwd

Chuỗi ../ là hợp lệ trong một đường dẫn tệp và có nghĩa là bước lên một cấp trong cấu trúc thư mục. Ba chuỗi ../ liên tiếp bước lên từ /var/www/images/ đến gốc của hệ thống tệp, và do đó tệp thực sự được đọc là:

/etc/passwd

Trên các hệ điều hành dựa trên Unix, đây là một tệp tiêu chuẩn chứa chi tiết của các người dùng được đăng ký trên máy chủ, nhưng một kẻ tấn công có thể lấy các tệp bất kỳ khác bằng cách sử dụng kỹ thuật tương tự.

Trên Windows, cả ../ và ..\ đều là các chuỗi di chuyển thư mục hợp lệ. Sau đây là một ví dụ về một cuộc tấn công tương đương chống lại máy chủ dựa trên Windows:

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


Lab: File path traversal, simple case

Bài thực hành này chứa lỗ hổng duyệt đường dẫn trong việc hiển thị hình ảnh sản phẩm. 

Để giải quyết bài thực hành, lấy nội dung của file /etc/passwd .

ACCESS THE LAB

Solution:

1. Sử dụng Burp Suite để chặn và sửa đổi yêu cầu tìm nạp hình ảnh sản phẩm.
Truy cập trang web, kiểm tra thẻ image thấy src= /image?filename=72.jpg  


2. Thay đổi tham số filename:

 Mở đường link sang 1 tab khác hoặc sử dụng Repeter của BS để gửi request mò đến cái đường dẫn /etc/passwd.  Sau vài lần thử 
../../../etc/passwd

3. Quan sát xem Response có chứa nội dung của tệp 
/etc/passwd không.





Thông báo thành công





Mô phỏng lại code trong chương trình

Mặc dù hệ thống sử dụng PHP và mình không code PHP nhưng vẫn có thể mô phỏng lại bằng Nodejs để có thể hiểu hơn về cách lỗ hổng xảy ra.

Mình đã tạo sẵn file ảnh và file passwd như trong hình 


Ở lab vừa rồi, filename không được xử lý gì nên sử dụng ../../../ để có thể đọc được đến file passwd




Common obstacles to exploiting path traversal vulnerabilities

Nhiều ứng dụng đặt dữ liệu nhập của người dùng vào đường dẫn tệp thực hiện các biện pháp phòng thủ chống lại các cuộc tấn công duyệt đường dẫn. Những biện pháp này thường có thể bị vượt qua.

Nếu một ứng dụng loại bỏ hoặc chặn các chuỗi duyệt thư mục từ tên tệp do người dùng cung cấp, có thể có khả năng vượt qua biện pháp phòng thủ bằng nhiều kỹ thuật khác nhau.

Bạn có thể sử dụng một đường dẫn tuyệt đối từ gốc hệ thống tập tin, chẳng hạn như filename=/etc/passwdđể trực tiếp tham chiếu đến một tệp mà không sử dụng bất kỳ chuỗi duyệt nào.

Lab: File path traversal, traversal sequences blocked with absolute path bypass

Lab này chứa một lỗ hổng duyệt đường dẫn trong việc hiển thị hình ảnh sản phẩm. 

Ứng dụng chặn các chuỗi duyệt thư mục nhưng xử lý tên tệp được cung cấp như là tương đối với một thư mục làm việc mặc định.

Để giải quyết lab, lấy nội dung của tệp /etc/passwd.

ACCESS THE LAB


Solution

  1. Sử dụng Burp Suite để chặn và sửa đổi yêu cầu tìm nạp hình ảnh sản phẩm.
  2. Chỉnh sửa tham sốfilename, cho nó giá trị /etc/passwd.



Đôi khi bạn có thể sử dụng các chuỗi truyền tải lồng nhau, chẳng hạn như ....// hoặc ....\/. Chúng trở lại thành ../ khi qua quá trình xử lý bị loại bỏ.
Ví dụ bằng code cho dễ hiểu





Lab: File path traversal, traversal sequences stripped non-recursively

Lab này chứa một lỗ hổng duyệt đường dẫn trong việc hiển thị hình ảnh sản phẩm. 

Ứng dụng loại bỏ các chuỗi truyền tải đường dẫn khỏi tên tệp do người dùng cung cấp trước khi sử dụng.

Để giải quyết lab, lấy nội dung của tệp /etc/passwd.

ACCESS THE LAB

Solution

  1. Sử dụng Burp Suite để chặn và sửa đổi yêu cầu tìm nạp hình ảnh sản phẩm.
  2. Sửa đổi tham số filename cho nó giá trị: ....//....//....//etc/passwd


Mô phỏng bằng code

Do việc xử lý input còn đơn giản nên vẫn tồn tại lỗ hổng.


Trong một số trường hợp, chẳng hạn như trong đường dẫn URL hoặc tham số filename của yêu cầu multipart/form-data, máy chủ web có thể xóa bỏ bất kỳ chuỗi điều hướng thư mục nào trước khi truyền đầu vào của bạn cho ứng dụng. Bạn có thể đôi khi vượt qua việc làm sạch này bằng cách mã hóa URL, hoặc thậm chí là mã hóa URL hai lần các ký tự ../. Nó sẽ trở thành %2e%2e%2f và %252e%252e%252f. Các mã hóa không theo tiêu chuẩn khác như ..%c0%af hoặc ..%ef%bc%8fcũng có thể hoạt động.

Đối với người dùng Burp Suite Professional, Burp Intruder cung cấp danh sách payload được xác định trước Fuzzing - path traversal. Phần này chứa một số trình tự truyền tải đường dẫn được mã hóa mà bạn có thể thử.

Lab: File path traversal, traversal sequences stripped with superfluous URL-decode

Lab này chứa một lỗ hổng duyệt đường dẫn trong việc hiển thị hình ảnh sản phẩm.

Ứng dụng chặn đầu vào chứa các chuỗi truyền tải đường dẫn. Sau đó, nó thực hiện giải mã URL của đầu vào trước khi sử dụng.

Để giải quyết lab, lấy nội dung của tệp /etc/passwd.

ACCESS THE LAB

Solution

  1. Sử dụng Burp Suite để chặn và sửa đổi yêu cầu tìm nạp hình ảnh sản phẩm.
  2. Giờ dựa vào các kết quả từ những phần trước và các hướng dẫn mình tạo một danh sách input và sử dụng tính năng Burp Intruder để làm cho nhanh:

Chuyển sang tab payload và dán cái danh sách sau vào mục payload settings:

/etc/passwd
../../../etc/passwd
....//....//....//etc/passwd
%2e%2e%2f%2e%2e%2f%2e%2e%2fetc/passwd
%252e%252e%252f%252e%252e%252f%252e%252e%252fetc/passwd
..%2f..%2f..%2fetc/passwd
..%252f..%252f..%252fetc/passwd
%2e%2e/%2e%2e/%2e%2e/etc/passwd
%252e%252e/%252e%252e/%252e%252e/etc/passwd
-------bổ sung chưa thử
..%c0%af..%c0%af..%c0%afetc/passwd
..%ef%bc%8f..%ef%bc%8f..%ef%bc%8fetc/passwd



Ấn Start Attack và xem kết quả: 

Vượt mong đợi khi mà có tận 3 input thành công

Mô phỏng code

Theo mô tả chương trình chặn đầu vào chứa các chuỗi truyền tải đường dẫn. Sau đó, nó thực hiện giải mã URL của đầu vào trước khi sử dụng. Do giải mã 2 lần nên những input encode 1 lần sẽ không vượt qua được



Ứng dụng có thể yêu cầu tên tệp do người dùng cung cấp phải bắt đầu bằng thư mục được yêu cầu, chẳng hạn như /var/www/images. Trong trường hợp này, có thể bao gồm thư mục được yêu cầu theo sau là các trình tự duyệt phù hợp. Ví dụ:

filename=/var/www/images/../../../etc/passwd

Lab: File path traversal, validation of start of path

Lab này chứa một lỗ hổng duyệt đường dẫn trong việc hiển thị hình ảnh sản phẩm.

Ứng dụng truyền đường dẫn tệp đầy đủ qua một tham số yêu cầu và xác thực rằng đường dẫn được cung cấp bắt đầu bằng thư mục mong muốn.

Để giải quyết lab, lấy nội dung của tệp /etc/passwd.

ACCESS THE LAB

Solution

  1. Sử dụng Burp Suite để chặn và sửa đổi yêu cầu tìm nạp hình ảnh sản phẩm.
  2. Nhìn qua cái link nó lại đọc từ /var/www/images


Thử sửa thành /etc/passwd xem thế nào

Vậy là bắt buộc phải có /var/www/images/ nên nhanh trí sửa lại thành /var/www/images/../../../etc/passwd

Trông thì hay ho chứ thực tế chắc chả ông dev nào để đọc thẳng file từ /var/www/images/ như lab này.

Mô phỏng code

Chỉ kiểm tra đơn giản bằng chuỗi bắt buộc /var/www/images/ nên dễ dàng có thể vượt qua.



Một ứng dụng có thể yêu cầu tên tệp do người dùng cung cấp phải kết thúc bằng một phần mở rộng tệp mong đợi, chẳng hạn như.png. Trong trường hợp này, có thể có khả năng sử dụng một 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

Lab: File path traversal, validation of file extension with null byte bypass

Lab này chứa một lỗ hổng duyệt đường dẫn trong việc hiển thị hình ảnh sản phẩm.

Ứng dụng xác thực rằng tên tệp được cung cấp kết thúc bằng phần mở rộng tệp yêu cầu.

Để giải quyết lab, lấy nội dung của tệp /etc/passwd.

ACCESS THE LAB

Solution

  1. Sử dụng Burp Suite để chặn và sửa đổi yêu cầu tìm nạp hình ảnh sản phẩm.
  2. Sửa tham số filename, cho nó giá trị: ../../../etc/passwd%00.png


Mô phỏng code

Vì %00 chỉ có tác dụng trên PHP nên mình có mô phỏng lại việc sẽ cắt hết các ký tự phía sau đi.
Kiểm tra định dạng file qua các đuôi ảnh cũng khá sơ sài
Bài học ở đây là không code như các đoạn mô phỏng nhé :))



How to prevent a path traversal attack

Cách hiệu quả nhất để ngăn chặn các lỗ hổng điều hướng đường dẫn là tránh truyền đầu vào do người dùng cung cấp trực tiếp đến các APIs hệ thống tệp. Nhiều chức năng ứng dụng có thể viết lại để cung cấp cùng một hành vi một cách an toàn hơn.

Nếu bạn không thể tránh truyền đầu vào do người dùng cung cấp cho các API hệ thống tệp, chúng tôi khuyên bạn nên sử dụng hai lớp phòng thủ để ngăn chặn các cuộc tấn công:

  • Xác thực đầu vào của người dùng trước khi xử lý nó. Lý tưởng nhất, so sánh đầu vào của người dùng với một danh sách cho phép các giá trị được phép. Nếu không thể, hãy xác minh rằng đầu vào chỉ chứa nội dung được phép, chẳng hạn như chỉ các ký tự chữ và số.
  • Sau khi xác thực đầu vào được cung cấp, nối đầu vào với thư mục gốc và sử dụng một API hệ thống tệp 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 bằng thư mục gốc mong muốn.


Đăng nhận xét

0 Nhận xét