Lỗ hổng này thường xảy ra khi lập trình viên sử dụng các lệnh include
, require
, include_once
, require_once
trong PHP mà không xác thực đầu vào của người dùng. Kỹ thuật khai thác chính là TryHackMe - Path Traversal.
Kịch bản 1
Nếu server sử dụng mã như include($_GET["lang"]);
, chúng ta có thể truy cập trực tiếp vào các tệp hệ thống.
Payload: ?file=/etc/passwd
Kịch bản 2
Nếu server thêm một tiền tố thư mục, ví dụ: include("languages/". $_GET['lang']);
, chúng ta có thể sử dụng path traversal để thoát ra khỏi thư mục đó.
Payload: ?lang=../../../../etc/passwd
Kịch bản 3
Trong kịch bản black-box, chúng ta dựa vào thông báo lỗi. Nếu lỗi cho thấy server tự động thêm đuôi .php
vào sau input, chúng ta có thể sử dụng NULL BYTE (%00
) để kết thúc chuỗi và loại bỏ phần đuôi này.
Payload: ?file=../../../../etc/passwd%00
Null byte injection
Kỹ thuật
%00
không còn hoạt động trên PHP 5.3.4 trở lên.
Kịch bản 4
Nếu server lọc các request chứa chuỗi /etc/passwd
, chúng ta có thể bypass bằng cách thêm /.
hoặc %00
vào cuối chuỗi.
Payload: /etc/passwd/.
Kịch bản 5
Nếu server lọc chuỗi ../
, chúng ta có thể bypass bằng cách lồng các chuỗi này vào nhau, ví dụ: ....//
. Khi server thay thế ../
bằng chuỗi rỗng một lần, chuỗi của chúng ta sẽ trở thành ../
.
Payload: ....//....//....//....//etc/passwd
Kịch bản 6
Nếu server yêu cầu input phải chứa một thư mục cụ thể (ví dụ languages/
), chúng ta chỉ cần thêm nó vào đầu payload.
Payload: ?lang=languages/../../../../../etc/passwd