1. Đề bài

Đề bài cho một trang web như vầy

/images/posts/ctf/Cyber-Apocalypse-2021/MiniSTRyplace/MiniSTRyplace.png

Web MiniSTRyplace

Và source code như vầy

/images/posts/ctf/Cyber-Apocalypse-2021/MiniSTRyplace/source-code.png

Source code MiniSTRyplace

2. Giải quyết

Nhìn vào hình source code bên trên, điều đầu tiên đập vào mắt là dòng code số 17.

include('pages/' . (isset($_GET['lang']) ? str_replace('../', '', $_GET['lang']) : $lang[array_rand($lang)]));

Đúng vậy, đoán ngay ra luôn là dạng LFI rồi.

Có 1 điểm cần lưu ý ở đây, là giá trị của $_GET[‘lang’] sẽ bị replace chuỗi ‘../’. Vậy chúng ta cần bypass nó để có thể LFI.

Thử dưới local cái cho có proof nha :D

/images/posts/ctf/Cyber-Apocalypse-2021/MiniSTRyplace/test.png

Đã bị filter

Đó, các bạn thấy, nó đã loại bỏ đi ../

Thực ra bypass cái này đơn giản thôi, nó replace ../ đúng không? vậy thì mình thử …/./ xem sao nha

/images/posts/ctf/Cyber-Apocalypse-2021/MiniSTRyplace/test2.png

Bypassed

Đó, bài này đơn giản chỉ thế thôi. Đến đây thì thử và lấy flag thôi.

Ban đầu khi nhìn vào folder của source code như vầy:

/images/posts/ctf/Cyber-Apocalypse-2021/MiniSTRyplace/flag-file.png

Folder source code

Tôi đã thử với payload “…/./flag”, nhưng nhận về một trang trống không.

/images/posts/ctf/Cyber-Apocalypse-2021/MiniSTRyplace/nothing.png

Không có flag ở đây

Nên tôi thử payload “…/./…/./flag”, và đã lấy được flag

/images/posts/ctf/Cyber-Apocalypse-2021/MiniSTRyplace/flag.png

Flag

Flag là: CHTB{b4d_4li3n_pr0gr4m1ng}