Это перевод
Ссылка скрыта от гостей
Введение
В этом посте автор покажет, как вы можете использовать новую функцию всплывающих окон HTML в Chrome для эксплуатации XSS в мета-тегах и скрытых полях ввода. Все началось, когда я заметил новое поведение всплывающих окон в Chrome на Twitter. Мы все знаем о надоедливых диалоговых окнах, которые уговаривают вас подписаться на рассылку - теперь вы можете создавать эти всплывающие окна без JavaScript! О, радость. Это будет апокалипсис рассылок.В любом случае, я заметил эту функциональность и задался вопросом, какие события JavaScript эти всплывающие окна вводят. Действительно, вы можете использовать события
ontoggle
и onbeforetoggle
, и они применяются к цели всплывающего окна - это элемент, который имеет атрибут popover
. Этот атрибут делает элемент невидимым до тех пор, пока вы не переключите элемент с помощью атрибута popovertarget
с элементом, таким как кнопка.Это полезно для обхода WAF, так как вы можете использовать событие
onbeforetoggle
, которое вряд ли будет заблокировано списком блокировки на основе атрибутов:В приведенном выше примере вы можете видеть, что элемент кнопки нацеливается на пользовательский элемент 'xss' с помощью
popovertarget
. Когда кнопка нажата, событие onbeforetoggle
будет запущено.XSS в скрытых полях ввода
Автор опубликовал это в Twitter, как всегда, и Марио Хайдерих указал, что это даже работает со скрытыми полями ввода. Это интересно, потому что обычно, если у вас есть XSS внутри скрытого поля ввода, его может быть трудно эксплуатировать, потому что большинство событий не работают. Вы можете использовать клавиши доступа, но это требует взаимодействия с пользователем. Однако использование всплывающих окон позволяет использовать новые события в скрытых полях ввода:Пример кода, показывающий применение всплывающих окон к скрытым полям ввода
Марио упомянул, что потребуется две точки инъекции; одна безвредная инъекция HTML с очисткой и одна внутри скрытого поля ввода. Но это заставило меня задуматься - может быть, нужна только одна. Я запустил HTML-страницу и проверил, что произойдет, если у двух элементов будет один и тот же идентификатор. Представьте себе сайт, содержащий код с использованием атрибута popovertarget и имеющий уязвимость XSS внутри скрытого поля ввода:
Пример кода с дублирующимися атрибутами
id
для демонстрации того, что используется первый атрибут.Наш инъецированный код выполнит событие
onbeforetoggle
внутри скрытого поля ввода, потому что оно происходит первым. Это означает, что вам нужна только одна точка инъекции, при условии, что она происходит до любого существующего всплывающего окна. Всплывающие окна затем позволят использовать события ontoggle
и onbeforetoggle
для запуска скрытых полей ввода с помощью клика. Так что это очень полезно, если у вас есть XSS внутри скрытого поля ввода и на странице есть существующий элемент popover
.XSS в мета тегах
Теперь это уже становится довольно интересным, но подождите, есть еще! Матиас Карлссон присоединился к обсуждению со своей точкой зрения; эта техника позволяет использовать событиеonbeforetoggle
на элементе meta, при условии, что есть существующий элемент popover
. Это интересно, потому что, как и скрытые поля ввода, элементы meta сильно ограничены. В приведенном ниже примере у вас есть инъекция внутри элемента meta, который использует атрибут popover
и дублирующийся идентификатор (newsletter), который нацеливается на существующее всплывающее окно на странице:Пример кода, показывающий, что событие
onbeforetoggle
будет запущено в элементе metaКогда пользователь пытается подписаться на рассылку, он вместо этого запустит событие onbeforetoggle на скрытом поле ввода.
Как всегда, мы обновили
Ссылка скрыта от гостей
с этими новыми векторами. Если вам нравятся обходы фильтров XSS, вы можете насладиться нашими лабораториями по
Ссылка скрыта от гостей
и той, которая
Ссылка скрыта от гостей
.Наслаждайтесь!
Если вам понравился материал, то дайте обратную связь и я продолжу делать переводы статей с PortSwigger'а.