Может ли 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 показывает предупреждение.
Ответы
Ответ 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 входящее кодирование небезопасных символов стандартизировано. Хотя я рекомендую не полагаться на это по двум причинам:
- Не все браузеры реализуют его
- В дикой природе так много браузеров, которые могут сделать это по-другому случайно или намеренно.