Codeby Games Codeby Games - Точка невозврата [Writeup]

vov4ick

Green Team
11.12.2022
55
126
BIT
968
Когда код бежит быстрее, чем мысли программиста.

Race_condition_and_coupons_--ar_1278400.png


- Приветствие
- Изучение сайта и сбор информации
- Использование уязвимости
- Заключение



Приветствую всех кто заглянул на огонек, сегодня мы рассмотрим таск "Точка невозврата" из категории Веб codeby.games.

Изучение сайта и сбор информации.
Первое что мы видим попадая на сайт это форма регистрации:
Screenshot_14.png


Регистрируемся на сайте и входим в наш личный кабинет:

Screenshot_15.png


Здесь мы понимаем что есть баланс и возможность купить флаг. Так же есть форма для отправки ваучера.
Заглядываем в исходный код и видим тестовые ваучеры:

Screenshot_16.png



При вводе ваучеров каждый дает 100$, но нам все равно не хватает денег для покупки флага.
Здесь мы будем пробовать 'Race Conditions'. Это распространенный тип уязвимостей, тесно связанный с недостатками бизнес логики .
Они возникают, когда веб-сайты одновременно обрабатывают запросы без адекватных мер безопасности.

Использование уязвимости .
Мы воспользуемся двумя браузерами и одной учетной записью. Отправим один ваучер с одного браузера и сразу же со второго:
Screenshot_17.png


Здесь мы видим, что при отправке ваучера который должен был дать нам 100$, дал нам 200$.
Ваучер применился дважды, хотя не должен был.
Screenshot_18.png


Вводим оставшиеся ваучеры таким же способом и у нас получается такая картина:

Screenshot_19.png


Ура! Дальше мы просто нажимаем на кнопку BUY FLAG и покупаем его.

- Заключение

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

Довольно интересный вектор атаки, про который не стоит забывать и проверять его при тестировании.
Кто обратил внимание на данную статью и набравший большее количество баланса, отпишите в комментарии.
Будет очень интересно, так же увидеть решение способом через Burp.

До новых встреч!
 

Paladin

Red Team
10.10.2021
102
457
BIT
502
Сколько ни пробовал не получилось ни так, ни через Burp. Только при помощи скрипта:
import os
os.fork() #2
os.fork() #4
os.fork() #8
os.fork() #16
os.fork() #32
os.fork() #64
os.fork() #128
print os.popen('php -r ' + \
'"echo file_get_contents(\' uid=38493860831191\');"').read()

После отработки скрипта, перегружаем страницу.
 
Последнее редактирование:
  • Нравится
Реакции: vov4ick

vov4ick

Green Team
11.12.2022
55
126
BIT
968
Сколько ни пробовал не получилось ни так, ни через Burp. Только при помощи скрипта:
import os
os.fork() #2
os.fork() #4
os.fork() #8
os.fork() #16
os.fork() #32
os.fork() #64
os.fork() #128
print os.popen('php -r ' + \
'"echo file_get_contents(\' uid=38493860831191\');"').read()после отработки скрипта, перегружаем страницу.
Спасибо за еще один вид решения, обьязательно попробую его!
Была надежда что получится в Burp, там в Repeater есть возможность отправки группового параллельного запроса, но не вышло. Логика немного другая, но все же интересно
 

Paladin

Red Team
10.10.2021
102
457
BIT
502
Спасибо за еще один вид решения, обьязательно попробую его!
Была надежда что получится в Burp, там в Repeater есть возможность отправки группового параллельного запроса, но не вышло. Логика немного другая, но все же интересно
Да есть такая опция в новом Burp, но не вышло никак
 

xuZ00

One Level
01.07.2023
7
6
BIT
70
Тоже пробовал через бурп, потом плюнул и написал такой скрипт с использованием многопоточности:

Python:
import requests
from fake_useragent import UserAgent as ua
from multiprocessing import Process

def give_me_money(vouch):
    page = requests.get(f"http://62.173.140.174:16023/index.php?voucherCode={vouch}&uid=963517371812217", headers=usr_agt)

if __name__ == '__main__':
    usr_agt = {'User-Agent': ua().random}
    vouchers = ['PAePaMt', '5mbhxgw', 'dRRYa6Y']

    for voucher in vouchers:
        for i in range(10):
            Process(target=give_me_money, args=(voucher,)).start()
 
  • Нравится
