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