Вступление


Снова всем привет.

На этот раз статья не будет поднимать «сурьезные» вопросы.

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

В данный момент Qiwi уже благополучно ее залатали, так что я буду стараться подкреплять объяснения современными скриншотами, иногда поясняя, как это выглядело 2.5 года назад.

Теперь к делу


Допустим, у вас есть логин: пароль к чужому кошельку Qiwi.
Допустим, там лежит 100к рублей.
И вы оооочень хотите завладеть ими.
Но просто так списать деньги нельзя — нужно подтверждение по СМС.
Но мы же смышленые, нас это не остановит.

Шаг 1. Логинимся в аккаунт и создаем там виртуальную карту.
Видим такую картину



Выглядит так, будто у нас очень мало информации. Всего 4 последние цифры карты и время действия карты.

Но раньше там было 6 (!) последних цифр карты. То есть были неизвестны еще 10 цифр.
А нам нужны все цифры карты. Где взять еще? Очень просто.
У всех карт есть BIN — первые 6 цифр карт определенного банка одного типа должны быть одинаковы.

Шаг 2. Лезем в браузер и гуглим «Qiwi BIN»

Сразу же узнаем, что бин — 489049.
И вот у нас уже есть 12 цифр! Осталось всего 4!

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

Шаг 3. Находим последние недостающие 4 цифры

Для этого нам потребуется иметь аккаунт в Qiwi с 1000р и знать, что такое Алгоритм Луна.
Давайте по порядку.
Если открыть любую операцию в Qiwi, то там показывает дату платежа и номер квитанции.
Может быть некоторые уже догадались, зачем нам 1к на счету.
Да, мы будем подставлять по порядку цифры вместо тех неизвестных 4х цифр, которые остались неизвестными и отсылать на эти номера карт по рублю!
И при одной из операций мы получим входящий 1р на тот счет, где лежат заветные 100к рублей.
Останется только сопоставить время отправки денег.
Раньше можно было сопоставить номера операций, но сейчас это скрыли. И правильно сделали.
А теперь самые внимательные скажут, что вообще-то 4 цифры — это 10к операций, а не 1к. Значит нужно 10к рублей и очень много времени, чтобы так найти нужные 4 цифры.
И это не совсем так. Представляю вам Алгоритм Луна!

Алгоритм Лу?на (англ. Luhn algorithm) — алгоритм вычисления контрольной цифры номера пластиковой карты в соответствии со стандартом ISO/IEC 7812. Не является криптографическим средством, а предназначен в первую очередь для выявления ошибок, вызванных непреднамеренным искажением данных (например, при ручном вводе номера карты, при приёме данных о номере социального страхования по телефону). Позволяет лишь с некоторой степенью достоверности судить об отсутствии ошибок в блоке цифр, но не даёт возможности нахождения и исправления обнаруженной неточности.


Если очень интересно — гуглите, а я расскажу вкратце об алгоритме и чем он нам поможет.
Этот алгоритм позволяет подтвердить, валиден ли номер карты. То есть, прогнав наши 10к вариантов через этот алгоритм, можно оставить только номера потенциально существующих карт. Догадаетесь сколько таких будет?
Верно, ровно 1к.

Конечно, это все кажется очень запарно делать вручную, но что мешает сделать простой скрипт для генерации этих самых 1к вариантов?

Вот вам примеры реализации с Википедии:

Пример Алгоритма Луна на JS
function luhnAlgorithm(digits) {
  let sum = 0;

  for (let i = 0; i < digits.length; i++) {
    let cardNum = parseInt(digits[i]);

    if ((digits.length - i) % 2 === 0) {
      cardNum = cardNum * 2;

      if (cardNum > 9) {
        cardNum = cardNum - 9;
      }
    }

    sum += cardNum;
  }

  return sum % 10 === 0;}


Пример Алгоритма Луна на PHP
function luhnAlgorithm($digit)
{
    $number = strrev(preg_replace('/[^\d]/', '', $digit));
    $sum = 0;
    for ($i = 0, $j = strlen($number); $i < $j; $i++) {
        if (($i % 2) == 0) {
            $val = $number[$i];
        } else {
            $val = $number[$i] * 2;
            if ($val > 9)  {
                $val -= 9;
            }
        }
        $sum += $val;
    }
    return (($sum % 10) === 0);
}


Теперь нам нужно перебрать эти 1к вариантов методом, который я описал выше.
И вуаля — мы получили последние 4 цифры.
Теперь у нас есть полный код карты и ее срок действия.
Конечно, у нас нет CVV кода (тот, который на обратной стороне пишут), но в некоторых местах он и не нужен.
Например Amazon!
Да, заходим на Амазон и заказываем с помощью новоиспеченных данных что угодно.
Например Steam коды на деньги или типа того. В общем что-то электронное, чтобы это быстро продать в интернете. Мы немного потеряем в деньгах, но не более 20%, скорее всего.
Вот и все! Получили +79к профита!

