Client-Side Fundamental
  • Добро пожаловать
  • Глава 1 - Начало работы с XSS
    • Браузерная модель безопасности
    • Знакомимся с уязвимостью XSS
    • Более глубокое понимание XSS
    • Опасный псевдопротокол javascript
  • Глава 2 - Защита и Обход для XSS
    • Первая линия обороны от XSS - Sanitization
    • Вторая линия обороны от XSS - CSP (Content Security Policy)
    • Третья линия обороны против XSS - сокращение области воздействия
    • Последние методы защиты от XSS - Trusted Types и встроенный Sanitizer API
    • Обход защитных мер - Обычные способы обхода CSP
    • Обход защитных мер - Mutation XSS
    • Самая опасная XSS - Universal XSS
  • Глава 3 - Атаки без JavaScript
    • Кто сказал, что для атаки обязательно выполнять JavaScript?
    • Prototype Pollution - Эксплуатация цепочки прототипов
    • Может ли HTML влиять на JavaScript - Введение в DOM clobbering
    • Template Injection in Frontend - CSTI
    • CSS Injection - Атака с использованием только CSS (Часть 1)
    • CSS Injection - Атака с использованием только CSS (Часть 2)
    • Можно ли атаковать, используя только HTML
  • Глава 4 - Межсайтовые атаки
    • Same-origin Policy и Same-Site
    • Введение в Cross-Origin Resource Sharing (CORS)
    • Проблемы Cross-Origin безопасности
    • Cross-Site Request Forgery (CSRF)
    • Спаситель от CSRF - Same-site cookie
    • От same-site до главного site
    • Интересная и практичная Cookie Bomb
  • Глава 5 - Другие интересные темы
    • То, что вы видите, это не то, что вы получаете - Clickjacking
    • Эксплуатация MIME Sniffing
    • Атаки на цепочку поставок во фронтенде - Attacking Downstream from Upstream
    • Атаки на веб-фронтенд в Web3
    • Самая интересная атака на побочные каналы фронтенда - XSLeaks (Часть 1)
    • Самая интересная атака на побочные каналы фронтенда - XSLeaks (Часть 2)
Powered by GitBook
On this page
  • Subdomain takeover
  • Что вы можете сделать после получения контроля над поддоменом?
  • Эксплуатация неверных предположений о безопасности
  • Cookie Tossing
  • Заключение
  1. Глава 4 - Межсайтовые атаки

От same-site до главного site

PreviousСпаситель от CSRF - Same-site cookieNextИнтересная и практичная Cookie Bomb

Last updated 8 months ago

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

Существуют основные и неосновные веб-сайты. Например, уязвимости, найденные на сервере API api.example.com, стоят больше, чем уязвимости, найденные на странице одноразового события 2023.campaign.example.com, потому что первые могут вызвать больший ущерб.

Поэтому, когда багхантер обнаруживает уязвимость на 2023.campaign.example.com, он может попытаться дополнительно исследовать, есть ли способ расширить область этой уязвимости, например, затронуть api.example.com, чтобы заработать больше вознаграждений.

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

Subdomain takeover

Как следует из названия, эта уязвимость позволяет злоумышленникам захватить целый поддомен и получить контроль над ним.

Звучит сложно, не так ли? Нужно ли получить контроль над их DNS или проникнуть в внутренние системы компании, чтобы захватить поддомен? На самом деле, это не всегда необходимо. В эпоху различных облачных сервисов есть более простой способ попробовать.

Amazon S3 — это облачный сервис хранения, где вы можете загружать файлы и устанавливать разрешения для их совместного использования. Многие люди используют Amazon S3 для хранения изображений или даже для хостинга целых веб-сайтов, потому что он предоставляет функциональность хостинга веб-сайтов. Каждое хранилище в S3 называется "бакет" и имеет имя, которое также соответствует поддомену, предоставляемому S3.

Например, если мой бакет называется xsstest, поддомен будет: https://xsstest.s3.us-east-1.amazonaws.com. Поскольку S3 удобен и прост в использовании, это хороший выбор для хостинга статических веб-сайтов. Например, если архитектура компании полностью разделяет фронтенд и бэкенд и не требует серверного рендеринга, чисто статический веб-сайт можно разместить на S3, что устраняет необходимость управления инфраструктурой фронтенда.

Единственная проблема в том, что домен https://xsstest.s3.us-east-1.amazonaws.com выглядит не очень привлекательно. Компании обычно имеют свои собственные доменные имена, и S3 предоставляет функциональность для настройки домена, что также довольно просто.

Сначала измените имя бакета на желаемый домен, например, campaign.xss.test.

Затем добавьте запись CNAME в DNS, указывающую campaign.xss.test на xsstest.s3.us-east-1.amazonaws.com. Таким образом, вы можете использовать https://campaign.xss.test как свой собственный домен.

Весь процесс кажется нормальным и удобным, но что делать, когда вам больше не нужна эта веб-страница? Например, может быть страница рождественского события, размещенная на S3 с использованием пользовательского домена xmas.xss.test. После Рождества и окончания события бакет S3 удаляется, так как пространство для хранения и трафик все еще несут затраты.

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

В результате возникает ситуация, когда запись DNS все еще существует, но назначение, на которое она указывает, было удалено.

В случае S3, пока имя бакета не занято кем-то другим, вы можете заявить это имя. Теперь, когда бакет xmas.xss.test был удален, я могу создать новый с тем же именем, xmas.xss.test. Таким образом, домен xmas.xss.test будет указывать на бакет S3, и поскольку бакет S3 содержит мой контент, я фактически контролирую содержимое xmas.xss.test, достигая захвата поддомена.

Помимо S3, существует множество других сервисов, которые предоставляют аналогичную функциональность и имеют эту проблему. Вы можете ознакомиться с подробным списком здесь: . Azure также создала страницу, специально объясняющую, как защититься от этого: . Проще говоря, просто удалите запись DNS, и проблем не будет.

Что вы можете сделать после получения контроля над поддоменом?

Давайте рассмотрим несколько примеров!

Hacktus обнаружил, что один из поддоменов, test.example.com, указывает на azurewebsites.net и не был зарегистрирован никем. Поэтому Hacktus зарегистрировал сервис и успешно захватил домен. После захвата, когда пользователь посещает test.example.com, браузер отправляет куки, хранящиеся на example.com, на сервер, позволяя Hacktus получить куки пользователя.

NPM означает Node Package Manager, сервис, используемый для управления пакетами JavaScript. Если злоумышленник получает контроль над assets.npmjs.com, он может загружать вредоносные пакеты и обманывать разработчиков, заставляя их думать, что они безопасны. Поскольку разработчики знакомы с этим доменом и он выглядит очень надежным, вероятность успешного фишинга также высока.

Злоумышленник может создать свой собственный блог на Medium и запросить ссылку на platform.medium.engineering. Хотя в этом случае они не могут полностью контролировать содержимое веб-страницы, они все равно могут проводить атаки социальной инженерии, такие как размещение поддельных объявлений о работе, которые выглядят очень правдоподобно.

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

Эксплуатация неверных предположений о безопасности

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

Например, давайте рассмотрим случай динамического Origin в CORS. Некоторые серверы реализуют следующую проверку:

const domain = 'example.com';
if (origin === domain || origin.endsWith('.' + domain)) {
  res.setHeader('Access-Control-Allow-Origin', origin);
}

Если происхождение — example.com или заканчивается на .example.com, проверка проходит. Хотя это может не казаться большой проблемой, безопасность этой проверки основана на предположении, что "злоумышленники не могут контролировать поддомены example.com".

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

Таким образом, эта, казалось бы, безопасная проверка на самом деле недостаточно безопасна. Наиболее безопасная проверка должна выглядеть так:

const allowOrigins = ['example.com', 'blog.example.com'];
if (allowOrigins.includes(origin)) {
  res.setHeader('Access-Control-Allow-Origin', origin);
}

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

Cookie Tossing

Еще одно, что вы можете сделать после получения контроля над поддоменом, называется Cookie Tossing.

Предположим, есть веб-сайт с API-сервером на api.example.com, и аутентификационный куки хранятся под этим доменом. Кроме того, на бэкенде реализована защита от CSRF, добавлен атрибут SameSite=Lax и проверяется токен CSRF, чтобы убедиться, что csrf_token в теле запроса совпадает с тем, что в куки.

Теперь предположим, что у нас есть контроль над поддоменом s3.example.com и мы можем выполнять XSS-атаки на нем. Что нам делать дальше?

При записи куки мы можем записывать их в домены более высокого уровня. Например, a.b.example.com может записывать куки в:

  1. a.b.example.com

  2. b.example.com

  3. example.com

Таким образом, когда мы находимся на s3.example.com, мы можем записать куки в example.com, что позволяет нам записать куки с именем csrf_token.

В сценарии, где и api.example.com, и example.com имеют куки с одинаковым именем, что будет делать браузер? Он отправит обе куки вместе, и в зависимости от атрибута пути куки более специфичный будет отправлен первым.

Например, если куки на api.example.com не имеют установленного пути, а куки на example.com имеют установленный path=/users, когда браузер отправляет запрос на https://api.example.com/users, отправленные куки будут: csrf_token={value_of_example_com}&csrf_token={value_of_api_example_com}.

Обычно, при получении значений куки на бэкенде, по умолчанию берется только первое. Поэтому мы получим куки, которые мы записали на s3.example.com.

Таким образом, злоумышленник может перезаписать куки из других доменов того же происхождения, как будто он "бросает" куки с одного поддомена на другой. Это называется Cookie Tossing.

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

Заключение

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

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

Например, основной сайт может находиться по адресу www.example.com, в то время как страница кампании называется campaign.example.app. Таким образом, даже если страница кампании будет скомпрометирована, ущерб можно минимизировать, и это не повлияет на основной сайт.

Первый пример — это статья, опубликованная Hacktus в 2023 году: . В ней упоминается, что на сайте example.com куки записываются непосредственно на корневом домене example.com, что делает их доступными для других поддоменов.

Второй случай — это статья, опубликованная кибербезопасной компанией Shockwave:. Упомянутый в статье случай похож на проблему с бакетом S3, о которой мы говорили ранее, но на этот раз захваченный домен — assets.npmjs.com.

Третий случай касается уязвимости, обнаруженной Смараном Чандом в конце 2022 года: . Один из поддоменов платформы для блогов Medium, platform.medium.engineering, указывает на Medium, но не существует как блог.

Решение состоит в том, чтобы изменить имя куки токена CSRF с csrf_token на __Host-csrf_token. С этим префиксом куки не могут иметь атрибуты пути и домена при его установке. Поэтому другие поддомены не могут записывать и перезаписывать его. Для получения дополнительных примеров вы можете обратиться к странице .

Для конкретных примеров и других приложений вы можете ознакомиться с докладом @filedescriptor на HITCON CMT в 2019 году: , или просмотреть .

Can I take over XYZ
Prevent dangling DNS entries and avoid subdomain takeover
Subdomain Takeover leading to Full Account Takeover
Subdomain Takeover: How a Misconfigured DNS Record Could Lead to a Huge Supply Chain Attack
Taking over the Medium subdomain using Medium
MDN page
The cookie monster in your browsers
slides