Редактор сказал: «Как инженер JS, я думаю, что наиболее распространенной уязвимостью является уязвимость XSS, но не все студенты имеют четкое представление о ней. Сегодня мы пригласили @Lu Shijie поделиться с нами атакой уязвимости XSS в его глазах, надеясь помочь всем.
Что такое XSS-атака
XSS (Cross-Site Scripting) также известен как межсайтовый скриптинг, В центре внимания XSS не межсайтовый, а выполнение скриптов. XSS — это уязвимость компьютерной безопасности, которая часто возникает в веб-приложениях из-за недостаточной фильтрации пользовательского ввода веб-приложениями.
Существует три распространенных атаки XSS: тип отражения, тип на основе DOM и тип хранилища. Среди них тип отражения и тип на основе DOM можно классифицировать как непостоянные атаки XSS, а тип хранилища можно классифицировать как постоянные атаки XSS.
1. Светоотражающий
Отраженный XSS, как правило, представляет собой атаку с помощью определенного метода (например, электронной почты), чтобы побудить пользователей посетить URL-адрес, содержащий вредоносный код.Когда жертва нажимает на эти специально разработанные ссылки, вредоносный код будет непосредственно на хосте жертвы. Браузер выполняет.
Это одноразовая вещь для посетителя, что выражается в том, что мы передаем наш вредоносный скрипт на сервер через URL, а сервер просто «отражает» скрипт обратно в браузер посетителя без обработки и делает доступ Браузер пользователя выполняет соответствующий скрипт. Запуск рефлексивного XSS предполагает участие серверной части. Чтобы избежать рефлексивного XSS, требуется координация серверной части. Когда серверная часть анализирует внешние данные, она сначала выполняет обнаружение и экранирование связанных строк. обработка.
Этот тип XSS обычно появляется в строке поиска веб-сайта, порте входа пользователя и т. д. и часто используется для кражи файлов cookie клиента или проведения фишингового обмана.
Весь процесс атаки примерно таков:
2.DOM на основе
Скрипты на стороне клиента могут динамически проверять и изменять содержимое страницы, не полагаясь на данные на стороне сервера. Например, если клиент извлекает данные из URL-адреса и выполняет их локально, если данные, введенные пользователем на клиенте, содержат вредоносные сценарии JavaScript, которые должным образом не фильтруются и не очищаются, то приложение может быть уязвимо для атаки XSS на основе DOM. . Следующие источники пользовательского ввода требуют особого вниманияdocument.URL
,location.hash
,location.search
,document.referrer
Ждать.
Весь процесс атаки примерно таков:
3. Тип хранилища
Злоумышленник заранее загружает или сохраняет вредоносный код на уязвимый сервер, и вредоносный код будет выполняться до тех пор, пока жертва просматривает страницу, содержащую вредоносный код. Это означает, что пока посетители, посещающие эту страницу, могут запускать этот вредоносный скрипт, вред от сохраненного XSS будет еще больше.
Сохраненный XSS обычно появляется при взаимодействии с сообщениями веб-сайта, комментариями, журналами блогов и т. д., а вредоносные скрипты хранятся в базе данных клиента или сервера.
Весь процесс атаки примерно таков:
Опасности XSS-атак
XSS может вызвать:
- Перехват доступа к атаке;
- Кража файлов cookie для входа в систему без пароля;
- Сотрудничайте с атакой csrf для выполнения вредоносных запросов;
- Используйте js или css, чтобы разрушить обычную структуру и стиль страницы;
способ защиты
1. Кодировка HTML для защиты от XSS
Область применения: кодирование HTML при помещении ненадежных данных в теги HTML (такие как div, span и т. д.).
Правила кодирования: Escape & " ' / как символы сущности (или десятичные, шестнадцатеричные).
Образец кода:
function encodeForHTML(str, kwargs){
return ('' + str)
.replace(/&/g, '&')
.replace(/</g, '<') // DEC=> < HEX=> < Entity=> <
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''') // ' 不推荐,因为它不在HTML规范中
.replace(/\//g, '/');
};
HTML имеет три представления кодировки: десятичное, шестнадцатеричное и именованные сущности. Например, знак «меньше» (
2. Кодирование атрибутов HTML для защиты от XSS
Область применения: при помещении ненадежных данных в атрибуты HTML (за исключением атрибутов src, href, style и обработки событий) выполните кодирование атрибутов HTML.
Правила кодирования: за исключением буквенно-цифровых символов, используйте формат HH; (или доступный именованный объект), чтобы экранировать все символы, значение ASCII которых меньше 256
Образец кода:
function encodeForHTMLAttibute(str, kwargs){
let encoded = '';
for(let i = 0; i < str.length; i++) {
let ch = hex = str[i];
if (!/[A-Za-z0-9]/.test(str[i]) && str.charCodeAt(i) < 256) {
hex = '&#x' + ch.charCodeAt(0).toString(16) + ';';
}
encoded += hex;
}
return encoded;
};
3. Кодирование JavaScript для защиты от XSS
Область применения: кодирование JavaScript при помещении ненадежных данных в свойства обработки событий, значения JavaScirpt.
Правила кодирования: за исключением буквенно-цифровых символов, используйте формат \xHH для экранирования всех символов, код ASCII которых меньше 256.
Образец кода:
function encodeForJavascript(str, kwargs) {
let encoded = '';
for(let i = 0; i < str.length; i++) {
let cc = hex = str[i];
if (!/[A-Za-z0-9]/.test(str[i]) && str.charCodeAt(i) < 256) {
hex = '\\x' + cc.charCodeAt().toString(16);
}
encoded += hex;
}
return encoded;
};
4. Кодирование URL для защиты от XSS
Область действия: при использовании ненадежных данных в качестве значения параметра URL-адреса этот параметр должен быть закодирован в URL-адресе.
Правила кодирования: кодировать значение параметра с помощью encodeURIComponent.
Образец кода:
function encodeForURL(str, kwargs){
return encodeURIComponent(str);
};
5. Кодирование CSS для защиты от XSS
Область применения: кодирование CSS при использовании ненадежных данных в качестве CSS.
Правила кодирования: используйте формат \XXXXXX, чтобы экранировать все символы со значением ASCII меньше 256, кроме буквенно-цифровых символов.
Образец кода:
function encodeForCSS (attr, str, kwargs){
let encoded = '';
for (let i = 0; i < str.length; i++) {
let ch = str.charAt(i);
if (!ch.match(/[a-zA-Z0-9]/) {
let hex = str.charCodeAt(i).toString(16);
let pad = '000000'.substr((hex.length));
encoded += '\\' + pad + hex;
} else {
encoded += ch;
}
}
return encoded;
};
постскриптум
Пользовательский ввод не является доверенным в любое время. Для параметров HTTP они должны быть проверены теоретически, например, если поле является типом перечисления, оно не должно иметь значение, которое думает перечисление, вывод недоверенных данных должен быть закодирован соответствующим образом;httpOnly
,CSP
,X-XSS-Protection
,Secure Cookie
и т. д. также может играть эффективную защиту.
Уязвимости XSS иногда трудно найти.К счастью, такие фреймворки, как React и Vue, представили механизмы защиты от XSS на уровне фреймворка, что в определенной степени освобождает наши руки. Тем не менее, как разработчик, вам все равно необходимо понимать базовые знания XSS и избегать создания XSS-уязвимостей в деталях. Фреймворки являются вспомогательными, нам по-прежнему необходимо ориентироваться на людей, стандартизировать привычки разработки и повышать осведомленность о безопасности веб-интерфейса.