Quel est le point-virgule réservé aux URLs?
RFC 3986 URI: syntaxe générique spec Liste un point-virgule comme un caractère réservé (sub-delim):
reserved = gen-delims / sub-delims
gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
/ "*" / "+" / "," / ";" / "="
Quel est le but réservé du"; " du point-virgule dans URIs? D'ailleurs, quel est le but des autres sous-limites (Je ne connais que les buts pour"&","+", et "=")?
6 réponses
Il y a une explication à la fin de la section 3.3.
à L'exception des segments de points dans les chemins hiérarchiques, un segment de chemin est considéré comme opaque par le générique syntaxe. Applications de production D'URI souvent utiliser les caractères réservés autorisé dans un segment à délimiter régime spécifique ou déréférencement de gestionnaire spécifique les sous-composants. Par exemple, l' point-virgule ( " ;") et égal (" =") les caractères réservés sont souvent utilisés pour délimiter les paramètres et paramètre les valeurs applicables à ce segment. Le caractère réservé de la virgule (",") est souvent utilisés à des fins similaires. Par exemple, un producteur D'URI pourrait utilisez un segment tel que " nom; v=1.1" pour indiquer une référence à la version 1.1 de "nom", tandis qu'un autre peut utilisez un segment tel que "nom, 1.1" Pour indiquer le même. Les types de paramètre peut être défini par régime spécifique sémantique, mais dans la plupart des cas la la syntaxe de paramètre est spécifique à la mise en œuvre de l'URI de l' algorithme de déréférencement.
en d'autres termes, il est réservé pour que les personnes qui veulent une liste délimitée de quelque chose dans L'URL puissent utiliser ;
comme délimiteur même si les parties contiennent ;
, tant que le contenu est pour cent codé. En d'autres termes, vous pouvez faire ceci:
foo;bar;baz%3bqux
et l'interpréter en trois parties: foo
,bar
,baz;qux
. Si le point-virgule n'ont pas un caractère réservé, le ;
et %3b
serait équivalent ainsi, L'URI serait incorrectement interprété comme quatre parties: foo
,bar
,baz
,qux
.
l'intention est plus claire si vous retournez à versions plus anciennes du cahier des charges:
path_segments = segment *( "/" segment )
segment = *pchar *( ";" param )
chaque segment de chemin peut inclure séquence de paramètres, indiquée par le caractère ";" du point-virgule.
je crois qu'il a ses origines dans FTP URI S.
la Section 3.3 couvre ce - c'est un délimiteur opaque qu'une application produisant de L'URI peut utiliser si c'est pratique:
à L'exception des segments de points dans les chemins hiérarchiques, un segment de chemin est considéré comme opaque par le générique syntaxe. Applications de production D'URI souvent utiliser les caractères réservés autorisé dans un segment à délimiter régime spécifique ou déréférencement de gestionnaire spécifique les sous-composants. Par exemple, l' point-virgule ( " ;") et égal (" =") réservé les personnages sont souvent utilisés pour délimiter les paramètres et les valeurs applicables à ce segment. Le virgule ( " ,") caractère réservé est souvent utilisés à des fins similaires. Pour par exemple, un producteur D'URI pourrait utiliser un segment, comme "nom"; v=1.1" indiquer une référence à la version 1.1 de "nom", alors qu'un autre pourrait utiliser un segment tel que "nom, 1.1" pour indiquer la même. Types de paramètres peuvent être défini par la sémantique propre au régime, mais dans la plupart des cas, la syntaxe d'un paramètre est spécifique à l' mise en œuvre des URI algorithme de déréférencement.
il y a certaines conventions Autour de son utilisation actuelle qui sont intéressantes. Ils parlent de quand utiliser un point-virgule ou une virgule. Du livre "RESTful Web Services":
utilisez des caractères de ponctuation pour séparer plusieurs éléments de données au même niveau de hiérarchie. Utilisez des virgules lorsque l'ordre des éléments compte, ... Utilisez un point-virgule Lorsque l'ordre n'a pas d'importance.
depuis 2014 les segments path sont connus pour contribuer à Traduit de Téléchargement de Fichier attaques. Supposons que nous ayons une API vulnérable qui reflète tout ce que nous lui envoyons (L'URL était réelle apparemment, maintenant corrigée):
https://google.com/s?q=rfd%22||calc||
{"results":["q", "rfd\"||calc||","I love rfd"]}
maintenant, c'est inoffensif dans un navigateur car C'est JSON donc ça ne va pas être rendu mais le navigateur va plutôt proposer de télécharger la réponse sous forme de fichier. Voici maintenant les segments de chemin qui viennent en aide (pour le attaquant):
https://google.com/s;/setup.bat;?q=rfd%22||calc||
tout entre les points-virgule (;/setup.bat;
) sera envoyé au service web, mais à la place le navigateur l'interprétera comme le nom du fichier... pour sauvegarder la réponse de L'API. Maintenant, un fichier appelé setup.bat
sera téléchargé et exécuté sans poser de questions sur les dangers d'exécuter des fichiers téléchargés à partir D'Internet (parce qu'il contient le mot "setup"
dans son nom). Le contenu sera interprétée comme un fichier de commandes Windows, et le calc.exe
commande sera exécuter.
Prévention:
- assainir les entrées de votre API( dans ce cas, ils devraient juste autoriser les alphanumériques); échapper n'est pas suffisant
- ajouter
Content-Disposition: attachment; filename="whatever.txt"
sur les API qui ne seront pas rendues; Google manquait lefilename
la partie qui fait effectivement l'attaque plus facile - ajouter
X-Content-Type-Options: nosniff
en-tête de l'API réponses
j'ai trouvé la suite de cas d'utilisation:
C'est le caractère final D'un HTML entity:
https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references
pour utiliser une de ces références d'entité de caractères dans un HTML ou XML document, entrer une esperluette suivie du nom de l'entité et d'un point-virgule, par exemple, et pour l'esperluette ("&").
Apache Tomcat 7 (ou des versions plus récentes?!) nous comme path parameter
:
https://superevr.com/blog/2011/three-semicolon-vulnerabilities
https://en.wikipedia.org/wiki/Data_URI_schemeApache Tomcat est un exemple de serveur web qui supporte "Path" Paramètre." Un paramètre de chemin est un contenu supplémentaire après un nom de fichier, séparés par un point-virgule. Tout contenu arbitraire après un point-virgule pas d'incidence sur la page d'accueil d'un navigateur web. Cela signifie que http://example.com/index.jsp;derp va encore indice de rendement.jsp, et pas certains page d'erreur.
il peut contenir un paramètre optionnel de jeu de caractères, séparé du partie précédente par un point-virgule (;) .
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO 9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" />
et il y avait un bug dans IIS5 et IIS6 pour contourner le téléchargement de fichiers restrictions:
https://www.owasp.org/index.php/Unrestricted_File_Upload
Conclusion:
N'utilisez pas de point-virgule dans les URLs ou ils pourraient accidentellement produire une entité HTML ou URI scheme.