Может ли ссылка, указывающая на URL, начинающийся с javascript: //, выполнить какой-либо код? - PullRequest
0 голосов
/ 17 октября 2018

Я обнаружил уязвимость в программном обеспечении, которое поддерживаю, когда пользователи могут помещать javascript: и data: ссылки в контент, который будет виден другим.

Однако естьэто механизм, который добавит http:// к любой ссылке href, которая не начинается с [a-z0-9]+://, что в основном позволяет добавлять только вредоносные ссылки hrefs, которые начинаются с javascript:// или data://.Я хотел бы выяснить, насколько серьезной является проблема безопасности, поэтому мой вопрос, есть ли способ использовать такие ссылки для выполнения кода JavaScript при их нажатии?

Насколько я понимаю, это ссылка javascript://может содержать только однострочный комментарий JavaScript, поэтому код не может быть выполнен.Я предполагаю, что однострочный комментарий может заканчиваться только новой строкой (\n), но я не уверен, есть ли способ ввести такую ​​новую строку в ссылку href.Я пробовал разные методы, такие как href="javascript:// alert('test')", href="javascript://
alert('test')", href="javascript://%0aalert('test')" и один с символом \0, но ни один из них, похоже, не выполнял никакого кода.

Для data: URI, я думаю, этоневозможно создать какой-либо действительный, который начинается с data://, но, может быть, есть еще какой-нибудь браузер, где это можно было бы как-то использовать?

1 Ответ

0 голосов
/ 17 октября 2018

У меня возникло несколько возможных проблем, потому что это было довольно забавно.Даже если ничего из этого не сработает, я думаю, вы можете легко сделать это более безопасным, и это будет стоить спокойствия.В любом случае, вот некоторые полезные данные, которые я придумал.

новая строка

Вы сказали, что это не работает для вас, но работает для меня в Chrome (Windows 10/69.0.3497.100).Это самая очевидная работа вокруг, а также единственная работа, которую я мог придумать.Возможно, у вас была опечатка, когда вы пытались?Хотя HTML-кодирование сущностей этого не сделает, простое URL-кодирование должно ... Если ваш источник выглядит так, он должен работать:

<a href="javascript://%0aalert(document.location)">xss test</a> (jsfiddle PoC)

неполное регулярное выражение

Вы сказали, что оно должно "начинаться с [a-z0-9]+://, но это регулярное выражение не охватывает часть" начало ", поэтому что-то подобное может совпадать:

javascript:alert(1);//abc://foo.bar

Возможно, у вас есть что-то вроде ^[a-z0-9]:\/\/ или вы используете язык, который заключает в себе термин "launchWith ()" или что-то подобное. Просто стоит упомянуть.

вложенные протоколы

Я не думаю, что здесь много, но это стоит посмотреть. И это вектор атаки, который вы, возможно, не учли.

view-source://data:text/html,<script>alert(1);</script>

С одной стороны, это не должновыполнить что-либо, так как это view-source. Для двоих это должно выдать ошибку CORS (я думаю). И, наконец, даже если он все-таки выполнится, он будет выполняться в другом контексте, чем ваша страница (они могут просто ссылаться на вредоносное ПО).сайт, если это было их целью). Так что все вокруг вроде слабое.Однако, возможно, существуют и другие вложенные протоколы, которые могут быть проблематичными.

запрос на подделку

Не совсем XSS, но все еще потенциальная проблема.Злоумышленник может ссылаться на существующую страницу на вашем сайте, например https://example.com/account/delete.Если они могут контролировать отображаемое имя ссылки, это может сделать ее довольно убедительной.Даже если они не контролируют отображаемое имя, вы можете создать довольно запутанный Uris, маскирующий, куда он на самом деле идет (различные методы кодирования).У вас может не быть таких URL на вашем сайте (хорошая работа!), Но это часто случается.

фишинговые / вредоносные ссылки

Это может быть очевидно, но важно знать, что пользователь может сделать ссылку на сайт, который копирует внешний вид вашего сайта (или другого сайта),Это просто общая проблема, связанная с разрешением произвольных гиперссылок.Если ваша база пользователей особенно уязвима для этого, многие сайты перенаправляют внешние ссылки на страницу с предупреждением (это можно сделать так же просто, как маленький js, например: onclick="return confirm('you sure you want to do that?')". Хотя я не знаю, насколько эффективны эти вещи на самом деле -это просто то, что вы видите.

заключение

Вероятно, мы могли бы сгладить миллионы вещей, которые могут вызвать или не вызвать проблемы с безопасностью. В конце концов, возможно, стоит ввести белый список того, чтопротоколы, которые вы хотите разрешить. Хотите ли вы, чтобы люди могли включать ссылки, такие как mailto:, ssh:, slack:, file: и т. д. Я хотел бы сделать регулярное выражение на стороне клиента для начала с http (s)и затем в бэкэнде используйте анализатор URI, чтобы подтвердить, что схема действительно является http (s), и, если нет, вывести предупреждение. Это скорее аспект взаимодействия с пользователем, но если вы беспокоитесь, большинство пользователей будут печатать что-то вроде "www.example.com ", вы можете просто дать им предупреждение на стороне клиента, что оно должно начинаться с http (s) (или просто иметь его там по умолчанию).Возможно, стоит рассмотреть возможность использования API проверки репутации и представления результатов рядом с URL-адресом, отвергая любые домены с плохой репутацией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...