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