PDA

Просмотр полной версии : race-condition, помогите раскрутить?


newbie67
04.06.2015, 03:38
Всем привет!

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

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

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

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

Спасибо

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


# Снимаем сумму перевода баланса юзера
$user=User::model()->findByPk(Yii::app()->user->id);
$user->balance-=$model->sum;
# Снимаем комиссию перево а с баланса юзера (если и меется)
if($transfer['commission'] !='0')
$user->balance-=$transfer['commission'];
# Сохраняем данные пользо ателя
$user->save(false);
# Добавляем другому юзеру баланс
$user=User::model()->findByPk($model->idUserTo);
$user->balance+=$model->sum;
# Сохраняем данные пользо ателя
$user->save(false);

Я так понимаю, вот этот участок кода(снятие баланса у Алисы)


# Снимаем сумму перевода баланса юзера
$user=User::model()->findByPk(Yii::app()->user->id);
$user->balance-=$model->sum;
# Снимаем комиссию перево а с баланса юзера (если и меется)
if($transfer['commission'] !='0')
$user->balance-=$transfer['commission'];

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

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

newbie67
04.06.2015, 14:41
↑ (https://antichat.live/posts/3855340/)
В коде никаких ограничений нет. Экспериментируй дальше, все получится.


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

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

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

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

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

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

M_script
04.06.2015, 15:16
↑ (https://antichat.live/posts/3855471/)
Вы абсолютно уверены?


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

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

BigBear
04.06.2015, 15:28
Race Condition встречается куда чаще, чем вы думаете.

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

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