Задание закрыто.
Посмотрим еще раз на код.
Первая строчка не сильно влияет на прохождение, но экономит время, отсеивая варианты с манипуляциями в имени файла.
Ну и спасает интернеты от глобального похека, поскольку хакеры не остановятся только на решении таска, а обязательно доведут до rce, потом порутают систему, а когда поймут, что в докере - будут выбираться в хостовую систему.
А там опять - рут, соседи, креды, интернет.
Теперь две строчки, которые составляют суть задания
Код:
if(file_exists($flag)){
echo("Sorry, this file is protected");
}else {
include($flag);
}
Для программиста (как правильно заметил crlf) они не имеют смысла, файл можно проинклюдить только в том случае, если функция file_exists() не найдет его.
А ее единственное предназначение, как раз и проверять существование указанного файла или каталога.
Логика простая и железная, не обойти.
Тупик, опечатка, или что это?
А это именно то пространство, в котором может работать хакер.
Дьявол кроется в деталях.
И в этих деталях обнаруживается другая логика, с которой уже можно работать.
Оказывается include и file_exists используют не совсем одинаковые алгоритмы поиска
.SpoilerTarget" type="button">Spoiler: url
и запрос
http://task.antichat.com:10001/?f=No...ir/../flag.php
выполнит скрипт flag.php.
Все дело в том, что инклюд в никсах работает и через несуществующий каталог (большинство знают это на собственном опыте), если после нормализации пути файл существует.
А вот file_exists требует существования всех каталогов в пути.
И этот баг известен аж с 2004 года.
И не в узких кругах, если спросим у Гугла "bypass file_exists", то в топе получаем документ
.SpoilerTarget" type="button">Spoiler: Документ
https://seclists.org/fulldisclosure/2004/Feb/82
Можно конечно встать на защиту разработчиков: нормально же, include нашел файл, который мы запросили, да "ошиблись" немного в запросе, но "исправились" при помощи "../", вернулись на каталог выше и обнаружили нужный файл. Все нормально.
И, если бы мы, на месте разработчиков писали функцию file_exists(), мы бы тоже не разрешили ей ходить через несуществующий каталог.
Ну в самом деле: Что может существовать в несуществующем месте?
Но, как программистам, нам важно, чтобы обе эти конструкции искали файл одинаково и file_exists не имеет самостоятельной ценности, а только в сочетании с другими функциями (и конструкциями) работающими с ФС.
Поэтому баг, однозначно.
Часть прохождений была найдена с помощью Гугла, это видно по логам сервера, а часть повтыкали "честно".
Оба способа правильны, гуглить - быстрее, повтыкать - интереснее.
Под виндовс запрос получается другой, для его объяснения можно заглянуть в тему
https://rdot.org/forum/showthread.php?t=926, она широко известна.
Для работы с файлами винда предоставляет поистине читерские возможности.
.SpoilerTarget" type="button">Spoiler: Прохождения участников
Сообщение от
ivanjinario
↑
task.antichat.com:10001?f=1111/../flag.php
Сообщение от
randomword0x3f52
Сообщение от
moontisth
↑
task.antichat.com:10001/index.php?f=./sometxt/../flag.php
Сообщение от
moontisth
↑
task.antichat.com:10001/index.php?f=./sometxt/../flag.php
Сообщение от
xmp
↑
task.antichat.com:10001/?f=../../../var/www/html/./random/../flag.php
если быть течнее, для цтф не имеет значение но в реальном мире при инклуде важно знать пути
Сообщение от
MichelleBoxing
Сообщение от
Jerri
↑
Ну запрос очевидный просто) m/../flag.php )
Сообщение от
Strilo4ka
↑
/threads/467350/
PHP код:
[COLOR="#000000"][COLOR="#0000BB"]http[/COLOR][COLOR="#007700"]:[/COLOR][COLOR="#FF8000"]//task.antichat.com:10001/?f=/1/../flag.php[/COLOR][/COLOR]
Сообщение от
Strilo4ka
↑
PHP код:
[COLOR="#000000"][COLOR="#0000BB"]http[/COLOR][COLOR="#007700"]:[/COLOR][COLOR="#FF8000"]//host/test/task1/?f="/flag.php
[/COLOR][COLOR="#0000BB"]http[/COLOR][COLOR="#007700"]:[/COLOR][COLOR="#FF8000"]//host/test/task1/?f=/flag.php[/COLOR][/COLOR]
[QUOTE="man474019"]
↑
[URL="http://task.antichat.com:10001/index.php?f=%22%3E%3C/flag.php"]http://task.antichat.com:10001/index.php?f=">
Итого.
Можно сказать две вещи:
- паблик жив.
- паблик рулит!
Собирается неплохая команда.
Думаю, что это еще не все, еще много кто подтянется.
Для тех, кто не решил. Не расстраивайтесь, заданий будет еще много, всяких и разных.
Кто подтянулся уже после закрытия задания, не спешите заглянуть под спойлер, пробуйте повтыкать, это интереснее, чем просто чтение.
И напоследок. Это очень простое задание, но из него можно извлечь уроки.
Мне бы хотелось, чтобы зашел такой: Хакер часто работает из такого места, который не прописан явно в коде, но из него можно оказывать влияние на результаты работы скриптов.
Я называю это: "В промежутках кода".
Но можно называть и по-другому, "Второе дно", "Dark Side of the Moon", не очень важно, как назвать, важно знать, что существует нечто такое, куда программисты не стремятся заглядывать, но там обитают хакеры и неплохо рулят в свою пользу.
Всем спасибо.
Удачи и хорошего Нового Года!
===
PS, ну и после закрытия задания уже не так строго относимся к содержимому постов и самое время поделиться впечатлениями, находками, своим представлением.
Может есть свое объяснение решениям таска.