Реакции: vov4ick

vov4ick

Green Team
11.12.2022
55
126
BIT
968
Да есть такая опция в новом Burp, но не вышло никак
Это кстати моя первая уязвимость найденная в реальном приложении, с помощью этой техники. В плане группового параллельного запроса. Так что это актуально.
 
  • Нравится
Реакции: morozko

Paladin

Red Team
10.10.2021
102
457
BIT
502
Это кстати моя первая уязвимость найденная в реальном приложении, с помощью этой техники. В плане группового параллельного запроса. Так что это актуально.
И моя тоже. Я ради этого скачал последнюю версию Burp, где есть этот плагин, но даже он не помог. Как мне сказали с этой ситуацией даже Turbo Intruder будет сложно справиться. А вот скрипт, правда для 2 питона, справился выше всяких похвал. Вообще, интересный момент, когда n1gga нашел Race Condition на сайте курса PRTT от Resolute Attack и накрутил себе баллов, ученики аплодировали стоя, а разрабы еще долго зубами скрипели.
 
  • Нравится
Реакции: vov4ick

vov4ick

Green Team
11.12.2022
55
126
BIT
968
И моя тоже. Я ради этого скачал последнюю версию Burp, где есть этот плагин, но даже он не помог. Как мне сказали с этой ситуацией даже Turbo Intruder будет сложно справиться. А вот скрипт, правда для 2 питона, справился выше всяких похвал. Вообще, интересный момент, когда n1gga нашел Race Condition на сайте курса PRTT от Resolute Attack и накрутил себе баллов, ученики аплодировали стоя, а разрабы еще долго зубами скрипели.
Не слышал эту историю, но довольно интересно👍
 

Paladin

Red Team
10.10.2021
102
457
BIT
502
Не слышал эту историю, но довольно интересно👍
Да эту историю никто не слышал. Но было забавно, Мага подтвердит. Они даже статистику обнуляли. В конце нам даже нагадить захотели, но вовремя одумались.
 
  • Нравится
Реакции: N1GGA и vov4ick

Paladin

Red Team
10.10.2021
102
457
BIT
502
Да эту историю никто не слышал. Но было забавно, Мага подтвердит. Они даже статистику обнуляли. В конце нам даже нагадить захотели, но вовремя одумались.

Screenshot_20230726_154607_com.android.chrome.jpg

Их прямо раздражала эта картинка.
 
  • Нравится
Реакции: Местный

Paladin

Red Team
10.10.2021
102
457
BIT
502
Забавно, вы сдавали на тот момент там сертификацию?
Да. В площадке косяки были. Мага же монстр, он не может просто учиться, ему еще и косяки поискать надо. Там долгая истоия , достойная целой статьи, и я хотел ее писать, но не стал этого делать. Если бы нам серты не дали из вредности, точно написал бы.
 
  • Нравится
Реакции: Местный и vov4ick

cherepawwka

One Level
24.06.2023
1
3
BIT
45
Сколько ни пробовал не получилось ни так, ни через Burp. Только при помощи скрипта:
import os
os.fork() #2
os.fork() #4
os.fork() #8
os.fork() #16
os.fork() #32
os.fork() #64
os.fork() #128
print os.popen('php -r ' + \
'"echo file_get_contents(\' uid=38493860831191\');"').read()

После отработки скрипта, перегружаем страницу.
Я в своем райтапе писал, почему так.
Всё дело в том, что PHP "из коробки" содержит Session-based locking mechanism (механизм блокировки, основанный на сессиях). Некоторые фрэймворки пытаются предотвратить случайное повреждение данных, используя ту или иную форму блокировки запросов. Так, собственный модуль обработчика сеансов в PHP обрабатывает только один запрос, относящийся к конкретному сеансу, за раз.
В Burp вы, скорее всего, копировали весь запрос и не удаляли сеансовую куку, а в скрипте эта кука никак не фигурирует, отсюда и уязвимость.
 
  • Нравится
Реакции: ssh_402, vov4ick и xuZ00

azaart

New member
04.01.2023
1
0
BIT
101
Похоже так и есть. Я через бурп сделал. 3 куки получил и по ~10 запросов на одну куку сразу отправил через параллельные запросы бурпа.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!