Какова точка с запятой, зарезервированная для URL-адресов?

Спецификация RFC 3986 URI: Generic Syntax содержит точку с запятой в качестве зарезервированной (под-delim ):

reserved    = gen-delims / sub-delims

gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"

sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="

Какова зарезервированная цель ";" точки с запятой в URI? В этом отношении, какова цель других суб-delims (я знаю только цели для "&", "+" и "=" )?

+25
источник поделиться
6 ответов

В конце раздела 3.3 есть объяснение.

Помимо точечных сегментов в иерархических путей, сегмент пути считается непрозрачным по родовым синтаксис. Создание URI приложений часто используют зарезервированные символы разрешено в сегменте делимитировать схема или разыменовать-обработчик конкретных Подкомпоненты. Например, точка с запятой ( ";" ) и равна ( "=" ) зарезервированные символы часто используются для разграничения параметров и параметров значения, применимые к этому сегменту. Зарезервированный символ запятой ( "," ) часто используется для аналогичных целей. Например, один производитель URI может используйте сегмент, такой как "name; v = 1.1", указать ссылку на версию 1.1 "имя", тогда как другое может используйте сегмент, такой как "имя, 1.1", указывают на то же самое. Типы параметров могут быть определены по схеме семантики, но в большинстве случаев синтаксис параметра специфичен для реализация URI алгоритм разыменования.

Иными словами, он зарезервирован для того, чтобы люди, которые хотят иметь ограниченный список чего-либо в URL-адресе, могут безопасно использовать ; в качестве разделителя, даже если части содержат ;, если содержимое имеет процентное кодирование, Другими словами, вы можете сделать это:

foo;bar;baz%3bqux

и интерпретировать его как три части: foo, bar, baz;qux. Если полуколония не была зарезервированным символом, значения ; и %3b были бы эквивалентны, поэтому URI был бы неправильно интерпретирован как четыре части: foo, bar, baz, qux.

+33
источник

Намерение понятнее, если вы вернетесь к более старым версиям спецификации:

  path_segments = segment *( "/" segment )
  segment       = *pchar *( ";" param ) 

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

Я полагаю, что он имеет свое происхождение в FTP URI.

+7
источник

Раздел 3.3 описывает это - это непрозрачный разделитель, который может использовать приложение URI, если оно удобно:

Помимо точечных сегментов в иерархических путей, сегмент пути считается непрозрачным по родовым синтаксис. Создание URI приложений часто используют зарезервированные символы разрешено в сегменте делимитировать схема или разыменовать-обработчик конкретных Подкомпоненты. Например, точка с запятой ( ";" ) и равна ( "=" ) зарезервированные символы часто используются для разделительные параметры и параметр значения, применимые к этому сегменту. запятая ( "," ) зарезервированный символ часто используется для аналогичных целей. Для Например, один производитель URI может использовать сегмент, такой как "name; v = 1.1" to укажите ссылку на версию 1.1 "имя", тогда как другое может использовать сегмент, такой как "имя, 1.1", чтобы указать тоже самое. Типы параметров могут быть определяемый с помощью специфичной для схемы семантики, но в большинстве случаев синтаксис параметр определен для внедрение URI алгоритм разыменования.

+4
источник

Есть несколько конвенций вокруг его текущего использования, которые интересны. Они говорят, когда использовать точку с запятой или запятую. Из книги "RESTful Web Services":

Используйте знаки пунктуации для разделения нескольких фрагментов данных на одном уровне иерархии. Используйте запятые, когда порядок элементов имеет значение,... Используйте точки с запятой, когда порядок не имеет значения.

+4
источник

С 2014 года сегменты пути, как известно, способствуют Reflected File Download атак. Предположим, что у нас есть уязвимый API, который отражает все, что мы ему отправляем (теперь URL-адрес был реальным, теперь исправлено):

https://google.com/s?q=rfd%22||calc||

{"results":["q", "rfd\"||calc||","I love rfd"]}

Теперь это безобидно в браузере, так как он JSON, поэтому он не будет отображаться, но браузер скорее предложит загрузить ответ в виде файла. Теперь здесь задействованы сегменты пути (для атакующего):

https://google.com/s;/setup.bat;?q=rfd%22||calc||

Все между точками с запятой (;/setup.bat;) будет не отправлено в веб-службу, но вместо этого браузер будет интерпретировать его как имя файла... для сохранения ответа API. Теперь будет загружен и запущен файл под названием setup.bat, не спрашивая об опасностях запуска файлов, загруженных из Интернета (поскольку в нем содержится слово "setup"). Содержимое будет интерпретироваться как пакетный файл Windows, и будет запущена команда calc.exe.

Профилактика:

  • дезинфицировать ваш ввод API (в этом случае они должны просто разрешить буквенно-цифровые символы); escaping недостаточно [/li >
  • добавить Content-Disposition: attachment; filename="whatever.txt" в API, которые не будут отображаться; Google не хватает части filename, которая фактически упростила атаку
  • добавить X-Content-Type-Options: nosniff заголовок для ответов API
0
источник

Я нашел следующие варианты использования:

Его окончательный символ объекта HTML:
https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references

Чтобы использовать одну из этих ссылок на символьные сущности в HTML или XML документ, введите амперсанд, за которым следует имя объекта и точка с запятой, например, и для амперсанда ( "&" ).

Apache Tomcat 7 (или более новые версии?!) нас это как path parameter:
https://superevr.com/blog/2011/three-semicolon-vulnerabilities

Apache Tomcat - один из примеров веб-сервера, который поддерживает "Путь Параметры". Параметр пути является дополнительным содержимым после имени файла, разделенных точкой с запятой. Любое произвольное содержимое после точки с запятой не влияет на целевую страницу веб-браузера. Это значит, что http://example.com/index.jsp;derp все равно вернет index.jsp, а не некоторая страница ошибки.

Схема URI разделяет им MIME и данные:
https://en.wikipedia.org/wiki/Data_URI_scheme

Он может содержать необязательный параметр набора символов, отделенный от предшествующей части точкой с запятой (;).

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA
AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO
9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" />

И была ошибка в IIS5 и IIS6, чтобы обойти ограничения загрузки файлов:
https://www.owasp.org/index.php/Unrestricted_File_Upload

Расширения файлов Blacklisting Эта защита может быть обойдена:... путем добавления символа с запятой после запрещенного расширения и до разрешенного (например, "file.asp;.jpg" )

Вывод:
Не используйте точки с запятой в URL-адресах или они могут случайно создать объект HTML или схему URI.

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос