Во первых не \x0, а \x00. Во вторых PHP в одинарных кавычках hex символы не распознает, нужны двойные. В третьих в PHP строки уже давно binary-safe и такие древние техники не работают.
Начнем с того, что задание не закрыто и вопросы если и нужно задавать, то не в этой теме. Но мы только начинаем и только учимся решать задания, поэтому пока сделаем исключение: - и потому, что ядовитый ноль в инклюдах, уже в версии 5.3.4 был пропатчен (в 5.3.3.8 уже не работал ), а таск работает на версии 7.2.13.
Для тех, кто прошел и не знает чем заняться. Решение под виндовс отличается от решения под nix. По некоторым причинам не стал его рекомендовать. Но вот вчера хакеры повтыкали и говорят, что вполне себе весело. Кстати cerber3000 прислал оба прохождения. Задание закроем 28.12.2018.
Лучше проходи. А то как расскажут тебе чо там было - ты себе пепла не только на голову насыплешь, ты и в штаны его себе напихаешь
Задание закрыто. Посмотрим еще раз на код. Первая строчка не сильно влияет на прохождение, но экономит время, отсеивая варианты с манипуляциями в имени файла. Ну и спасает интернеты от глобального похека, поскольку хакеры не остановятся только на решении таска, а обязательно доведут до rce, потом порутают систему, а когда поймут, что в докере - будут выбираться в хостовую систему. А там опять - рут, соседи, креды, интернет. Теперь две строчки, которые составляют суть задания Code: if(file_exists($flag)){ echo("Sorry, this file is protected"); }else { include($flag); } Для программиста (как правильно заметил crlf) они не имеют смысла, файл можно проинклюдить только в том случае, если функция file_exists() не найдет его. А ее единственное предназначение, как раз и проверять существование указанного файла или каталога. Логика простая и железная, не обойти. Тупик, опечатка, или что это? А это именно то пространство, в котором может работать хакер. Дьявол кроется в деталях. И в этих деталях обнаруживается другая логика, с которой уже можно работать. Оказывается include и file_exists используют не совсем одинаковые алгоритмы поиска Spoiler: url и запрос http://task.antichat.com:10001/?f=NotExistenDir/../flag.php выполнит скрипт flag.php. Все дело в том, что инклюд в никсах работает и через несуществующий каталог (большинство знают это на собственном опыте), если после нормализации пути файл существует. А вот file_exists требует существования всех каталогов в пути. И этот баг известен аж с 2004 года. И не в узких кругах, если спросим у Гугла "bypass file_exists", то в топе получаем документ Spoiler: Документ https://seclists.org/fulldisclosure/2004/Feb/82 Можно конечно встать на защиту разработчиков: нормально же, include нашел файл, который мы запросили, да "ошиблись" немного в запросе, но "исправились" при помощи "../", вернулись на каталог выше и обнаружили нужный файл. Все нормально. И, если бы мы, на месте разработчиков писали функцию file_exists(), мы бы тоже не разрешили ей ходить через несуществующий каталог. Ну в самом деле: Что может существовать в несуществующем месте? Но, как программистам, нам важно, чтобы обе эти конструкции искали файл одинаково и file_exists не имеет самостоятельной ценности, а только в сочетании с другими функциями (и конструкциями) работающими с ФС. Поэтому баг, однозначно. Часть прохождений была найдена с помощью Гугла, это видно по логам сервера, а часть повтыкали "честно". Оба способа правильны, гуглить - быстрее, повтыкать - интереснее. Под виндовс запрос получается другой, для его объяснения можно заглянуть в тему https://rdot.org/forum/showthread.php?t=926, она широко известна. Для работы с файлами винда предоставляет поистине читерские возможности. Spoiler: Прохождения участников Итого. Можно сказать две вещи: - паблик жив. - паблик рулит! Собирается неплохая команда. Думаю, что это еще не все, еще много кто подтянется. Для тех, кто не решил. Не расстраивайтесь, заданий будет еще много, всяких и разных. Кто подтянулся уже после закрытия задания, не спешите заглянуть под спойлер, пробуйте повтыкать, это интереснее, чем просто чтение. И напоследок. Это очень простое задание, но из него можно извлечь уроки. Мне бы хотелось, чтобы зашел такой: Хакер часто работает из такого места, который не прописан явно в коде, но из него можно оказывать влияние на результаты работы скриптов. Я называю это: "В промежутках кода". Но можно называть и по-другому, "Второе дно", "Dark Side of the Moon", не очень важно, как назвать, важно знать, что существует нечто такое, куда программисты не стремятся заглядывать, но там обитают хакеры и неплохо рулят в свою пользу. Всем спасибо. Удачи и хорошего Нового Года! === PS, ну и после закрытия задания уже не так строго относимся к содержимому постов и самое время поделиться впечатлениями, находками, своим представлением. Может есть свое объяснение решениям таска.
Прошу прощения, что открыл карты раньше времени. Думал что обсуждать можно как стукнет 28.12. За задание огромное спасибо!
К слову(на всякий случай добавлю), не только file_exist. PHP: // php 7.3$a = "/etc/../etc/";if(is_dir($a)){include $a . 'passwd';} // passwdecho file_get_contents($a . 'passwd'); // passwd$a = "/etc/aaaa/../";if(is_dir($a)){include $a . 'passwd';} // nothingecho file_get_contents($a . 'passwd'); // passwd$a = "/etc/../etc/passwd";if(is_file($a)){include $a;} // passwdecho file_get_contents($a); // passwd$a = "/etc/aaaa/../passwd";if(is_file($a)){include $a;} // nothingecho file_get_contents($a); // passwd