Здравствуйте уважаемые хабровчане. Хочу рассказать вам как я впервые воспользовался услугами переводов migom, и почему мой опыт был, так сказать, необычным. Так же надеюсь что руководство системы возможно обратит внимание на баги, и сделают свой сервис хоть на капельку лучше, или хотя бы закроют существующие баги.
Обращаю внимание что никакого «взлома» и прочих вещей я не производил, просто воспользовался теми возможностями, которые доступны любому посетителю сайта.
Началось все с того, что появилась необходимость провести денежный перевод с Беларусии в Украину суммой Х. Предварительно переговорив с человеком, который должен был отправлять перевод выбрали популярную систему, назовем ее условно «стрим».
Собственно по каким то, не известным мне причинам, заказчик не смог сделать перевод через проверенную мной систему «стрим», и выполнил его через migom. Вот с этого момента и начался батхерт.
Мне было необходимо сразу же проверить, действительно в системе есть данный перевод, или меня просто «кинули» написав произвольный «номер перевода» (да-да, и такое бывало). Недолго думая, перешел на сайт migom.com и попытался воспользоваться формой «проверка статуса перевода», обычно такая функция есть у всех подобных организациях/сайтах.
Вбивая контрольный номер, и фамилию отправителя, я сразу обратил внимание на то что проверка идет по http каналу (не зашифрованному). Попробовал зайти по https — увидел не подписанный сертификат, что тоже меня огорчило. Возможно, для кого то атаки формата «человек по середине» не страшны, но в тот момент, для меня это было важно (не было доступа к vpn, да и лично у меня бывали неприятные случаи).
Ну да ладно, отложил проверку, позже подсоединился к надежной сети, и попытался проверить статус перевода. Проверка статуса не работала. Другими словами, что вводил произвольное число, что действительный номер перевода — результат был одинаковым «Результат перевода:», и в добавок «подождите N секунд».
Я думаю рядовой пользователь на этом месте, развернулся бы и не пытался разрешить проблему. Обычно, я в таких ситуациях отправляю сообщение с описанием бага. Сначала я попытался воспользоваться формой «задать вопрос», но как ни странно, она тоже не работала, из-за правил ограничения домена js ( если заходить на www домен).
Ну да ладно, оформил сообщение, послал с помощью формы на www домене и на почту migom@migom.com и некоторые дрругие почтовые ящики формата "@migom.com". Прошел день, ответа — нет. Других контактных данных я не нашел. По телефону +7 (800) 555-88-55 — никому не дозвонился.
Тут то я уже решил найти «способ проверки», так как идти в кассу или в другой пункт «вывода» просто не было возможности. Просмотрел исходный код, и за 2 минуты просто нашел уязвимость в php скриптах расположенных в админке:
Она позволяла просто провести авторизацию любому пользователю. Приводить полное описание здесь не буду, так как на момент написания поста эти проблемы остаются открытыми, да и найти баг не составит труда.
Не долго думаю — вошел в админку:

Функции «проверки статуса перевода» там не нашлось, поэтому решил проверить что есть. Первым я проверил загрузчик файлов, и не зря — он принимал файлы любого типа.

Загрузил пару файлов:
http://migom.com/upload/store/p/info.php
http://migom.com/upload/store/p/habr.php
Загрузчик скушал, и не поругался.
Далее присмотрелся к файлу ajax/check_transfer.php — перевод проверялся через этот скрипт.
Начало не оставило надежды на качественный код, там было типичное «php месиво». Все таки я нашел curl код, отвечающий за запрос к dll шлюза etrust.ru. Да и в базе данных храниться вся необходимая информация для проверки платежа.
Вот так я проверил, что мой перевод на указанную сумму не существует, а на самом деле мне перевели на 100$ чем договаривались.
Я не преследовал цели подорвать репутацию компании, или производить какие либо не законные действия. Перед тем как писать этот пост, я все еще не надеялсяна денежное вознаграждение, на то что мне ответят и послал еше одно сообщение на migom@migom.com, и вот что я получил в ответ:

