Простой скрипт изменяет поведение кнопки Back в браузере и подменяет исходную поисковую выдачу, направляя пользователей на контролируемые хакером копии сайтов конкурентов

Распространённый паттерн: открыть страницу поиска в Google и щёлкать по разным результатам в поисках нужной информации. Можно открыть десятки отдельных вкладок или ходить на каждый сайт по очереди, возвращаясь затем на поисковую выдачу (кнопка Back в браузере). Специалист по поисковой оптимизации Дэн Петрович из австралийской компании Dejan Marketing придумал, как эксплуатировать этот паттерн с выгодой для себя и получить обширную статистику посещений сайтов конкурентов, лишив их трафика.

Схема показана на иллюстрации вверху. Перехватывая трафик конкурентов, специалист получает возможность:

  • генерировать теплокарты чужих сайтов (клики, переходы, глубина прокрутки)
  • записывать реальные сессии (движения мыши, нажатия клавиатуры)
  • получать весь текст из заполненных форм, в том числе форм для заказа товаров

Разумеется, Дэн Петрович не делал ничего из перечисленного, потому что это явное нарушение закона. Вероятно, нарушением закона будет и альтернативный способ изучения сайтов конкурентов, без подделки поисковой выдачи, а с помощью обычного клонирования чужого сайта — и покупки трафика через социальные медиа и т.д.

Баг в браузерах по-прежнему не закрыт, так что этим способом могут воспользоваться и другие злоумышленники: код JavaScript для эксплуатации уязвимости опубликован в открытом доступе. Собственно, такой скрипт легко написать и самому, зная функциональность метода history.pushState() для изменения истории браузера с учётом реферера.

Дэн Петрович обращает внимание, что впервые использовал этот трюк ещё в ноябре 2012 года. Тогда вместо закрытия уязвимости компания Google вручную понизила его страницу в поисковой выдаче (ту страницу, с которой осуществлялась переадресация на поддельные результаты поиска по кнопке Back). Сейчас, когда он повторно продемонстрировал данный способ, Google поступил ещё более жёстко. Без всяких уведомлений в Search Console его сайт удалили из поискового индекса целиком.

Хакер признаёт, что в сообществе информационной безопасности принято иначе обрабатывать найденные уязвимости. О них сначала сообщают разработчикам и ожидают исправления бага, и только постфактум рассказывают о нём. Профессиональные пентестеры подробно объяснили автору, как он должен был безопасным способом продемонстрировать данную уязвимость. Но Петрович поступил иначе — он показал схему на реальных сайтах и сразу рассказал всем. Кроме того, есть большие сомнения в законности подобного хака даже без реальной слежки за пользователями, то есть в легальности создания поддельных копий чужих сайтов и перенаправлении туда пользователей. Но за прошедшие годы никто из конкурентов не подавал судебных исков, как и компания Google (которая тоже является пострадавшей из-за поддельной поисковой выдачи). Это полноценный фишинг, пусть и в демонстрационных целях и без злого умысла. То есть этичность действий SEO-специалиста под вопросом.

Но факт остаётся фактом: за прошедшие годы кнопка Back в браузере по-прежнему уязвима для манипуляции. По словам Петровича, другие сайты тоже используют эту технику для слежки за посетителями на сайтах конкурентов. Он считает, что Google следовало не исключать его сайт из поискового индекса, а провести ряд мероприятий, чтобы этот старый трюк перестал работать:

  1. Устранить возможность манипуляции кнопкой Back в Chrome.
  2. Автоматически понижать в выдаче сайты, которые используют этот трюк (а не вручную штрафовать только его лично). В данный момент Google не замечает этих скриптов: эксперимент Петровича оставался незамеченным пять лет и его сайт высоко ранжировался в поисковой выдаче.
  3. Помечать страницы с history.pushState() и подменой поисковой выдачи как «опасные».

От такого фишинга частично защищают сертификаты SSL с привязкой к организации (OV) и с расширенной проверкой (EV), но это всё равно не панацея от невнимательности пользователей.

Эксперимент Дэна Петровича показал, что сейчас около 50% пользователей не находят ничего подозрительного, когда их перенаправляют на поддельную поисковую выдачу, а потом на копию другого сайта в локальном домене. Многие пользователи не проверяют, кому принадлежит сертификат и не вчитываются в URL — они просто довольны, что в браузере есть значок защищённого соединения, хотя тот выдан на чужой домен. Злоумышленники давно выяснили, что значок защищённого соединения повышает доверие к фишинговому сайту.