Не забываем, что это уже не работает!


Но если вы найдете что-то похожее — сообщайте Qiwi, они (надеюсь) исправят.
Я выложил это чтобы показать, что можно находить прикольные вещи и дыры безопасности даже не умея программировать. И для общего развития.

Всем удачи :)

Комментарии (16)


  1. onegreyonewhite
    16.08.2019 00:56
    +1

    А два примера кода это абсолютно не программирование. Хотя после того как вы выложили, то уже конечно ничего знать не нужно и мамкины хацкеры сейчас полезут наводить шороху.
    Но само описание уязвимости очень интересное тем, что банки или хранители карточных данных, которые вроде как должны понимать как это всё вычисляется (потому что писали парсер-валидатор карты или посмотрели код используемой библиотеки), с упорством барана показывают эти данные всем кому не лень.


    1. AddRaiser Автор
      16.08.2019 01:08
      +1

      При желании можно и онлайн проверить все, даже без кода.
      А код я из Википедии взял, тоже несложно добыть :)


      1. Brother79Mail
        16.08.2019 08:49

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


        1. AddRaiser Автор
          16.08.2019 08:54

          Ну такие ребята и не опасны, так как даже готовое решение сумеют испоганить :)


  1. moonz
    16.08.2019 01:07

    У киви есть замечательная API с помощью которой можно вывести хоть 100к, достаточно только один раз код из смс ввести для получения токена. Ну это уже дело техники ;) некоторые профи социальной инженерии делают это весьма эффективно))


  1. armid
    16.08.2019 07:25

    Достаточно специфическая уязвимость. Во первых нужно знать логин и пароль. А во вторых, разве владельцу не будут приходить куча смс о пополнении карт на 1 руб. Что может показаться очень странным.


    1. AddRaiser Автор
      16.08.2019 07:47

      Кажется вы не до конца поняли
      Владельцу придёт всего 1 смс, мы же перебираем кучу карт, а нужная карта всего 1
      Думаю вас бы не напрягло получение 1р на счёт.
      А знание логина: пароля не является чем-то уж очень редким. Просто обычно двухфакторка защищает от вывода денег.


  1. dvmedvedev
    16.08.2019 08:46

    Читал статью о том, как можно заблокировать любой qiwi-кошелек. Нужно всего лишь слать на него по рублю с разными подписями. Говорят, достаточно ста рублей, и антифрод система блокирует кошелек вплоть до того, что активировать его больше нельзя.


    1. SagePtr
      17.08.2019 02:25

      Мне 15 лет назад на Qiwi кошель блокнули тупо из-за того, что трижды неправильно ввёл пароль. Затребовали отсканированную копию договора с мобильным оператором, послал их подальше и больше не пользовался услугами Qiwi и не горю желанием когда-либо иметь с ними дело (благо, на кошельке этом было только около 200 рублей, которые явно не стоили гемора).


    1. Buharovsky
      17.08.2019 09:35

      У меня ребенок по 5-10 рублей переводил во всякие онлайн игры. В результате Киви заблокировали его кошелёк. Правды так и не добились. Он ходил в банк подтверждать личность, присылал им фото своё и паспорта, и тд и тп. Потеряли полторы тысячи. Больше я не общаюсь с банками у которых нет физического офиса.


  1. Amistad
    16.08.2019 16:25
    +1

    Окуеть. Киви пропускал 1000 мошеннических операций.
    А у меня эти муд рые люди заблокировали счет лишь за десяток смен IP адресов (я пользуюсь Opera VPN и Opera Turbo). Я не финансировал ИГИЛ, и Авального, лишь покупки на Али. У меня был абсолютно легальный анонимный базовый статус без верификации.
    А теперь qiwi ТРЕБУЮТ сделать полную верификацию и предоставить:
    – Договор с сотовым оператором
    – Фото с паспортом в руках
    – Экономическое обоснование операций
    И через месяц они начнут списывать 0,5% в день от МОИХ 1200.


    1. moonz
      16.08.2019 18:12

      А теперь qiwi ТРЕБУЮТ сделать полную верификацию и предоставить:

      Это не киви, это ЦБ обязал всех, добро пожаловать в РФ.


      1. Amistad
        16.08.2019 21:45

        Это было за месяц до приказа цб.


    1. lyrjie
      16.08.2019 18:18

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


      1. AddRaiser Автор
        16.08.2019 18:19

        Не теоретический, был проверен на кошельке друга, интересно же :)
        И Киви не особо запарился насчет такого кол-ва операций


    1. mikserok
      16.08.2019 21:53

      Это наступила расплата за пользование бесплатного впна. До тебя с оперы турбо орды школотроников отмыли много ворованых денег через киви. Так что вполне предсказумая блокировка антифрода.