UPD 8.05.2019: Google теперь поддерживает 74 версию Chromium для рендеринга страниц, что делает статью не актуальной.

Tom Antony, который уже публиковал информацию об уязвимости sitemap.xml в Google, на этот раз нашел способ встраивать яваскрипт на чужих сайтах и, таким образом, манипулировать поисковым индексом.

Краткая версия

Googlebot рендерит сайты 41й версией хрома (2015), которая не имеет встроенного XSS-аудитора, защищающего пользователей браузера от XSS-атак. В то же время, многие сайты подвержены XSS-атакам, когда с помощью манипулирования адресом страницы можно в код встроить JavaScript.

Так как Google исполняет JavaScript, это позволяет злоумышленникам подстраивать урлы и манипулировать контентом уязвимых сайтов. Например, встраивать ссылки, которые Google будет индексировать и передавать вес.

Том написал об этой уязвимости в Google еще в ноябре 2018, но те так ничего и не предприняли (упоминая сложности внутренней коммуникации), поэтому Том выложил все в паблик, чтобы владельцы сайтов могли защититься от такого рода аттак. Пока у Google нет планов устранять проблему.

XSS атаки

Существует ряд межсайтовых (XSS) атак, но нам интересен случай, когда на страницу можно встроить собственный JavaScript-код. Этот код выполнится в браузере клиента (даже если он не планировался быть частью сайта). Например, представим такой кусок кода на PHP, который подразумевает вывод динамического параметра page.

Если кто-то изменит URL и вместо числа напишет там код типа:

/stores/?page=<script>alert('hello');</script>

Тогда получится HTML-код с инлайн-скриптом, который авторы не задумывали, что он здесь появится.

Встроенный на страницу Javascript

Этот вредоносный Javascript может делать много разной пакости, например, воровать пользовательские данные, или заставить пользователя думать, что предоставленный контент родной. Посещая трастовый домен, пользователи доверяют размещенному на нем контенту и хакер может этим манипулировать.

Хром спешит на помощь

По этой причине в Google Chrome существует XSS аудитор, который идентифицирует подобного рода уязвимости и защищает пользователя (не давая загрузить страницу).

XSS Auditor

Пока все здорово.

Googlebot = Chrome 41

Бот гугла сейчас использует 41 версию хрома, о чем известно из официальной документации Google. Также мы знаем, что Google понимает яваскрипт и индексирует эти сайты. Но в Chrome 41 нет XSS аудитора (о чем автор узнал при тестировании уязвимостей), поэтому Googlebot не имеет такой защиты.

Поэтому, первый шаг — проверить, будет ли Googlebot (а вернее его подсистема WRS) рендерить урлы с XSS-атакой. Один из тестов проводился на одном из банков-стартапов Revolut — если 3х летний финансовый стартап с инвестициями в $330 млн. имеет XSS уязвимость, то вы понимаете широту проблемы (банк сейчас пофиксил проблему).

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

Ссылка на сайте Revolut

Контент и ссылки индексируются

Том отправил тестовую страницу на индексацию и проанализировал сохраненную копию, поставленная скриптом ссылка оказалась в кеше.

Ссылка появляется в кеше гугла

Канонические теги

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

Смена канонического тега яваскриптом

Что также видно в Search Console, где встроенный canonical отображается как настоящий.

Еще информация по rel canonical

Ссылки краулятся и учитываются

Мы узнали, что рендеринговая система Google подвержена XSS-атаке, что гугл выполняет яваскрипт и индексирует контент (включая канонические теги). Дальше интересно, найдет ли он размещенные ссылки и будет ли по ним переходить. Размещение ссылок на чужих сайтах это основа алгоритма PageRank и ключевой фактор, как сайты ранжируются на поиске.

Для тестирования этого, на сайте Revolut была размещена ссылка на свежий новорег. После отправки ссылки на индексацию, Google зашел на этот тестовый домен и позже он появился в индексе.

Смена сниппета Revolut

Это дало понять, что гугл краулит и индексирует встроенные яваскриптом ссылки. Собственно, гуглоиды об этом говорили и раньше, яваскрипт-ссылки учитываются им как и обычные html-ссылки.

Google учитывает ссылки в яваскрипт

Все это демонстрирует потенциальную возможность манипулировать результатами поиска. Автор уверяет, что не стал дальше тестировать и остановил эксперименты.

Как всем этим злоупотреблять?

Очевидный вектор применения здесь — внедрять свои ссылки на чужие сайты и манипулировать результатами поиска. Всего несколько ссылок с известных сайтов могут дать значительные изменения выдачи. Проект http://www.openbugbounty.org показывает более 125 тысяч незакрытых XSS-уязвимостей. Включая 260 .gov доменов, 971 .edu домен, и 195 доменов из ТОП500 (взятых из рейтинга Majestic).

Другое применение — создание вредоносных страниц (например, редирект пользователя на сайт злоумышленника или на конкурентный товар), что будет найдено и проиндексировано гуглом. Этот контент также может влиять на сниппеты в результатах поиска. Кстати, Firefox не имеет нормальной защиты от XSS, поэтому, эти же страницы будут подгружаться для пользователей Firefox.

Защита

Очевидная защита в данном случае — уделить особое внимание безопасности. Необходимо убедиться, что ваш сайт не имеет XSS-уязвимости. Но учитывая данные с OpenBugBounty, защититься не так просто, как кажется. Собственно, поэтому Google и разработал XSS аудитор.

Что вы можете сделать быстро — это проверить серверные логи на предмет наличия в урлах слова "script", что будет говорить о попытках атаки.

Встраивание чужого кода это достаточно серьезная уязвимость, которая может негативно повлиять на пользователей, владельцев сайтов и рекламодателей. Google знает о ней с ноября 2018, но пока что не предпринял никаких действий. Похоже, что там много команд и есть некие сложности коммуникации. Надеемся, что в ближайшее время дырка будет закрыта.

Источник: www.tomanthony.co.uk

Полезные материалы в телеграме: @devakatalk