race-condition, помогите раскрутить?

Discussion in 'Песочница' started by newbie67, 4 Jun 2015.

  1. newbie67

    newbie67 New Member

    Joined:
    9 May 2015
    Messages:
    4
    Likes Received:
    2
    Reputations:
    0
    Всем привет!
    race-condition - отличная уязвимость, чтобы получить инвайт в античат. Всё же это посложней, чем найти десяток sql.

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

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

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

    Спасибо
     
    #1 newbie67, 4 Jun 2015
    Last edited: 4 Jun 2015
    xxddz likes this.
  2. newbie67

    newbie67 New Member

    Joined:
    9 May 2015
    Messages:
    4
    Likes Received:
    2
    Reputations:
    0
    Да собственно кода-то чуть чуть) Держите. Вроде закрыл уязвимость при помощи APC, но интерес остался. Можно ли?

    PHP:
    # Снимаем сумму перевода с баланса юзера
    $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);
    Я так понимаю, вот этот участок кода(снятие баланса у Алисы)
    PHP:
    # Снимаем сумму перевода с баланса юзера
    $user User::model()->findByPk(Yii::app()->user->id);
    $user->balance -= $model->sum;
    # Снимаем комиссию перевода с баланса юзера (если имеется)
    if($transfer['commission'] != '0')
    $user->balance -= $transfer['commission'];
    Успевает выполниться дважды. Но почему следующий за ним код (начисление баланса Бобу) не успевает? И можно ли сделать, чтобы как раз только он и успевал
     
    #2 newbie67, 4 Jun 2015
    Last edited: 4 Jun 2015
    xxddz likes this.
  3. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    В коде никаких ограничений нет. Экспериментируй дальше, все получится.
     
  4. newbie67

    newbie67 New Member

    Joined:
    9 May 2015
    Messages:
    4
    Likes Received:
    2
    Reputations:
    0
    Спасибо за ответ!

    Вы абсолютно уверены?
    Может я что-то делаю не так?
    Я через JS с интервалом от 1 до 200 мсек уже попробовал вызывать скрипты. (через jquery .get, и использую setTimeout). Целевой сайт у меня на локалхосте находится.
    Скрипты я вызываю test1.php и test2.php, в обоих прописано по 2 curl запроса - первый на получение токена, второй на отправку средств.
    Списать дважды уже удалось раз 100, а вот добавить - ни разу. Может при такой проектировке (когда я сначала списываю у Алисы, потом добавляю Бобу) и не присутствует уязвимость?
     
  5. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    Для приведенного кода уверен. Метод $user->save(false) один и тот же.
    Можно где-нибудь скачать этот движок? Потестировал бы.
     
  6. BigBear

    BigBear Escrow Service
    Staff Member Гарант - Escrow Service

    Joined:
    4 Dec 2008
    Messages:
    1,801
    Likes Received:
    920
    Reputations:
    862
    Race Condition встречается куда чаще, чем вы думаете.

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

    Экспериментируйте больше !!!
     
    _________________________
    ocheretko likes this.