HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > БЕЗОПАСНОСТЬ И УЯЗВИМОСТИ > Песочница
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 04.06.2015, 03:38
newbie67
Новичок
Регистрация: 09.05.2015
Сообщений: 4
Провел на форуме:
1096

Репутация: 0
По умолчанию

Всем привет!

race-condition - отличная уязвимость, чтобы получить инвайт в античат. Всё же это посложней, чем найти десяток sql.

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

На моём сайте есть трансфер средств между юзерами. Я посылаю два одинаковых запроса в одно и тоже время (через js одновременно открываю 2 php скрипта с curl запросами), на перевод 1$ от Алисы к Бобу. Выполняются они практически одновременно. В итоге у Алисы списывается дважды по 1$, даже можно и трижды сделать, а Боб получает не более 1$.

Собственно вопрос. Можно ли как-то обратить такую уязвимость для подрисовки баланса, а не его снятия? Я пытался ставить разные setTimeout между запросами.. Не помогает, вроде.

Спасибо
 
Ответить с цитированием

  #2  
Старый 04.06.2015, 03:43
newbie67
Новичок
Регистрация: 09.05.2015
Сообщений: 4
Провел на форуме:
1096

Репутация: 0
По умолчанию

Да собственно кода-то чуть чуть) Держите. Вроде закрыл уязвимость при помощи APC, но интерес остался. Можно ли?

PHP код:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#FF8000"]# Снимаем сумму перевода с баланса юзера
[/COLOR][COLOR="#0000BB"]$user[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]User[/COLOR][COLOR="#007700"]::[/COLOR][COLOR="#0000BB"]model[/COLOR][COLOR="#007700"]()->[/COLOR][COLOR="#0000BB"]findByPk[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]Yii[/COLOR][COLOR="#007700"]::[/COLOR][COLOR="#0000BB"]app[/COLOR][COLOR="#007700"]()->[/COLOR][COLOR="#0000BB"]user[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]id[/COLOR][COLOR="#007700"]);
[/
COLOR][COLOR="#0000BB"]$user[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]balance[/COLOR][COLOR="#007700"]-=[/COLOR][COLOR="#0000BB"]$model[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]sum[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#FF8000"]# Снимаем комиссию перевода с баланса юзера (если имеется)
[/COLOR][COLOR="#007700"]if([/COLOR][COLOR="#0000BB"]$transfer[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'commission'[/COLOR][COLOR="#007700"]] !=[/COLOR][COLOR="#DD0000"]'0'[/COLOR][COLOR="#007700"])
[/
COLOR][COLOR="#0000BB"]$user[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]balance[/COLOR][COLOR="#007700"]-=[/COLOR][COLOR="#0000BB"]$transfer[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'commission'[/COLOR][COLOR="#007700"]];
[/
COLOR][COLOR="#FF8000"]# Сохраняем данные пользователя
[/COLOR][COLOR="#0000BB"]$user[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]save[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]false[/COLOR][COLOR="#007700"]);
[/
COLOR][COLOR="#FF8000"]# Добавляем другому юзеру баланс
[/COLOR][COLOR="#0000BB"]$user[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]User[/COLOR][COLOR="#007700"]::[/COLOR][COLOR="#0000BB"]model[/COLOR][COLOR="#007700"]()->[/COLOR][COLOR="#0000BB"]findByPk[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$model[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]idUserTo[/COLOR][COLOR="#007700"]);
[/
COLOR][COLOR="#0000BB"]$user[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]balance[/COLOR][COLOR="#007700"]+=[/COLOR][COLOR="#0000BB"]$model[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]sum[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#FF8000"]# Сохраняем данные пользователя
[/COLOR][COLOR="#0000BB"]$user[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]save[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]false[/COLOR][COLOR="#007700"]);[/COLOR][/COLOR
Я так понимаю, вот этот участок кода(снятие баланса у Алисы)

PHP код:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#FF8000"]# Снимаем сумму перевода с баланса юзера
[/COLOR][COLOR="#0000BB"]$user[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]User[/COLOR][COLOR="#007700"]::[/COLOR][COLOR="#0000BB"]model[/COLOR][COLOR="#007700"]()->[/COLOR][COLOR="#0000BB"]findByPk[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]Yii[/COLOR][COLOR="#007700"]::[/COLOR][COLOR="#0000BB"]app[/COLOR][COLOR="#007700"]()->[/COLOR][COLOR="#0000BB"]user[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]id[/COLOR][COLOR="#007700"]);
[/
COLOR][COLOR="#0000BB"]$user[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]balance[/COLOR][COLOR="#007700"]-=[/COLOR][COLOR="#0000BB"]$model[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]sum[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#FF8000"]# Снимаем комиссию перевода с баланса юзера (если имеется)
[/COLOR][COLOR="#007700"]if([/COLOR][COLOR="#0000BB"]$transfer[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'commission'[/COLOR][COLOR="#007700"]] !=[/COLOR][COLOR="#DD0000"]'0'[/COLOR][COLOR="#007700"])
[/
COLOR][COLOR="#0000BB"]$user[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]balance[/COLOR][COLOR="#007700"]-=[/COLOR][COLOR="#0000BB"]$transfer[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'commission'[/COLOR][COLOR="#007700"]];[/COLOR][/COLOR
Успевает выполниться дважды. Но почему следующий за ним код (начисление баланса Бобу) не успевает? И можно ли сделать, чтобы как раз только он и успевал
 
Ответить с цитированием

  #3  
Старый 04.06.2015, 05:47
M_script
Новичок
Регистрация: 04.11.2004
Сообщений: 5
Провел на форуме:
4512

Репутация: 0
По умолчанию

В коде никаких ограничений нет. Экспериментируй дальше, все получится.
 
Ответить с цитированием

  #4  
Старый 04.06.2015, 14:41
newbie67
Новичок
Регистрация: 09.05.2015
Сообщений: 4
Провел на форуме:
1096

Репутация: 0
По умолчанию

Цитата:
Сообщение от M_script  

В коде никаких ограничений нет. Экспериментируй дальше, все получится.
Спасибо за ответ!

Вы абсолютно уверены?

Может я что-то делаю не так?

Я через JS с интервалом от 1 до 200 мсек уже попробовал вызывать скрипты. (через jquery .get, и использую setTimeout). Целевой сайт у меня на локалхосте находится.

Скрипты я вызываю test1.php и test2.php, в обоих прописано по 2 curl запроса - первый на получение токена, второй на отправку средств.

Списать дважды уже удалось раз 100, а вот добавить - ни разу. Может при такой проектировке (когда я сначала списываю у Алисы, потом добавляю Бобу) и не присутствует уязвимость?
 
Ответить с цитированием

  #5  
Старый 04.06.2015, 15:16
M_script
Новичок
Регистрация: 04.11.2004
Сообщений: 5
Провел на форуме:
4512

Репутация: 0
По умолчанию

Цитата:
Сообщение от newbie67  

Вы абсолютно уверены?
Для приведенного кода уверен. Метод $user->save(false) один и тот же.

Можно где-нибудь скачать этот движок? Потестировал бы.
 
Ответить с цитированием

  #6  
Старый 04.06.2015, 15:28
BigBear
Новичок
Регистрация: 04.12.2008
Сообщений: 11
Провел на форуме:
69033

Репутация: 8
По умолчанию

Race Condition встречается куда чаще, чем вы думаете.

Например, он есть в некоторых версиях WordPress, Joomla.

Экспериментируйте больше !!!
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.