ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Песочница (https://forum.antichat.xyz/forumdisplay.php?f=189)
-   -   race-condition, помогите раскрутить? (https://forum.antichat.xyz/showthread.php?t=426277)

newbie67 04.06.2015 03:38

Всем привет!

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

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

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

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

Спасибо

newbie67 04.06.2015 03:43

Да собственно кода-то чуть чуть) Держите. Вроде закрыл уязвимость при помощи 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

Успевает выполниться дважды. Но почему следующий за ним код (начисление баланса Бобу) не успевает? И можно ли сделать, чтобы как раз только он и успевал

M_script 04.06.2015 05:47

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

newbie67 04.06.2015 14:41

Цитата:

Сообщение от M_script

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

Спасибо за ответ!

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

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

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

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

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

M_script 04.06.2015 15:16

Цитата:

Сообщение от newbie67

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

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

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

BigBear 04.06.2015 15:28

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

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

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


Время: 23:35