Какая точка с запятой зарезервирована в URL? - PullRequest
30 голосов
/ 29 января 2010

URI RFC 3986: универсальный синтаксис спецификация перечисляет точку с запятой в качестве зарезервированного (под-разделительного) символа:

reserved    = gen-delims / sub-delims

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

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

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

Ответы [ 6 ]

35 голосов
/ 29 января 2010

В конце раздела 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.

7 голосов
/ 29 января 2010

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

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

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

Я полагаю, что он берет свое начало в FTP URI s.

5 голосов
/ 29 января 2010

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

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

4 голосов
/ 04 июля 2013

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

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

2 голосов
/ 21 октября 2014

С 2014 года известно, что сегменты пути способствуют атакам загрузки отраженных файлов . Давайте предположим, что у нас есть уязвимый 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 (в этом случае они должны просто разрешать буквенно-цифровые символы); побега не достаточно
  • добавить Content-Disposition: attachment; filename="whatever.txt" в API, которые не будут отображаться; Google пропустил часть filename, что фактически облегчило атаку
  • добавить X-Content-Type-Options: nosniff заголовок к ответам API
0 голосов
/ 17 февраля 2017

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

Это последний символ сущности 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

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

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

...