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

vov4ick

Green Team
11.12.2022
58
130
BIT
1 033
Когда код бежит быстрее, чем мысли программиста.

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.

До новых встреч!
 
Сколько ни пробовал не получилось ни так, ни через 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
Сколько ни пробовал не получилось ни так, ни через 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 есть возможность отправки группового параллельного запроса, но не вышло. Логика немного другая, но все же интересно
 
Спасибо за еще один вид решения, обьязательно попробую его!
Была надежда что получится в Burp, там в Repeater есть возможность отправки группового параллельного запроса, но не вышло. Логика немного другая, но все же интересно
Да есть такая опция в новом Burp, но не вышло никак
 
Тоже пробовал через бурп, потом плюнул и написал такой скрипт с использованием многопоточности:

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
Да есть такая опция в новом Burp, но не вышло никак
Это кстати моя первая уязвимость найденная в реальном приложении, с помощью этой техники. В плане группового параллельного запроса. Так что это актуально.
 
  • Нравится
Реакции: morozko
Это кстати моя первая уязвимость найденная в реальном приложении, с помощью этой техники. В плане группового параллельного запроса. Так что это актуально.
И моя тоже. Я ради этого скачал последнюю версию Burp, где есть этот плагин, но даже он не помог. Как мне сказали с этой ситуацией даже Turbo Intruder будет сложно справиться. А вот скрипт, правда для 2 питона, справился выше всяких похвал. Вообще, интересный момент, когда n1gga нашел Race Condition на сайте курса PRTT от Resolute Attack и накрутил себе баллов, ученики аплодировали стоя, а разрабы еще долго зубами скрипели.
 
  • Нравится
Реакции: vov4ick
И моя тоже. Я ради этого скачал последнюю версию Burp, где есть этот плагин, но даже он не помог. Как мне сказали с этой ситуацией даже Turbo Intruder будет сложно справиться. А вот скрипт, правда для 2 питона, справился выше всяких похвал. Вообще, интересный момент, когда n1gga нашел Race Condition на сайте курса PRTT от Resolute Attack и накрутил себе баллов, ученики аплодировали стоя, а разрабы еще долго зубами скрипели.
Не слышал эту историю, но довольно интересно👍
 
Не слышал эту историю, но довольно интересно👍
Да эту историю никто не слышал. Но было забавно, Мага подтвердит. Они даже статистику обнуляли. В конце нам даже нагадить захотели, но вовремя одумались.
 
  • Нравится
Реакции: N1GGA и vov4ick
Да эту историю никто не слышал. Но было забавно, Мага подтвердит. Они даже статистику обнуляли. В конце нам даже нагадить захотели, но вовремя одумались.

Screenshot_20230726_154607_com.android.chrome.jpg

Их прямо раздражала эта картинка.
 
  • Нравится
Реакции: Местный
Забавно, вы сдавали на тот момент там сертификацию?
Да. В площадке косяки были. Мага же монстр, он не может просто учиться, ему еще и косяки поискать надо. Там долгая истоия , достойная целой статьи, и я хотел ее писать, но не стал этого делать. Если бы нам серты не дали из вредности, точно написал бы.
 
  • Нравится
Реакции: Местный и vov4ick
Сколько ни пробовал не получилось ни так, ни через 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
Похоже так и есть. Я через бурп сделал. 3 куки получил и по ~10 запросов на одну куку сразу отправил через параллельные запросы бурпа.
 
Мы в соцсетях:

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