Межсайтовый скриптинг (XSS)
- Классификация XSS по вектору атаки
- Классификация XSS по способу воздействия
- Пример XSS уязвимости
- Дополнительные ссылки
XSS (межсайтовый скриптинг) – это один из видов атаки на веб-приложения: в выдаваемую страницу внедряется вредоносный код, который взаимодействует с веб-сервером злоумышленника. Вредоносный код может быть внедрен в страницу как через уязвимость в веб-сервере, так и через уязвимость на компьютере пользователя. При открытии страницы в браузере пользователя внедрённый код выполнится и, например, может похитить конфиденциальные данные пользователя, хранящиеся в браузере или на странице.
XSS подразделяются на несколько подвидов по вектору атаки и способу воздействия.
Классификация XSS по вектору атаки
- Отраженные XSS (непостоянные). При данном типе атаки вредоносный скрипт попадает на страницу (чаще всего в параметрах HTTP-запроса или через HTML-формы) и выполняется при открытии страницы из-за отсутствия надлежащей обработки.
- Хранимые XSS (постоянные). Данный вид XSS является более опасным, чем отражённый. При данном типе XSS злоумышленник внедряет вредоносный код на сервер. Чаще всего данные с вредоносным кодом сохраняются в базу данных и используются на странице. В результате каждый раз при отображении страницы в браузере выполняется внедрённый код.
- XSS в DOM-модели. В данном типе вредоносный код внедряется при выполнении JavaScript скрипта в браузере пользователя и изменяет DOM атакуемого сайта, благодаря чему внедренный код выполняется в контексте сайта.
Классификация XSS по способу воздействия
- Активные XSS. Для выполнения внедрённого вредоносного скрипта от пользователя не требуется никаких действий, кроме открытия страницы.
- Пассивные XSS. Для выполнения внедрённого вредоносного скрипта, кроме открытия страницы в браузере, от пользователя требуются дополнительные действия, например наведение мышки на элемент HTML-страницы или клик по нему.
Пример XSS уязвимости
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 Possible XSS vulnerability. Potentially tainted data in the 'message' variable might be used to execute a malicious script. Default.aspx.cs 61
Данные из параметра запроса userName напрямую (без дополнительной обработки) используются для записи в Response:

Благодаря этому злоумышленник может подсунуть пользователю ссылку с вредоносным кодом, который, например, украдёт cookie из браузера пользователя:
В примере выше cookie просто выводятся на экран в качестве демонстрации при помощи выражения alert(document.cookie). Однако ничего не мешает злоумышленнику отправить их на свой сервер. Воспользовавшись украденными cookie, злоумышленник может получить доступ к аккаунту пользователя, что позволит ему, например, украсть конфиденциальные данные или совершить вредоносные действия от имени пользователя.
Для исправления подобной XSS уязвимости нужно всего лишь кодировать HTML-сущности в сообщении перед записью в Response при помощи специального метода:
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);
}
В результате при открытии ссылки с вредоносным скриптом последний просто отобразится на странице, но не будет выполнен:

Дополнительные ссылки
- OWASP Top Ten 2017. A7:2017-Cross-Site Scripting (XSS)
- Классификация предупреждений PVS-Studio согласно OWASP Top 10 Web Application Security Risks
- V5610. Possible XSS vulnerability. Potentially tainted data might be used to execute a malicious script
- OWASP, уязвимости и taint анализ в PVS-Studio C#. Смешать, но не взбалтывать
0