Для решения этой проблемы можно предпринять ряд мер, например:

  • Требовать подтверждения пользователя применения методов history.pushState и History#replaceState.
  • Подсвечивать наиболее важную часть URL в адресной строке Chrome, как это делает Firefox.
  • Не помечать сайты HTTPS как «безопасные», потому что это вводит пользователя в заблуждение и даёт ложное чувство безопасности.
  • Изменять значок кнопки Back, если она ведёт на адрес, отличный от предыдущей страницы.

Комментарии (30)


  1. Burtanshy
    28.08.2018 12:15

    вот так и надо поступать, а то развели бекдоров — им еще шанс на новые рельсы подавай видите ли.


  1. aamonster
    28.08.2018 12:19

    Гуглим по словам «history.pushstate vulnerability» и видим, что проблема была известна в 2010 и даже были попытки решения: stackoverflow.com/questions/4570093/how-to-get-notified-about-changes-of-the-history-via-history-pushstate
    Там ещё было забавное в выдаче — например, в 2017 кто-то пытался эту уязвимость сдать в гугловскую bugs bounty, но не преуспел.


  1. Hardcoin
    28.08.2018 12:51

    Во-первых, он не узнает поведение на чужом сайте. Он может отправить на фишинговую копию, это да. Во-вторых, тестил такой подход лет пять назад (слал не на фишинг, а просто на рекламу) — процент пользователей кнопки Back — небольшой. И работало на тот момент не в каждом браузере. Ерунда, короче.


  1. force
    28.08.2018 13:14

    О да, давайте запретим history.pushstate и сломаем все SPA сайты или же задолбаем пользователя вопросами, которые он вообще не понимает.


    1. KYKYH
      28.08.2018 18:30
      +2

      Насколько я понимаю, history API нужен для того, чтобы записывать историю spa. Почему бы не проверять вставляемые адреса в history и в location на идентичность домена?


      1. selivanov_pavel
        28.08.2018 19:41

        +1, это позволит сохранить работоспособность SPA, и закроет вектор для фишинговой атаки.


      1. force
        28.08.2018 20:00

        Ниже уже вроде ответили, но и сейчас нельзя заменить домен, вот что мозилла пишет:

        The new URL must be of the same origin as the current URL; otherwise, pushState() will throw an exception.


  1. firuz1844
    28.08.2018 13:34

    В Safari 11.1 на MacOS выдает «SecurityError: Blocked attempt to use history.pushState() to change session history URL from developer.mozilla.org/ru/docs/Web/API/History/pushState to ya.ru. Protocols, domains, ports, usernames, and passwords must match.»


    1. CoolCmd
      28.08.2018 17:30

      в примере google.mysite.tld вместо google.com не просто так…


  1. Protos
    28.08.2018 14:36

    Объясните, пожалуйста, простым языком о чем речь в статье. Речь о том что на сайте кнопка back вызывает pushstate и меняет адрес сайта в истории и узнает куда ведет ссылка из истории браузера, смотрит что за выдача была по ссылке и шлёт на копию поисковой выдачи на домене злоумышленник что по кнопке back должна была быть и затем следующие запросы проксирует через себя?


    1. aamonster
      28.08.2018 15:40
      +1

      Юзер что-то гуглит, со страницы поиска заходит на страницу злоумышленника. Та подменяет URL для back на URL _фальшивой_ страницы поиска — с которой пользователя можно слать на фальшивые сайты конкурентов. Пользователь нажимает back и оказывается не на настоящем поисковике, а на фальшивом.
      Для тех, у кого страницы из поисковика открываются в новой вкладке (потому что так в гугле сделано или просто человек привык открывать в новой вкладке) метод не сработает, но для них есть window.opener.location=«вредоносный_сайт».


      1. psycho-coder
        28.08.2018 17:01

        потому что так в гугле сделано или просто человек привык открывать в новой вкладке

        Зайдите в google.com и google.ru, затем введите один и тот же запрос. И покликайте по ссылкам, приятно удивитесь.


        1. Backuper
          30.08.2018 12:53

          никакой разницы в хроме нет


          1. psycho-coder
            30.08.2018 20:00

            Проверил у себя, Linux Mint, .com открывает в той же вкладке, .ru в новой. В макоси также себя ведет в разных браузерах. Может настройки какие у вас…


    1. Imposeren
      28.08.2018 15:49
      +1

      * Делаются копии конкурентов: примерно тех же что отдаёт гугл
      * Делается «копия» гугла с выдачей «копий конкуррентов»
      * history.pushState запихивает в историю «копию гугла с нужными результатами»
      * В результате пользователь может попасть на поддельные сайты конкурентов, а раз копии во владении «хакера», то он может и клики трекать, и пароли собирать, и вообще делать что-угодно.

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


  1. catharsis
    28.08.2018 14:47

    Можно редиректить пользователя на google.mysite.tld а потом обратно и без манипуляции историей.
    Можно вместо своего сайта показывать фишинговые результаты поиска, с точки зрения пользователя будет как "не кликнулось".
    Можно просто вместо своего сайта показывать фишинговые копии конкурентов и изучать поведение пользователей. Хотя, в таком случае зачем что-то еще изучать.
    Для всего этого надо сначала попасть в топ выдачи.


  1. untilx
    28.08.2018 15:35

    По-моему, я что-то не понимаю. Как он собирается подменять адреса на фейковые, если pushState во всех современных браузерах запрещает подмену домена/поддомена?


    1. Imposeren
      28.08.2018 15:51

      Может можно пушить поддомены с основного домена? Например на сайте foobar.com пушить google.foobar.com. Некоторые браузеры наверняка и такое запрещают, но видимо не все.


    1. Perlovich
      28.08.2018 15:53

      Подменить домен/поддомент нельзя. Но можно же пользователя никуда со своего сайта и не редиректить.

      1) Пользователь в выдаче гугла перешел на сайт evilSite.com/
      2) Этот сайт запушил в историю 2 стейта = «evilSite.com/googleClone» и «evilSite.com/main». URL в поисковой строке браузера в этот момент = «evilSite.com/main».
      3) Пользователь жмет назад, попадает на клон гугла («evilSite.com/googleClone»).

      В теории, если пользователь совсем не смотрим, что там в URL и копия сделана супер качественно, то может сработать.


      1. untilx
        28.08.2018 16:01
        +1

        В примере предлагается именно подмена домена, потому и спрашиваю. Замена просто адреса это совсем уже нагло, хотя с некоторыми может сработать. В общем, не понятно, о чём статья.


        1. aamonster
          28.08.2018 17:27

          На другой домен со своей страницы заредиректить можно (история «вперёд» потеряется — но юзер это, скорее всего, не заметит). Но и без подмены домена юзер может не заметить.


  1. Perlovich
    28.08.2018 15:52

    del


  1. legolegs
    28.08.2018 17:44

    А что, только меня history.pushState раздражает и дезориентирует даже на добросовестных сайтах? Например, когда перешёл с xxx.org на yyy.com, а тебе сразу в историю пушат ещё один yyy.com и если один раз нажать «назад», то «вернёшься» не на xxx.org, а на yyy.com, который снова пушнет тебе самого себя в историю. Получается этакая беговая дорожка, если инет быстрый, то сколько кнопку назад не долби — с yyy.com не убежишь.

    ИМХО, history api — плохая технология и ещё и небезопасная, как видно из статьи. Да что уж там, об этом ещё Оруэлл писал!


    1. bano-notit
      29.08.2018 04:53

      Нормальная технология. Вообще нет понятия плохая технология. Есть понятие неправильное использование технологии.


    1. Evir
      29.08.2018 09:27

      Не знаю, как Chrome, а Firefox позволяет «зажать» кнопку «назад», примерно через секунду выпадает список предыдущих страниц. В итоге можно перескочить назад более чем на один пункт.


  1. dimonoid
    28.08.2018 22:56

    https://addons.mozilla.org/en-CA/android/addon/open-link-with-new-tab/?src=search


    Открывает все ссылки в новой вкладке по правомо клику мыши. Значительно повышает производительность серфинга, и как я только что узнал, защищает от такого рода атак. Побочные явления-очень быстро входит в привычку, обычно у меня не менее 600 открытых вкладок, чищу их примерно раз в месяц. Очень удобно, наверное только из за этого дополнения я и сижу с мозиллой. Есть ли аналоги для хрома, не знаю.


    1. Wesha
      29.08.2018 00:26

      Настоящие индейцы не пользуются кнопой Back, они пользуются зажатым CTRL при щелчке по ссылке.


    1. xxxFeLiXxxx
      29.08.2018 01:41

      Так в Хроме (вроде и в мозилле) по нажатию ссылки средней клавишей мыши открывает в новой вкладке, без всяких расширений.


  1. fpir
    29.08.2018 10:53

    И конечно в настройках Хрома устанавливается, как открывать вкладки при щелчке по ссылке. Как раз для поиска и устанавливаю «в новой вкладке». Ищешь, бывало, «как натянуть сову на глобус» и в первой строке-через анус, не, стрёмно-закрываешь, во второй-через клюв-а что, может быть, оставим пока открытой и посмотрим как там в третей строке предлагают через глаз.


  1. greenkey
    30.08.2018 12:53

    Будет ли это работать, если сайт HTTPS. Иными словами, получит ли он данные с HTTPS сайта таким образом?