Подтвердить что ты не робот

Может ли HTML <script> фрагмент URL-адреса использоваться для XSS в чисто клиентском приложении?

Фон

Скажем, у меня есть следующая веб-страница:

<html>
  <script>
    document.write('querystring=' + location.search.substr(1));
  </script>
<html>

Я открываю его по URL-адресу, подобному этому:

http://completely-secure-site/?<script>alert('fsecurity')</script>

Во всех браузерах (Chrome 57, Firefox 52 и Safari 10) результат:

= QueryString% 3Cscript% 3Ealert (% 27fsecurity% 27)% 3C/ script% 3E

Поскольку угловые скобки <> являются не действительными символами URL-адреса, они, похоже, автоматически кодируются браузером по пути, прежде чем они смогут добраться где-нибудь рядом с JS во время выполнения.

Мое предположение

Это заставляет меня думать, что просто рендеринг querystring непосредственно на клиенте с помощью document.write всегда безопасен, а не возможный вектор XSS. (Я понимаю, что есть много других способов, в которых приложение может быть уязвимым, конечно, но пусть придерживается точного случая, описанного здесь.)

Мой вопрос

Правильно ли я в этом предположении?

  • Является ли входящее кодирование небезопасных символов в URL, стандартизованном/утвержденным во всех разумных браузерах? (Невозможно XSS)
  • Или это просто тонкая/реалистичная деталь некоторых (современных?) клиентов, на которых я не должен полагаться в глобальном масштабе? (Описанное выше XSS теоретически возможно)

Не относится к вопросу, но интересен в сторону. Если я сначала декодирую URI, тогда поведение браузера отличается: document.write(decodeURI(location.search.substr(1)));. XSS Auditor в Chrome и Safari блокирует страницу, а Firefox показывает предупреждение.

4b9b3361

Ответ 1

Если я использую Query String ?<script>alert("d")</script> в IE6 в Windows XP, я получаю, что введенный код показывает предупреждение, это также происходит с использованием decodeURI или decodeURIComponent на странице, поэтому я бы сказал, что ваше второе предположение верно, если IE6 по-прежнему является разумным браузером: это особенность современных браузеров

Я также вижу, что Firefox 53 показывает введенное предупреждение XSS при использовании методов декодирования. Блокирует код Opera 44 и Chrome 57 (все на окнах).

Ответ 2

Согласно RFC 3986, раздел 2.4 входящее кодирование небезопасных символов стандартизировано. Хотя я рекомендую не полагаться на это по двум причинам:

  • Не все браузеры реализуют его
  • В дикой природе так много браузеров, которые могут сделать это по-другому случайно или намеренно.