Нестандартная XSS в сервисе для публикации Android приложений в Яндекс.Store.
При добавлении нового приложения из apk извлекаются иконки, которые доступны по адресу
https://developer.store.yandex.ru/static/icon/<app_id>/<name>.png
Я обнаружил, что для иконок проверяется только расширение по белому списку (png, gif, jpg), но отсутствует проверка содержимого и регистра названия. Оказалось, что использование нестандартного регистра в расширении (например, ic_launcher.PNG
) не поддерживается веб-сервером и заголовок Content-Type начинает определяться по контенту файла.
Таким образом, если в Android приложении заменить иконку файлом <html><script>alert(1)</script></html>
с названием ic_launcher.PNG
, подписать его и загрузить на сервер, то получается Stored XSS.
Аналогичным образом можно было загрузить вместо иконки SWF-файл и, используя дополнительные уязвимости, найденные ранее, довести атаку до полного захвата пользовательской сессии.
А именно:
1) Небезопасная настройка crossdomain.xml
на browser.export.yandex.com
(файл уже недоступен)
<allow-access-from domain="*"/>
2) XScript сценарий, выводящий все Cookie пользователя, включая Session_id. Для доступа к нему необходим был заголовок Referer, соответствующий регулярному выражению yandex сайтов.
browser.export.yandex.com/xml/common.xml
(файл уже недоступен)
Примеры используемых apk:
https://blackfan.ru/bugbounty/xss_html.apk
https://blackfan.ru/bugbounty/xss_flash.apk