﻿# Межсайтовый скриптинг \(XSS\)

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

XSS подразделяются на несколько подвидов по вектору атаки и способу воздействия\.

## Классификация XSS по вектору атаки

* **Отраженные XSS \(непостоянные\)\.** При данном типе атаки вредоносный скрипт попадает на страницу \(чаще всего в параметрах HTTP\-запроса или через HTML\-формы\) и выполняется при открытии страницы из\-за отсутствия надлежащей обработки\.
* **Хранимые XSS \(постоянные\)\. **Данный вид XSS является более опасным, чем отражённый\. При данном типе XSS злоумышленник внедряет вредоносный код на сервер\. Чаще всего данные с вредоносным кодом сохраняются в базу данных и используются на странице\. В результате каждый раз при отображении страницы в браузере выполняется внедрённый код\.
* **XSS в DOM\-модели\.** В данном типе вредоносный код внедряется при выполнении JavaScript скрипта в браузере пользователя и изменяет DOM атакуемого сайта, благодаря чему внедренный код выполняется в контексте сайта\. 

## Классификация XSS по способу воздействия

* **Активные XSS\.** Для выполнения внедрённого вредоносного скрипта от пользователя не требуется никаких действий, кроме открытия страницы\.
* **Пассивные XSS\.** Для выполнения внедрённого вредоносного скрипта, кроме открытия страницы в браузере, от пользователя требуются дополнительные действия, например наведение мышки на элемент HTML\-страницы или клик по нему\.

## Пример XSS уязвимости

```cpp
protected void Page_Load(object sender, EventArgs e)
{
  Response.Cookies.Add(new HttpCookie("User_Cookie_Key", 
                                      "User_Cookie_Value"));

  const string CenterAlignFormat = "<p style='text-align: center'>{0}</p>";

  var userName = Request.Params["userName"];                          // <=
  
  string message;
  if (string.IsNullOrWhiteSpace(userName))
  {
    message = string.Format(CenterAlignFormat, 
                            "Empty 'userName' parameter");
  }
  else
  {
    message = string.Format(CenterAlignFormat, 
                            $"'{userName}' data has been processed.");
  }
  
  Response.Write(message);                                            // <=
}
```

**Предупреждение PVS\-Studio**: [V5610](https://pvs-studio.ru/ru/docs/warnings/v5610/) Possible XSS vulnerability\. Potentially tainted data in the 'message' variable might be used to execute a malicious script\. Default\.aspx\.cs 61

Данные из параметра запроса _userName_ напрямую \(без дополнительной обработки\) используются для записи в _Response_:

![XSS_ru/image1.png](https://import.viva64.com/docx/blog/XSS_ru/image1.png)

Благодаря этому злоумышленник может подсунуть пользователю ссылку с вредоносным кодом, который, например, украдёт cookie_ _из браузера пользователя:

![XSS_ru/image3.png](https://import.viva64.com/docx/blog/XSS_ru/image3.png)

В примере выше cookie просто выводятся на экран в качестве демонстрации при помощи выражения _alert\(document\.cookie\)_\. Однако ничего не мешает злоумышленнику отправить их на свой сервер\. Воспользовавшись украденными cookie, злоумышленник может получить доступ к аккаунту пользователя, что позволит ему, например, украсть конфиденциальные данные или совершить вредоносные действия от имени пользователя\.

Для исправления подобной XSS уязвимости нужно всего лишь кодировать HTML\-сущности в сообщении перед записью в _Response _при помощи специального метода:

```cpp
protected void Page_Load(object sender, EventArgs e)
{
  ....
  else
  {
    var encodedUserName = 
      System.Net.WebUtility.HtmlEncode(userName);
    message = string.Format(CenterAlignFormat,
                            $"'{encodedUserName}' data has been processed.");
  }
  Response.Write(encodedUserName);
}
```

В результате при открытии ссылки с вредоносным скриптом последний просто отобразится на странице, но не будет выполнен:

![XSS_ru/image4.png](https://import.viva64.com/docx/blog/XSS_ru/image4.png)

## Дополнительные ссылки

1. [OWASP Top Ten 2017\. A7:2017\-Cross\-Site Scripting \(XSS\)](https://owasp.org/www-project-top-ten/2017/A7_2017-Cross-Site_Scripting_(XSS))
1. [Классификация предупреждений PVS\-Studio согласно OWASP Top 10 Web Application Security Risks](https://pvs-studio.ru/ru/pvs-studio/sast/owasptopten/)
1. [V5610\. Possible XSS vulnerability\. Potentially tainted data might be used to execute a malicious script](https://pvs-studio.ru/ru/docs/warnings/v5610/)
1. [OWASP, уязвимости и taint анализ в PVS\-Studio C\#\. Смешать, но не взбалтывать](https://pvs-studio.ru/ru/blog/posts/csharp/0831/)