Какова точка с запятой, зарезервированная для URL-адресов?
Спецификация RFC 3986 URI: Generic Syntax содержит точку с запятой в качестве зарезервированной (под-delim ):
reserved = gen-delims / sub-delims
gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
/ "*" / "+" / "," / ";" / "="
Какова зарезервированная цель ";" точки с запятой в URI? В этом отношении, какова цель других суб-delims (я знаю только цели для "&", "+" и "=" )?
Ответы
Ответ 1
В конце раздела 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
.
Ответ 2
Намерение понятнее, если вы вернетесь к более старым версиям спецификации:
path_segments = segment *( "/" segment )
segment = *pchar *( ";" param )
Каждый сегмент пути может включать последовательность параметров, обозначенных точкой с запятой ";" характер.
Я полагаю, что он имеет свое происхождение в FTP URI.
Ответ 3
Раздел 3.3 описывает это - это непрозрачный разделитель, который может использовать приложение URI, если оно удобно:
Помимо точечных сегментов в иерархических путей, сегмент пути считается непрозрачным по родовым синтаксис. Создание URI приложений часто используют зарезервированные символы разрешено в сегменте делимитировать схема или разыменовать-обработчик конкретных Подкомпоненты. Например, точка с запятой ( ";" ) и равна ( "=" ) зарезервированные символы часто используются для разделительные параметры и параметр значения, применимые к этому сегменту. запятая ( "," ) зарезервированный символ часто используется для аналогичных целей. Для Например, один производитель URI может использовать сегмент, такой как "name; v = 1.1" to укажите ссылку на версию 1.1 "имя", тогда как другое может использовать сегмент, такой как "имя, 1.1", чтобы указать тоже самое. Типы параметров могут быть определяемый с помощью специфичной для схемы семантики, но в большинстве случаев синтаксис параметр определен для внедрение URI алгоритм разыменования.
Ответ 4
Есть несколько конвенций вокруг его текущего использования, которые интересны. Они говорят, когда использовать точку с запятой или запятую. Из книги "RESTful Web Services":
Используйте знаки пунктуации для разделения нескольких фрагментов данных на одном уровне иерархии. Используйте запятые, когда порядок элементов имеет значение,... Используйте точки с запятой, когда порядок не имеет значения.
Ответ 5
С 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
Ответ 6
Я нашел следующие варианты использования:
Его окончательный символ объекта 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.