Обращаю внимание что никакого «взлома» и прочих вещей я не производил, просто воспользовался теми возможностями, которые доступны любому посетителю сайта.
Предыстория
Началось все с того, что появилась необходимость провести денежный перевод с Беларусии в Украину суммой Х. Предварительно переговорив с человеком, который должен был отправлять перевод выбрали популярную систему, назовем ее условно «стрим».
Собственно по каким то, не известным мне причинам, заказчик не смог сделать перевод через проверенную мной систему «стрим», и выполнил его через migom. Вот с этого момента и начался батхерт.
Мне было необходимо сразу же проверить, действительно в системе есть данный перевод, или меня просто «кинули» написав произвольный «номер перевода» (да-да, и такое бывало). Недолго думая, перешел на сайт migom.com и попытался воспользоваться формой «проверка статуса перевода», обычно такая функция есть у всех подобных организациях/сайтах.
Вбивая контрольный номер, и фамилию отправителя, я сразу обратил внимание на то что проверка идет по http каналу (не зашифрованному). Попробовал зайти по https — увидел не подписанный сертификат, что тоже меня огорчило. Возможно, для кого то атаки формата «человек по середине» не страшны, но в тот момент, для меня это было важно (не было доступа к vpn, да и лично у меня бывали неприятные случаи).
Ну да ладно, отложил проверку, позже подсоединился к надежной сети, и попытался проверить статус перевода. Проверка статуса не работала. Другими словами, что вводил произвольное число, что действительный номер перевода — результат был одинаковым «Результат перевода:», и в добавок «подождите N секунд».
Поиск способа проверки перевода
Я думаю рядовой пользователь на этом месте, развернулся бы и не пытался разрешить проблему. Обычно, я в таких ситуациях отправляю сообщение с описанием бага. Сначала я попытался воспользоваться формой «задать вопрос», но как ни странно, она тоже не работала, из-за правил ограничения домена js ( если заходить на www домен).
Ну да ладно, оформил сообщение, послал с помощью формы на www домене и на почту migom@migom.com и некоторые дрругие почтовые ящики формата "@migom.com". Прошел день, ответа — нет. Других контактных данных я не нашел. По телефону +7 (800) 555-88-55 — никому не дозвонился.
Тут то я уже решил найти «способ проверки», так как идти в кассу или в другой пункт «вывода» просто не было возможности. Просмотрел исходный код, и за 2 минуты просто нашел уязвимость в php скриптах расположенных в админке:
http://migom.com/_admincp/index.php
Она позволяла просто провести авторизацию любому пользователю. Приводить полное описание здесь не буду, так как на момент написания поста эти проблемы остаются открытыми, да и найти баг не составит труда.
Не долго думаю — вошел в админку:

Функции «проверки статуса перевода» там не нашлось, поэтому решил проверить что есть. Первым я проверил загрузчик файлов, и не зря — он принимал файлы любого типа.

Загрузил пару файлов:
http://migom.com/upload/store/p/info.php
http://migom.com/upload/store/p/habr.php
Загрузчик скушал, и не поругался.
Далее присмотрелся к файлу ajax/check_transfer.php — перевод проверялся через этот скрипт.
Начало не оставило надежды на качественный код, там было типичное «php месиво». Все таки я нашел curl код, отвечающий за запрос к dll шлюза etrust.ru. Да и в базе данных храниться вся необходимая информация для проверки платежа.
- $ch = curl_init();
- $opts = array(
- CURLOPT_URL => $dll_url,
- CURLOPT_SSL_VERIFYPEER => 0,
- CURLOPT_SSL_VERIFYHOST => 0,
- CURLOPT_POSTFIELDS => $xml,
- CURLOPT_HTTPHEADER => array($dll_header,'Content-Type:text/xml; charset=windows-1251'),
- CURLOPT_RETURNTRANSFER => 1,
- CURLOPT_TIMEOUT => 30,
- CURLOPT_HEADER => 0,
- CURLINFO_HEADER_OUT => 1,
- CURLOPT_FOLLOWLOCATION => 0,
- CURLOPT_FAILONERROR => 0,
- CURLOPT_PROTOCOLS => CURLPROTO_HTTP|CURLPROTO_HTTPS,
- CURLOPT_REDIR_PROTOCOLS => CURLPROTO_HTTP|CURLPROTO_HTTPS
- );
- curl_setopt_array($ch, $opts);
- $response = curl_exec($ch);
- print_r($response);
Вот так я проверил, что мой перевод на указанную сумму не существует, а на самом деле мне перевели на 100$ чем договаривались.
Итог
Я не преследовал цели подорвать репутацию компании, или производить какие либо не законные действия. Перед тем как писать этот пост, я все еще не надеялся
