Lỗ hổng Path Traversal CVE-2021-33203 trên Django

1. Thông tin chung

CVE-2021-33203 là lỗ hổng Path Traversal trên Django cho phép người dùng với quyền Staff có thể xác định được bất kì tệp tin nào trên server có tồn tại hay không, bao gồm cả các tệp tin bên ngoài thư mục web của Django.

            Nếu được nhà phát triển web cấu hình tuỳ biến cho phép hiển thị nội dung, lỗ hổng này sẽ trở thành lỗ hổng đọc tệp tin tuỳ ý trên server.

CVS Score5.0
Mức độ nghiên trọngMedium
Nền tảngDjango
Loại lỗ hổngPath Traversal
Chứng thựcTài khoản quyền staff (truy cập trang admin)
Phiên bản ảnh hưởng3.2.x (x <4) 3.x (x< 1.12) < 2.2.24

2. Nghiên cứu lỗ hổng

– Đường dẫn:

https://github.com/django/django/commit/dfaba12cda060b8b292ae1d271b44bf810b1c5b9

Nội dung bản vá cho thấy sự thay đổi về cơ chế xử lý tên file template_file:

template_file = Path(directory) / template
Mớitemplate_file = Path(safe_join(directory, template))

            Lỗ hổng xuất phát từ việc xử lý tên file template nhập bởi người dùng mà không có cơ chế bảo mật.

Nguyên nhân lỗ hổng

Với việc sử dụng The Django admin documentation generator, tức thư viện tự động tạo documentation, thì sau khi truy cập, người dùng với quyền staff sẽ có các đường dẫn (endpoint) có thể truy cập như sau:

Trong đó, đường dẫn admin/doc/ templates/<path:template>/ cho phép tìm kiếm một template có tồn tại hay không.

            Cấu hình trong admindocs/urls.py như sau:

Vậy hàm xử lý các parameter khi request tới đường dẫn này là:

                        Hàm: TemplateDetailView()

            Tại admindocs/views.py, hàm xử lý TemplateDetailView như sau:

Như vậy, biến template (tên template) sau khi được nhận trực tiếp từ client, sẽ được ghép với Path(directory) để tạo thành đường dẫn hoàn chỉnh tới template đó và kiểm tra xem có tồn tại hay không.             Nếu template có tồn tại sẽ đọc nội dung và trả về trong request. Tuy nhiên theo mặc định, Django admindocs sẽ chỉ trả về xem template đó có hay không theo key exists, nếu nhà phát triển thực hiện tuỳ biến và cho phép trả về cả nội dung template thì lỗ hổng này sẽ trở nên nghiêm trọng hơn bởi ngoài việc xác định tệp tin trên server có tồn tại thì có thể đọc nội dung của tệp tin đó.

Thực hành khai thác lỗ hổng

Môi trường

  • Windows 10 64bit
  • Django 3.2.0
  • Cài đặt Django admindocs

            Thực hành

            Truy cập trang admin với tài khoản quyền staff:

            http://127.0.0.1:7005/admin/

            Thực hiện truy cập tới đường dẫn với parameter tuỳ biến để xác định tệp tin có tồn tại hay không.

            Đối với đường dẫn thông thường, để tìm kiếm một template hehe.html:

            http://127.0.0.1:7005/admin/doc/templates/hehe.html/

     Tìm kiếm một template không tồn tại hehe123.html                       

            http://127.0.0.1:7005/admin/doc/templates/hehe123.html/

            Tìm kiếm tệp tin trong thư mục gốc

            http://127.0.0.1:7005/admin/doc/templates///test12.txt/

            Tìm kiếm tệp tin có tồn tại trong thư mục gốc

            http://127.0.0.1:7005/admin/doc/templates///test.txt/

            Trường hợp tìm kiếm một tệp tin ảnh có tồn tại, kết quả trả về sẽ là Server Error (500) do hàm .read_text() lỗi mà không được đặt trong try_except:

            http://127.0.0.1:7005/admin/doc/templates///1.jpg/

            Nếu tệp tin ảnh không tồn tại, kết quả trả về bình thường:

            http://127.0.0.1:7005/admin/doc/templates///121.jpg/

Kết luận

Django đang ngày càng trở thành một nền tảng phổ biến để phát triển Website ngôn ngữ Python. Vì vậy nắm bắt thông tin về lỗ hổng bảo mật và cập nhật các bản vá mới nhất là yêu cầu quan trọng của các nhà phát triển web Django.

Related Post

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *