5/5 - (1 bình chọn)

Lỗ hổng File Inclusion cho phép kẻ tấn công File Inclusion, thường khai thác cơ chế “Dynamic File Inclusion” được triển khai trong ứng dụng đích. Lỗ hổng bảo mật xảy ra do việc sử dụng dữ liệu đầu vào do người dùng cung cấp mà không được xác thực thích hợp.

Các bài viết liên quan:

Điều này có thể dẫn đến việc xuất ra nội dung của tệp, nhưng tùy thuộc vào mức độ nghiêm trọng, nó cũng có thể dẫn đến:

  • Thực thi mã trên máy chủ web
  • Thực thi mã ở phía máy khách, chẳng hạn như JavaScript có thể dẫn đến các cuộc tấn công khác, chẳng hạn như tập lệnh trang web chéo (XSS)
  • Từ chối dịch vụ (DoS)
  • Tiết lộ thông tin nhạy cảm

Local File Inclusion (còn được gọi là LFI) là quá trình bao gồm các tệp, đã có mặt cục bộ trên máy chủ, thông qua việc khai thác các thủ tục đưa vào dễ bị tổn thương được triển khai trong ứng dụng. Lỗ hổng này xảy ra, ví dụ: khi một trang nhận, làm đầu vào, đường dẫn đến tệp phải được bao gồm và đầu vào này không được làm sạch đúng cách, cho phép các ký tự duyệt thư mục (chẳng hạn như dấu chấm-chấm-gạch chéo) được đưa vào. Mặc dù hầu hết các ví dụ đều chỉ ra các tập lệnh PHP dễ bị tấn công, chúng ta nên nhớ rằng nó cũng phổ biến trong các công nghệ khác như JSP, ASP và các công nghệ khác.

Làm thế nào để kiểm tra

Vì LFI xảy ra khi các đường dẫn được truyền để bao gồm các câu lệnh không được làm sạch đúng cách, trong cách tiếp cận kiểm tra hộp đen, chúng ta nên tìm kiếm các tập lệnh lấy tên tệp làm tham số.

Hãy xem xét ví dụ sau:

http: //vulnerable_host/preview.php? file = example.html

Đây có vẻ là một nơi hoàn hảo để thử LFI. Nếu kẻ tấn công đủ may mắn và thay vì chọn trang thích hợp từ mảng theo tên của nó, tập lệnh bao gồm trực tiếp tham số đầu vào, thì có thể bao gồm các tệp tùy ý trên máy chủ.

Khái niệm bằng chứng điển hình sẽ là tải tệp mật khẩu:

http: //vulnerable_host/preview.php? file = .. / .. / .. / .. / etc / passwd

Nếu các điều kiện được đề cập ở trên được đáp ứng, kẻ tấn công sẽ thấy một cái gì đó giống như sau:

  • root: x: 0: 0: root: / root: / bin / bash
  • bin: x: 1: 1: bin: / bin: / sbin / nologin
  • daemon: x: 2: 2: daemon: / sbin: / sbin / nologin
  • alex: x: 500: 500: alex: / home / alex: / bin / bash
  • margo: x: 501: 501 :: / home / margo: / bin / bash

Ngay cả khi lỗ hổng như vậy tồn tại, việc khai thác nó có thể phức tạp hơn trong các tình huống thực tế. Hãy xem xét đoạn mã sau:

<? php include ($ _ GET ['file']. ". php"); ?>

Thay thế đơn giản bằng một tên tệp ngẫu nhiên sẽ không hoạt động vì postfix .php được thêm vào đầu vào được cung cấp. Để vượt qua nó, người thử nghiệm có thể sử dụng một số kỹ thuật để có được khả năng khai thác như mong đợi.

Injection Null Byte

Ký tự null (còn được gọi là ký tự kết thúc null hoặc byte rỗng) là một ký tự điều khiển có giá trị bằng không có trong nhiều bộ ký tự đang được sử dụng như một ký tự dành riêng để đánh dấu phần cuối của một chuỗi. Sau khi được sử dụng, bất kỳ ký tự nào sau byte đặc biệt này sẽ bị bỏ qua. Thông thường, cách đưa ký tự này vào với chuỗi mã hóa URL% 00 bằng cách thêm nó vào đường dẫn được yêu cầu. Trong mẫu trước của chúng tôi, việc thực hiện yêu cầu tới http: //vulnerable_host/preview.php? File = .. / .. / .. / .. / etc / passwd% 00 sẽ bỏ qua phần mở rộng .php đang được thêm vào tên tệp đầu vào , trả lại cho kẻ tấn công danh sách những người dùng cơ bản do khai thác thành công.

Cắt bỏ đường dẫn và dấu chấm

Hầu hết các bản cài đặt PHP có giới hạn tên tệp là 4096 byte. Nếu bất kỳ tên tệp nhất định nào dài hơn độ dài đó, PHP chỉ cần cắt bớt tên tệp đó, loại bỏ bất kỳ ký tự bổ sung nào. Việc lạm dụng hành vi này có thể khiến công cụ PHP bỏ qua phần mở rộng .php bằng cách di chuyển nó ra khỏi giới hạn 4096 byte. Khi điều này xảy ra, không có lỗi nào được kích hoạt; các ký tự bổ sung chỉ bị loại bỏ và PHP tiếp tục thực thi bình thường.

Bỏ qua này thường được kết hợp với các chiến lược bỏ qua logic khác như mã hóa một phần đường dẫn tệp bằng mã hóa Unicode, giới thiệu mã hóa kép hoặc bất kỳ đầu vào nào khác vẫn đại diện cho tên tệp mong muốn hợp lệ.

PHP Wrappers

Lỗ hổng Local File Inclusive thường được coi là lỗ hổng chỉ đọc mà kẻ tấn công có thể sử dụng để đọc dữ liệu nhạy cảm từ máy chủ lưu trữ ứng dụng dễ bị tấn công. Tuy nhiên, trong một số triển khai cụ thể, lỗ hổng này có thể được sử dụng để nâng cấp cuộc tấn công từ LFI thành lỗ hổng Thực thi mã từ xa có khả năng xâm phạm hoàn toàn máy chủ.

Cải tiến này là phổ biến khi kẻ tấn công có thể kết hợp lỗ hổng LFI với một số trình bao bọc PHP nhất định.

Trình bao bọc là một mã bao quanh mã khác để thực hiện một số chức năng bổ sung. PHP triển khai nhiều trình bao bọc tích hợp để được sử dụng với các chức năng của hệ thống tệp. Khi việc sử dụng chúng được phát hiện trong quá trình thử nghiệm ứng dụng, bạn nên thử lạm dụng nó để xác định nguy cơ thực sự của (các) điểm yếu được phát hiện. Dưới đây, bạn có thể nhận được danh sách với các trình bao bọc được sử dụng phổ biến nhất, mặc dù bạn nên xem xét rằng nó chưa đầy đủ và đồng thời có thể đăng ký các trình bao bọc tùy chỉnh mà nếu được mục tiêu sử dụng, sẽ yêu cầu phân tích đặc biệt.

Bộ lọc PHP

Được sử dụng để truy cập hệ thống tệp cục bộ; đây là một trình bao bọc không phân biệt chữ hoa chữ thường cung cấp khả năng áp dụng bộ lọc cho luồng tại thời điểm mở tệp. Trình bao bọc này có thể được sử dụng để lấy nội dung của tệp ngăn máy chủ thực thi tệp đó. Ví dụ: cho phép kẻ tấn công đọc nội dung của các tệp PHP để lấy mã nguồn nhằm xác định thông tin nhạy cảm như thông tin xác thực hoặc các lỗ hổng có thể khai thác khác.

Trình bao bọc có thể được sử dụng như php: //filter/convert.base64-encode/resource=FILE trong đó FILE là tệp cần truy xuất. Do việc sử dụng quá trình thực thi này, nội dung của tệp đích sẽ được đọc, được mã hóa thành base64 (đây là bước ngăn phía máy chủ thực thi) và được trả lại cho Tác nhân người dùng.

PHP ZIP

Trên PHP 7.2.0, zip: // wrapper đã được giới thiệu để thao tác với các tệp nén zip. Trình bao bọc này mong đợi cấu trúc tham số sau: zip: /// filename_path # internal_filename trong đó filename_path là đường dẫn đến tệp độc hại và internal_filename là đường dẫn chứa tệp độc hại bên trong tệp ZIP đã xử lý. Trong quá trình khai thác, thông thường # sẽ được mã hóa bằng URL của nó Giá trị được mã hóa % 23.

Việc lạm dụng trình bao bọc này có thể cho phép kẻ tấn công thiết kế một tệp ZIP độc hại có thể được tải lên máy chủ, chẳng hạn như hình ảnh đại diện hoặc sử dụng bất kỳ hệ thống tải lên tệp nào có sẵn trên trang web mục tiêu (php: zip: // wrapper thì không yêu cầu tệp zip có bất kỳ phần mở rộng cụ thể nào) được thực thi bởi lỗ hổng LFI.

Để kiểm tra lỗ hổng này, quy trình sau có thể được thực hiện để tấn công ví dụ mã trước đó đã cung cấp.

  • Tạo tệp PHP sẽ được thực thi, chẳng hạn với nội dung <? Php phpinfo (); ?> và lưu nó dưới dạng code.php
  • Nén nó dưới dạng tệp ZIP mới có tên target.zip
  • Đổi tên tệp target.zip thành target.jpg để bỏ qua xác thực phần mở rộng và tải tệp đó lên trang web mục tiêu làm ảnh đại diện của bạn.
  • Giả sử rằng tệp target.jpg được lưu trữ cục bộ trên máy chủ theo đường dẫn ../avatar/target.jpg, hãy khai thác lỗ hổng với trình bao bọc ZIP PHP bằng cách chèn tải trọng sau vào URL dễ bị tấn công: zip: //../ avatar / target.jpg% 23code (hãy nhớ rằng% 23 tương ứng với #).

Vì trên mẫu của chúng tôi, phần mở rộng .php được nối với trọng tải của chúng tôi, nên yêu cầu tới http: //vulnerable_host/preview.php? File = zip: //../avatar/target.jpg%23code sẽ dẫn đến việc thực thi tệp code.php tồn tại trong tệp ZIP độc hại.

Dữ liệu PHP

Có sẵn kể từ PHP 5.2.0, trình bao bọc này mong muốn sử dụng như sau: data: // text / trơn; base64, BASE64_STR trong đó BASE64_STR dự kiến ​​là nội dung được mã hóa Base64 của tệp sẽ được xử lý. Điều quan trọng là phải xem xét rằng trình bao bọc này sẽ chỉ khả dụng nếu tùy chọn allow_url_include được bật.

Để kiểm tra LFI bằng cách sử dụng trình bao bọc này, mã được thực thi phải được mã hóa Base64, ví dụ: <? Php phpinfo (); ?> mã sẽ được mã hóa thành: PD9waHAgcGhwaW5mbygpOyA / Pg == vì vậy trọng tải sẽ dẫn đến: data: // text / trơn; base64, PD9waHAgcGhwaW5mbygpOyA / Pg ==.

Kỳ vọng PHP

Trình bao bọc này, không được bật theo mặc định, cung cấp quyền truy cập vào các quy trình stdio, stdout và stderr. Mong đợi được sử dụng như mong đợi: // lệnh máy chủ sẽ thực thi lệnh được cung cấp trên BASH và trả về kết quả của nó.

Biện pháp khắc phục hậu quả

Giải pháp hiệu quả nhất để loại bỏ các lỗ hổng File Inclusion là tránh chuyển đầu vào do người dùng gửi tới bất kỳ API khung / hệ thống tệp nào. Nếu không thể, ứng dụng có thể duy trì một danh sách cho phép các tệp, có thể được trang này bao gồm và sau đó sử dụng một số nhận dạng (ví dụ: số chỉ mục) để truy cập vào tệp đã chọn. Bất kỳ yêu cầu nào có chứa mã định danh không hợp lệ đều phải bị từ chối, theo cách này sẽ không có bề mặt tấn công nào để người dùng độc hại thao túng đường dẫn.

Công cụ

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 *

Contact Me on Zalo
Call now