Не удалось прогрузить медиа
Вступление
Всем привет. Недавно я сел дополнять свои знания в области веб пентеста. Решил разобраться с рейс кондишинс. Подумал: а что там разбираться? Ну вот тебе функционал где можно получить скидку через промокод. Отправляешь кучу параллельных запросов как-то там и вот тебе товар на халяву.
Ну все оказалось куда интереснее чем я думал. Эта уязвимость показалось мне настолько интересной, что я захотел для вас написать статью.
В этой статье я хотел бы выступить для вас репетитором что ле :) Поэтому настоятельно советую практиковать прочитанное. Просто паралельно со мной проходите лабы на https://portswigger.net/web-security/race-conditions. Если самостоятельно как решить не додумались, то смотрите решение у меня. Так же после каждой главы разбирайте репорты какие я оставляю внизу! Ладно, начнём
Интересная функция репитера
Все мы знаем, что в репитере можно группировать запросы. Это очень полезная функция. Разбил на группы запросы по папкам и спокойно тестишь, не забывая что интересного увидел
Не удалось прогрузить медиа
Но как оказалось, есть кое-что интересное в этих группах, о чём я даже не задумывался
Не удалось прогрузить медиа
Это разные методы отправки запросов через игру с TCP пакетами. А вот это то, что может вам очень сильно пригодится в дальнейших тестированиях и не только на состояние гонки
Single connection. Тут все просто. Запросы отправляются по очереди через одно TCP соединение. Просто обычная отправка группы запросов
Code:
→ Отправляется Запрос 1
← Получен Ответ 1
→ Отправляется Запрос 2
← Получен Ответ 2
→ Отправляется Запрос 3
← Получен Ответ 3
Separate connection. Запросы отправляются по очереди через разные TCP соединения. Самый времязатратный метод если надо получить быстро ответы
Code:
→ [open TCP conn A]
→ Отправлен Запрос 1
← Получен Ответ 1
→ [close TCP conn A]
→ [open TCP conn B]
→ Отправлен Запрос
← Получен Ответ 2
→ [close TCP conn B]
→ [open TCP conn C]
→ Отправлен Запрос 3
← Получен Ответ 3
→ [close TCP conn C]
Single packet attack. вот тут самое интересное. если на таргете поддерживается HTTP/2 (а на момент 2025 почти все сайты поддерживают), то доступна фича, название какой мультиплексирование. При стандартной отправке одно tcp соединение может обрабатывать только 1 запрос одновременно
Code:
Запрос 1 → Ответ 1
Запрос 2 → Ответ 2
Но в http 2 с мультиплексированием:
Code:
Запрос 1 (часть)
Запрос 2 (часть)
Запрос 1 (часть)
Запрос 3 (часть)
→ Всё идёт в одном TCP-соединении параллельно.
Не удалось прогрузить медиа
То Есть сервер обрабатывает несколько запросов одновременно и параллельно, возвращая ответы в том же соединении. Ключевое слово параллельно, что самое главное для нас
Что же такое ваше это состояние гонки?
Состояние гонки - ситуация, при какой несколько потоков / процессов пытаются взаимодействовать с общим ресурсом. В результате этого два параллельных запроса попадают в окошко (race window) и вызывают необычное поведение. Сейчас наверное вы ничего не поняли, но дальше поймете. Продолжайте читать и вдумываться в написанное
Не удалось прогрузить медиа
Лаба #1: база
Когда речь заходит о состоянии гонки, все показывают этот пример. Он хоть и самый популярный, но для новичка идеальный чтобы набраться базового понимания
Есть веб приложение с таким функционалом:
Не удалось прогрузить медиа
То есть вводим в поле для ввода промокод, получаем 20 проц скидки от суммы нашей корзины и все. Много раз активировать этот промокод не получится. Но что, если отправить, например, 20 параллельных запросов на активацию. Можно ли будет сбить цену? Если приложение уязвимо к состоянию гонки - возможно
Добавим 17 одинаковых запросов на активацию промокода в одну группу
Не удалось прогрузить медиа
И отправим все эти запросы параллельно, чтобы создать race window
Не удалось прогрузить медиа
И мы выбили настолько большую скидку, что теперь можем купить этот дизайнерский пиджак всего лишь за 30 долларов
Не удалось прогрузить медиа
Что только что произошло ? Для наглядности посмотрим на схему функционала активации и проверки купонов
Не удалось прогрузить медиа
Ну и вот моя версия:
Не удалось прогрузить медиа
Если до этого промокод мы не активировали и попытаемся его активировать через 2 параллельных запроса, то они застрянут в окошке (race window) и веб приложение активирует их 2 раза:
Не удалось прогрузить медиа
То Есть так как запросы отправлены параллельно, сервер увидит что промокод не был активирован и активирует его один раз для одного запроса
Для разбора этой части статьи рекомендую
Не удалось прогрузить медиа
Не удалось прогрузить медиа
HackerOne disclosed on HackerOne: Race condition in performing...
## Summary There exists a race condition in performing retests. By executing multiple requests to confirm a retest at the same time, a malicious user is paid multiple times for the retest. This allows for stealing money from HackerOne, which could go unnoticed by both HackerOne and the attacker...
hackerone.com
Как искать эндпоинты, какие подходят для состояния гонки ?
Скорее всего, данный вопрос на данном этапе статьи вас не интересует. Но если вы хоть немного задумаетесь, то у вас возникнет этот вопрос. Тут все просто: ищем место в системе, где выполнение разбито на несколько последовательных этапов. Например: Регистрация аккаунта с в соц сети.
- 1. Получение данных клиента
- 2. Проверка доступности имени
- 3. Создание аккаунта в базе
- 4. Результат: (имя пользователя занято/регистрация успешна)
Ответ: 2 и 3
Результат: создание 2 аккаунтов с одинаковым именем пользователя. Импакт тут может быть разный, зависит от подальшего поведение веб приложения
Если вы тестируете race conditions, просто мысленно разбивайте любой функционал на этапы и думайте о возможных результатов.
По началу это может показаться сложно, но это не так. Для этого просто нужен опыт. Читайте чужие репорты и сможете так сделать
Вы также можете кидать все подряд запросы в репитер и отсылать. Если есть какая то разница в ответе между серией нормальных и параллельных запросов - состояние гонки есть. Проще говоря: ищем аномалии, нетипичное поведение
Turbo intruder
Я жалею, что раньше не был знаком с этим плагином. Оказывается, он гораздо интереснее, чем я думал. Если бы я знал о его полном потенциале раньше обязательно добавил бы его в статью, где делился своим топом плагинов.
Turbo Intruder - усовершенствованная версия обычного intruder’a, какая работает абсолютно по другому принципу и имеет свою массу плюсов
Обычный интрудер работает по принципу потоков. 1 поток отправляет запрос, получает ответ и выводит все в таблицу с результатами
turbo intruder же работает совсем по другому. Он использует такие андеграунд фичи как http pipelining (для HTTP 1.1) и мультиплексирование (для HTTP 2)
Ну и ещё не могу не выделить влияние этого инструмента на оперативку.
Вот все же замечали, когда запускаешь обычный интрудер с гигантским словарём на ночь, то на утро встречает прикольный сюрприз: бурп сьют либо вылетит либо крашнется. А проблема в том, что он жрет ну уж очень много оперативки
Турбо интрудер мало того что быстрее, так ещё и с ним такие приколы вам не грозят
Не удалось прогрузить медиа
Вот вам наглядный пример на тесте плагина от его создателя James Kettle. За 17 часов фазинга директорий инструмент сделал полтора миллиарда запросов. Это заняло 1 гб оперативной памяти и 17 часов при 22500 запросах в секунду
Плагин я прорекламировал довольно сильно, но давайте рассмотрим тему его использования
Качаем плагин в bapp store (доступен также для community edition) и отправляем запрос в турбо интрудер
Не удалось прогрузить медиа
Открывается вот такое окошко, где можно выбрать python скрипты под ваши цели. Рассмотрим сегодня только самые главные из них. Для этой демонстрации выберу basic.py. Его вы будете использовать чаще всего
Не удалось прогрузить медиа
В basic.py через %s указываем место, где будет идти фазинг по словарю. Путь к самому словарю указываем в коде скрипта
Не удалось прогрузить медиа
У кого фобия на код, не бойтесь. Ничего сложного тут нету, зачастую сильно взаимодействовать с кодом вам не придется. Давайте поговорим об одной из самых важных частей кода, о шапке
engine = RequestEngine(endpoint=target.endpoint,
concurrentConnections=5,
requestsPerConnection=100,
pipeline=False
)
Вы конечно можете оставить тут все как есть, но это не поможет вам раскрыть весь потенциал плагина.
Вот такой результат при настройке
concurrentConnections = 1
requestsPerConnection = 1
pipeline=False
Не удалось прогрузить медиа
2 запроса в секунду. Не густо. Давайте начнем настройку
requestsPerConnection. Это количество запросов, которые будут отправлены в рамках одного TCP соединения.
То есть одно соединение может использоваться повторно для нескольких запросов. Это экономит время на открытие новых TCP-сессий. Укажем значение 200
Не удалось прогрузить медиа
5 запросов в секунду. Все еще так себе
[NOTE] если кол-во retries растет вверх, это значит что вы дали requestsPerConnection чересчур большое значение. Попробуйте сделать меньше
Так же важно понимать, что если вы даете значение 9999999, то это вовсе не значит что инструмент будет работать сильно быстрее. Просто будет бить много retries.
На практике: если при значении 200 10 запросов/сек и много retries, то при значении 100 будет так же 10 запросов/сек но меньше retries
Так что давайте значения с умом
pipeline . Принимает только True/False. А вот это очень интересная и малоизвестная фича в HTTP 1.1 . Давайте подробнее
Фича HTTP Pipelining очень похожа на мультиплексирование в HTTP 2. Т.е отправляется несколько запросов в одном TCP пакете одновременно и параллельно без ожидания ответов на предыдущие
Не удалось прогрузить медиа
Не удалось прогрузить медиа
Дам значение True и вижу что теперь у нас 210 запросов в секунду.
Не удалось прогрузить медиа
Уже лучше, двигаемся дальше
concurrentConnections - Это количество одновременных TCP-соединений, которые скрипт будет держать открытыми. Укажем 40
Не удалось прогрузить медиа
4190 запросов в секунду. Неплохо, не так ли? Заметил, что на некоторых таргетах кол-во запросов/сек могут достигать до 10к а на некоторых до 200. Так что все зависит от тестируемой цели
Если вам лень разбираться с тем что за разжевано выше, просто ставьте вот так:
concurrentConnections=40,
requestsPerConnection=200,
pipeline=True
либо вот так
concurrentConnections=20,
requestsPerConnection=100,
pipeline=True
При столь активном фазинге к слову сервер может выдавать то что никто не ожидал
Не удалось прогрузить медиа
Вывод: фазим через турбо интрудер
Лаба #1: База через turbo intruder
Давайте теперь решим лабу #1 еще раз, но с turbo intruderа а не репитера. Отправим запрос на активацию промокода в turbo intruder
Не удалось прогрузить медиа
Теперь при помощи скрипта race-single-packet.py начнем атаку. Это аналог single packet attack в репитере
Не удалось прогрузить медиа
Нажимаем на кнопку attack и видим что купон активировался во всех запросах
Не удалось прогрузить медиа
Покупаем дизайнерский пиджак за 15 баксов
Не удалось прогрузить медиа
Для разбора этой части статьи рекомендую
Не удалось прогрузить медиа
Reverb.com disclosed on HackerOne: Race Condition allows to redeem...
Hello team! I've found a Race Condition vulnerability which allows to redeem gift cards multiple times. This how a s/he can easily buy stuff just bying one gift card and redeem it over and over again. ## Steps to reproduce ### Preparations - Burp Suite Pro - Turbo Intruder Note: This also...
hackerone.com
https://hackerone.com/reports/454949
https://hackerone.com/reports/488985
https://hackerone.com/reports/1540969
Не удалось прогрузить медиа
HackerOne disclosed on HackerOne: Race Conditions in Popular...
This report describes a race condition bug which allow an authenticated user to upvote or downvote multiple times a single report, increasing its counter (and its rank on the hacktivity page).
hackerone.com
Не удалось прогрузить медиа
How Race Condition Worth Me $1000 On YesWeHack💸
Hello Guys!👋 Welcome back.
Не удалось прогрузить медиа
medium.com
Лаба #2: обходим рейт лимиты
Во второй лабе нам надо обойти рейт лимит на странице входа в аккаунт и сбрутить учетные данные для пользователя carlos. Ну что ж, carlos, берегись, щас ты будешь pwned
При пяти неуспешных попыток входа нас рейт лимитит на определенное кол-во времени. Стандартный механизм защиты
Не удалось прогрузить медиа
Через репитер такое сделать должным образом не получится, поэтому мы воспользуемся turbo intruder’ом. Кидаем запрос ему и выбираем race-single-attack
Не удалось прогрузить медиа
Не удалось прогрузить медиа
Но без небольших модификаций кода все что мы сделаем - отправим 20 раз запрос на вход с одинаковым неправильным паролем. Давайте это сделаем, чтоб узнать рейт лимитнет ли нас
Не удалось прогрузить медиа
Нет, не лимитнуло. Увидели аномалию - ответы в серии параллельных запросов отличаются от обычных. Понимаем, что тут состояние гонки, осталось только показать импакт.
Давайте теперь немного перепишем скрипт чтобы у нас был перебор строк из словаря вместо цикла
Не удалось прогрузить медиа
И не забываем %s в запросе там где пароль. Запускаем шайтан машину
Не удалось прогрузить медиа
Пароль сбручен успешно
Для разбора этой части статьи рекомендую
Не удалось прогрузить медиа
Race Condition - Eating Rate Limits for Account Takeover
Summary
Не удалось прогрузить медиа
shahjerry33.medium.com
Не удалось прогрузить медиа
Found a Race Condition That Led to Privilege =>$750
Free Article Link: Click for free!
Не удалось прогрузить медиа
infosecwriteups.com
Лаба #3. Несколько эндпоинтов
В примерах выше мы просто слали параллельно кучу запросов на один эндпоинт. Но рейс кондишнс может быть куда интереснее.
Надо уметь так же выстраивать несколько запросов в правильном порядке чтобы ловить аномалии и раскручивать импакт. Чтобы понять как это делать, нам на помощь приходит эта лаба
Есть вот такой вот обычный интернет магазин
Не удалось прогрузить медиа
Все что мы можем это добавлять товар в корзину и покупать все что есть в корзине. Наша задача это купить дизайнерскую куртку за 1337 зеленых. Но купить ее надо за бесплатно ибо мы броуки. Вот я вам советую сейчас зайти на эту лабу и подумать что тут можно сделать, не подсматривая решение
Если отослать одновременно запрос на добавление в корзину еще одного товара и покупку всего что есть в корзине, можно будет получить этот товар на халяву. То Есть 2 запроса:
- 1. Добавляем дорогой товар в корзину
- 2. Покупаем ширп что есть в корзине
Не удалось прогрузить медиа
А вот этот пиджак нам надо купить на халяву. Добавим его в корзину, перехватим запрос и кинем его в репитер
Не удалось прогрузить медиа
Теперь перехватим запрос на покупку всего что есть в корзине и отправим в репитер
Не удалось прогрузить медиа
Теперь размещаем два запроса в правильном порядке и отправляем параллельно
Не удалось прогрузить медиа
BoOm! Magic!
Не удалось прогрузить медиа
Для разбора этой части статьи рекомендую
https://siunam321.github.io/ctf/portswigger-labs/race-conditions/race-conditions-3/
Лаба #4: очередной сингл эндпоинт
Эта лаба очень хорошо подойдет для закрепления материала. Email based функционал это золотая жила для состояния гонки абсолютно всегда. Не важно что это: otp/сброс пароля/смена почты. Это все просто идеально подходит для наших целей
В этой лабе у нас есть свой email клиент, куда приходят письма для подтверждения смены почты. Сюда приходят все письма, какие были отправлены на любые адреса в рамках нашего домена
Не удалось прогрузить медиа
И нам надо сменить наш адрес почты на корпоративную [email protected]
Не удалось прогрузить медиа
Но увы сделать это просто так не получится, т.к письмо идет не на нашу домен. Вопрос: что нужно сделать ?
Ответ: отправить параллельно запросы в следующем порядке
- 1. Смена на адрес почты с нашим доменом
- 2. Смена на корпоративный адрес (с левым доменом)
Не удалось прогрузить медиа
У меня получилось получить письмо с пятой попытки
Для разбора этой части статьи рекомендую
https://www.youtube.com/watch?v=tKJzsaB1ZvI&t=980s (лаба была построена на основе этого случая. тут теория репорта + видео демонстрация в реальном времени)
Другие материалы
Конференции James Kettle (обязательна к просмотру)
Не удалось прогрузить медиа
Не удалось прогрузить медиа
https://habr.com/ru/companies/deiteriylab/articles/588919/ (руководство по turbo intruder)
https://www.yeswehack.com/learn-bug-bounty/pimpmyburp-8-advanced-fuzzing-turbo-intruder
https://conference.hitb.org/hitbsecconf2022sin/materials/D2 COMMSEC - Exploiting Race Condition Vulnerabilities in Web Applications - Javan Rasokat.pdf
https://swisskyrepo.github.io/PayloadsAllTheThings/Race Condition/#labsc
👍25
🔥8
😮2
LIMB