Question:
Les paramètres URL des requêtes GET et POST sur HTTPS sont-ils sécurisés?
ddyer
2020-06-26 05:10:25 UTC
view on stackexchange narkive permalink

Il est bien connu que les requêtes GET avec des arguments ? xx = yy intégrés peuvent être modifiées en transit, et ne sont donc pas sécurisées.

Si je change la requête en POST, et utilise HTTPS, alors les paramètres sont dans le corps du message, qui est crypté, et donc difficile à pirater, correct?

Deux autres cas me concernent. Supposons que des paramètres de style GET aient été ajoutés à une requête POST - ces paramètres seraient-ils ignorés de manière fiable?

Et une sorte d'attaque de rétrogradation de sécurité? Si le manipulateur d'URL fait échouer les transactions HTTPS, puis le client / serveur rétrograde "utilement" vers HTTP, ce qui permettrait au corps POST non chiffré d'être manipulé.

Les requêtes POST ne sont pas plus sécurisées que les requêtes GET en transit.Pourquoi voudriez-vous que les paramètres de requête soient ignorés?Vous pouvez consulter les spécifications HTTP.
"Il est bien connu" - ** Citation nécessaire! **
La question se pose comme si elle était documentée quelque part.Je recommanderais fortement de mieux comprendre le fonctionnement des méthodes HTTP et ce que TLS fait à la requête HTTP.Peut-être le voir en action en utilisant WireShark.Je dis cela après avoir vu que la réponse d '@ThoriumBR couvre correctement la question (plus de comment obtenir une meilleure compréhension de ce qui se passe).
@multithr3at3d Je suis préoccupé par la modification des paramètres en transit.Si j'utilise POST et SSL, cela devient beaucoup plus difficile à faire, mais si MITM peut ajouter des paramètres? Xx = yy à une URL POST, et qu'ils ne sont pas ignorés, alors le cryptage pourrait être sans objet.
@ddyer En ce qui concerne MitM, il n'y a pas de différence entre le corps POST et les paramètres GET.Les deux sont protégés par HTTPS et non protégés sans.Il y a maintenant 5 réponses expliquant autant, mais vous semblez déterminé à vous disputer.Je me demande honnêtement pourquoi vous avez même posé cette question si vous n'acceptez pas notre réponse?
@ddyer La plupart de vos réponses ici concernent ce qui se passe lorsque vous retombez par erreur vers HTTP à cause de problèmes, réels ou imaginaires, avec la connexion ou le certificat HTTPS.C'est un problème réel ou imaginaire mais ce n'est pas ce que vous avez demandé ici dans votre question.
J'ai un cas réel d'un https GET qui a été piraté en transit.J'essaie simplement de dégager les nuances afin de comprendre quelles contre-mesures sont disponibles et à quel point je peux m'attendre à ce qu'elles soient efficaces.
@ddyer Comme l'a dit Marquis de Lorne, vous semblez très préoccupé par le retour à HTTP.Je vous recommanderais de poser une question spécifiquement sur vos préoccupations afin que nous puissions y répondre directement.Si vous le trouvez utile, j'ai rédigé un brouillon de la question pour vous en fonction de vos commentaires: (https://pastebin.com/WuKuVTRi, expire le 13/07/2020).J'ai une réponse pour vous que je serais heureux de vous fournir dès que la question se posera, et cela n'implique pas de «mieux maintenir vos certificats SSL».
Merci @TheHansinator, c'est fait.
Sept réponses:
ThoriumBR
2020-06-26 06:27:52 UTC
view on stackexchange narkive permalink

TL; DR: HTTPS fournit le chiffrement, et c'est la seule chose qui protège les paramètres.

Il est bien connu que les requêtes GET avec des arguments? xx = yy incorporés peuvent être modifiés en transit, et ne sont donc pas sécurisés.

Si vous n'utilisez pas de cryptage, tout n'est pas sécurisé: HTTP, Telnet, FTP, TFTP, IRC, SNMP, SMTP, IMAP, POP3 , DNS, Gopher ...

Si je change la requête en POST ...

... cela ne change rien du tout.

et utilisez HTTPS ...

HTTPS change tout.

Toute requête HTTP non protégée par TLS n'est pas protégée. Peu importe si vous utilisez GET, POST, PUT, s'il s'agit d'un en-tête personnalisé, rien ne change rien.

Par exemple, il s'agit d'une requête GET:

  GET / test? field1 = value1&field2 = value2 HTTP / 1.1Host: foo.examAccept: text / html  

Et ceci est une requête POST:

  POST / test HTTP / 1.1Host: foo.exampleContent-Type: application / x-www-form-urlencodedContent-Length: 27field1 = value1&field2 = value2  

Quelle est la différence? Sur la requête GET, les paramètres sont sur la première ligne et sur le POST, les paramètres sont sur la dernière ligne. Juste ça. Les raisons techniques derrière GET ou POST ne sont pas le point ici.

Supposons que des paramètres de style GET aient été ajoutés à une requête POST - ces paramètres seraient-ils ignorés de manière fiable?

Cela dépend entièrement de l'application. Sur PHP, par exemple, si l'application attend $ username = $ _POST ['username'] , l'envoyer en tant que paramètre GET ne change rien du tout, car l'application obtiendra le paramètre POST.

Qu'en est-il d'une sorte d'attaque de rétrogradation de sécurité? Si le manipulateur d'URL force l'échec des transactions HTTPS, puis le client / serveur rétrograde "utilement" vers HTTP, ce qui permettrait de manipuler le corps POST non chiffré.

Pas facile pour les serveurs correctement configurés. S'ils utilisent l'en-tête HTTP Strict Transport Security, cela oblige le client à accéder uniquement au site en utilisant HTTPS, même si l'utilisateur force HTTP et le port 80. Le navigateur mettra à jour utilement vers HTTPS, pas l'inverse.

Même sur les serveurs qui n'utilisent pas les en-têtes HSTS, si le premier accès se fait via HTTPS, il n'est pas anodin de revenir à HTTP. L'attaquant doit envoyer un faux certificat et le client doit accepter le faux certificat pour qu'une connexion HTTPS soit redirigée vers HTTP. Mais si l'attaquant réussit, il continuera généralement à utiliser HTTPS car le client a déjà accepté son faux certificat de toute façon.

Les commentaires ne sont pas destinés à une discussion approfondie;cette conversation a été [déplacée vers le chat] (https://chat.stackexchange.com/rooms/110265/discussion-on-answer-by-thoriumbr-are-url-parameters-of-get-and-post-requests-ov).
Ángel
2020-06-27 06:23:53 UTC
view on stackexchange narkive permalink

Non, non, non.

HTTPS protège l'ensemble de la requête HTTP. Le chemin de l'url, les paramètres, les cookies, les en-têtes http, le corps ... La seule chose qu'il ne protège pas (à part les paramètres tcp comme les adresses IP et les ports) est le nom d'hôte auquel vous vous connectez, qui est divulgué via le SNI extension (cela devrait être corrigé par tls-esni, juste un brouillon pour l'instant)

En tant que tel, lors de l'utilisation de HTTPS, l'envoi de paramètres "sensibles" (tels que l'utilisateur et le mot de passe ou compte bancaire à facturer) dans GET n'est pas non sécurisé car un attaquant pourrait le modifier.

(et s'il n'utilise pas HTTPS, c'est une mauvaise idée même avec POST)

Cependant, il n'en reste pas moins problématique.

  • Les paramètres GET font partie de l'url, et apparaissent dans les logs du serveur, l'historique de votre navigateur, l'analyse du site, l'impression de la page, une analyse antivirus de la page ...
  • Les requêtes GET sont définies comme étant idempotentes . Le fait de réessayer une demande GET (même automatiquement) n'aura pas d'effets secondaires. Vous pouvez imaginer ce qui pourrait arriver si la requête signifiait "veuillez transférer ce montant sur le compte ###"
  • D'un autre côté, POST n'a pas ce comportement. Vous aurez sûrement remarqué que votre navigateur vous avertit avant de renvoyer une requête POST, avertissant des actions déclenchées par cela qui pourrait se reproduire.
  • Avoir certains paramètres via GET pourrait aider avec les attaques de fixation de session (comme le chargement d'un url vous connectant avec l'utilisateur et le mot de passe de l'attaquant, avant de facturer "votre" crédit en ligne)
  • En général, il est beaucoup plus facile de faire charger une page avec certains paramètres que via POST (toujours possible en utilisant javascript, cependant, utilisez des jetons anti-XSS).

Supposons que des paramètres de style GET aient été ajoutés à une requête POST - ces paramètres seraient-ils ignorés de manière fiable?

Cela dépend du site Web. Ils peuvent accepter certains paramètres uniquement en tant que GET et d'autres uniquement en tant que POST, mais également certains en tant que GET ou POST. Si le paramètre a avec le même nom est fourni dans les deux sens, ils choisiront probablement le paramètre POST, mais il pourrait être configuré pour utiliser GET, ou erreur également.

Qu'en est-il d'une sorte d'attaque de déclassement de sécurité? Si le manipulateur d'URL force l'échec des transactions HTTPS, puis le client / serveur rétrograde "utilement" vers HTTP, ce qui permettrait de manipuler le corps POST non chiffré.

Un client qui a automatiquement rétrogradé une requête HTTPS vers HTTP (qui, comme vous le constatez, peut facilement être effectuée par un attaquant sur le réseau) est complète et totalement interrompue . Veuillez déposer une CVE pour cela.

Pedro
2020-06-26 19:55:51 UTC
view on stackexchange narkive permalink

Il est bien connu que les requêtes GET avec des arguments? xx = yy incorporés peuvent être modifiées en transit, et ne sont donc pas sécurisées.

Il s'agit généralement d'une référence à des situations où GET les demandes sont enregistrées dans les journaux d'historique, y compris le navigateur local et éventuellement les logiciels d'inspection de contenu ou les proxys. Sinon, il n'y a pas de différence fonctionnelle de sécurité entre l'utilisation des requêtes HTTP GET et POST via TLS.

Deux autres cas me concernent. Supposons que des paramètres de style GET aient été ajoutés à une requête POST - ces paramètres seraient-ils ignorés de manière fiable?

Dépend entièrement du code de votre application.

Qu'en est-il d'une sorte d'attaque de déclassement de sécurité? Si le manipulateur d'URL force l'échec des transactions HTTPS, puis le client / serveur rétrograde "utilement" vers HTTP, ce qui permettrait de manipuler le corps POST non chiffré.

Vous pouvez vous en occuper sous HTTP en utilisant Strict Transport Security (HSTS) éventuellement avec préchargement . Cela demande aux navigateurs de refuser d'accéder à un site donné en HTTP ... dans un certain délai. Et il y a une demande initiale qui, sauf si vous utilisez préchargement , le navigateur doit apprendre que HSTS est activé.

il n'est pas souhaitable que l'ensemble du site devienne sombre si SSL échoue.Le maintien de certificats SSL valides est un tapis roulant en soi.Je suppose que vous ne pouvez pas avoir les deux!
SSL n'est pas si difficile de nos jours.
@ddyer, il suffit d'installer [letsencrypt] (https://letsencrypt.org/) [certbot] (https://certbot.eff.org/instructions) (serveurs physiques ou virtualisés) ou [cert-manager] (https: // cert-manager.io/) (nuages orchestrés) et laissez-le s'occuper des choses.
Il n'y a aucune raison aujourd'hui de ne pas utiliser TLS.Ni les performances ni la disponibilité ne sont des raisons valables.Toutes mes excuses pour être en désaccord direct, mais ce sont des arguments de la vieille école qui ne tiennent pas la route.Les services TLS échouent tout aussi bien que les services en texte brut.
Je m'excuse également @thoriumbr car je viens de réaliser qu'une grande partie de ce que j'ai écrit était sur votre réponse.
L'utilisation de certbot est certainement un bon début, mais le problème devient alors de maintenir certbot en marche.Il existe de nombreux points de défaillance possible, et la plupart d'entre eux ne seront découverts que lorsque votre site devient soudainement inaccessible.Toute cette danse de sécurité est un compromis entre rendre votre site plus sécurisé et le rendre moins fiable et / ou plus coûteux à maintenir.
@ddyer _ "la plupart d'entre eux ne seront découverts que lorsque votre site devient soudainement inaccessible" _ - J'ai créé un outil de surveillance des certificats pour mes certificats dans Kubernetes.S'ils expirent dans les 10 jours, je reçois un e-mail.certbot devrait les renouveler un mois avant l'expiration, IIRC, donc cela me donne une couche supplémentaire de protection en cas de problème.Avec ces deux éléments mis en place, les certificats SSL ne sont généralement pas mon problème maintenant.
mentallurg
2020-06-26 09:28:35 UTC
view on stackexchange narkive permalink

Si vous voyez l'URL dans le navigateur, cela ne signifie pas que l'URL est envoyée sur le réseau sous une telle forme. En cas de HTTPS, un attaquant ne peut voir que l'hôte cible et le port de votre requête. L'attaquant ne peut rien voir de plus comme la méthode, l'URL, les en-têtes, le corps.

Si vous utilisez HTTPS, vos données ne peuvent pas être modifiées sur le chemin vers l'hôte et le port de destination. Cela vaut également pour l'URL: elle n'est visible par personne et ne peut pas être manipulée.

L'URL n'est visible que côté serveur, une fois que le serveur a déchiffré votre requête.

Les transactions HTTP ne se produisent pas seulement dans les navigateurs - les programmes exécutent des requêtes http qui sont invisibles pour l'utilisateur, mais elles peuvent être vues et manipulées en insérant un homme au milieu entre le serveur prévu et le client.
* mais ils peuvent être vus et manipulés en insérant un homme au milieu entre le serveur prévu et le client * - non.Si le client est correctement implémenté, il demande le certificat du serveur, vérifie qu'il est valide.Puis crypte le trafic.MiM n'est pas possible.Bien sûr, vous pouvez manipuler votre réseau, DNS.Ou vous pouvez directement installer le certificat du MiM, si vous voulez les aider à lire votre trafic :) Mais pour les applications qui implémentent correctement TLS / SSL et qui sont correctement configurées (par exemple pas de certificats d'autorités de certification malveillantes dans le trust store) MiMn'est pas possible.
Tout le trafic sur mon ordinateur passe par un portail, le routeur et le modem vers mon FAI.Si je contrôle le portail et que je détecte une requête DNS pour le site X (les requêtes DNS ne sont pas encore cryptées!) Je peux répondre avec mon propre site, qui peut fournir un certificat valide d'une sorte, puis agir comme MITM pour le réelsite.Comment cela est-il évité?
@ddyer Un certificat valide ne peut être créé que par une autorité de certification déjà approuvée par le client.Ainsi, à moins que vous ne puissiez manipuler d'une manière ou d'une autre l'appareil client pour qu'il fasse confiance à votre autorité de certification MITM, vous ne pouvez pas générer de certificat valide.
@ddyer: Tout système d'exploitation (Windows, LInux, MacOS, Android) a des certificats CA préinstallés.Si vous créez un certificat et essayez de dire que vous êtes Google et que le certificat est émis par Verisign ou une autre autorité de certification de confiance, il ne sera pas approuvé, car l'appareil (et tous les logiciels de cet appareil) connaissent le véritable certificat de Verisign.Ces certificats CA de niveau supérieur sont préinstallés sur n'importe quel système d'exploitation (Windows, Linux, Mac, Android).Il faudra beaucoup d'efforts pour qu'un attaquant oblige l'utilisateur à accepter un certificat non approuvé.Mais c'est une autre histoire.Postez une question à ce sujet et nous pourrons en discuter :)
@mentallurg J'enregistre "phishingrus.com" et j'obtiens un certificat SSL pour cela.Vous essayez de vous connecter à goodguyrus.com, je contrôle le DNS et vous donne à la place l'adresse IP du site de phishing.Comment savez-vous que vous parlez au mauvais site avec un certificat parfaitement valide - vous n'avez aucune connaissance préalable à quoi devrait ressembler ce certificat - tout ce que vous savez, c'est qu'il est valide.Ou y a-t-il quelque chose qui me manque?
@ddyer: 1) Qui a délivré votre certificat?Un utilisateur a préinstallé des certificats CA de telles CA comme Comodo, DigiCert, GeoTrust, GlobalSign, Thawte, etc. Quoi qu'il arrive avec DNS.Si l'émetteur du certificat n'est pas approuvé par l'utilisateur (n'est pas installé dans le magasin de confiance), le certificat ne sera pas approuvé et la connexion TLS / SSL ne sera donc pas établie.2) Si vous souhaitez présenter un certificat émis par une autorité de certification de confiance mais n'appartenant pas à un autre site, vous ne pouvez pas prouver que vous êtes le propriétaire car vous n'avez pas la clé privée pour cela.Encore une fois, aucun TLS / SSL ne sera établi.
@ddyer Un certificat SSL indique à quel nom de domaine il est destiné.Lorsque vous fournissez le mauvais certificat, le navigateur affiche une page d'erreur.Vous pouvez tester cela en ajoutant une ligne à votre fichier d'hôtes système pour définir l'IP de certains sites égale à l'IP de certains autres sites.
@boann si j'essaie de me connecter à google et d'obtenir un certificat qui dit alphabet (parent de google), ce serait tout à fait normal.Il n'y a aucun moyen de corréler les certificats que je reçois réellement avec le site auquel je pensais me connecter.Tout ce que je sais, c'est qu'une autorité de certification en qui j'ai confiance dit que les informations contenues dans le certificat sont valides, non pas que c'est le site auquel je pensais me connecter.
@ddyer, le travail du CA est de s'assurer de l'identité du site.C'est ce que vous leur faites confiance.Ainsi, lorsque vous recevez un certificat de cette autorité de certification indiquant que c'est par exemple.com et que vous essayez de vous connecter à exemple.com, vous savez que la connexion est valide.Si vous essayez de vous connecter à example.com mais que vous recevez un certificat de l'autorité de certification indiquant que c'est pour phishing.com, vous savez qu'il y a un problème et abandonnez.De même, si vous recevez un certificat indiquant que c'est par exemple.com mais qu'il n'est pas émis par votre autorité de certification de confiance, vous savez qu'il y a un problème et abandonnez.
Les autorités de certification @ddyer qui émettent accidentellement des certificats incorrects sont tenues de les révoquer immédiatement.Les autorités de certification non fiables sont supprimées des navigateurs.Le projet Google [Certificate Transparency] (https://www.certificate-transparency.org/) est un effort pour auditer et détecter les mauvais certificats.Si je me souviens bien, Google Chrome refuse également d'accepter tout certificat pour un domaine Google provenant d'une autorité de certification non Google, donc votre exemple spécifique ne fonctionnerait pas là-bas.De même, puisque dans votre cas d'utilisation vous avez votre propre client, vous pouvez le programmer pour n'accepter qu'un certificat spécifique.
Boann
2020-06-28 01:37:12 UTC
view on stackexchange narkive permalink

Avec HTTPS, l'intégralité de la requête HTTP passe par le canal SSL crypté, de sorte que les paramètres GET et POST, ainsi que le chemin de l'URL, les cookies et toutes les autres parties de la requête sont protégés contre la falsification MitM en transit.

Cela ne peut garantir que le serveur et le client sont sans compromis, mais cela signifie que vous n'avez pas à faire confiance à chaque ordinateur aléatoire entre les deux.

Le nom d'hôte et le numéro de port sont observables par a MitM, mais ils ne peuvent pas être falsifiés, sauf en tuant la connexion.

Les horaires de trafic et les tailles (remplies) sont observables, et ces informations pourraient être utilisées par un observateur motivé pour déduire ce qui est transféré. Par exemple, un gros fichier peut être une vidéo, ou une taille de fichier spécifique correspond à un fichier spécifique.

Les systèmes ne retournent pas automatiquement à HTTP si HTTPS échoue; ce serait catastrophique. Sans SSL, rien du tout n'est protégé contre l'enregistrement total et / ou la modification.

Le cas qui m'intéresse est celui où le client a piraté son propre ordinateur pour insérer un MITM dans le but d'attaquer le serveur.
@ddyer SSL protège uniquement les données en transit.Il ne tente pas d'affirmer sa domination sur les ordinateurs à l'une ou l'autre extrémité.Vous ne pouvez pas sécuriser complètement un ordinateur chez quelqu'un d'autre.Il est impossible d'empêcher un utilisateur suffisamment motivé d'envoyer toute demande modifiée qu'il souhaite, en créant un client personnalisé ou en modifiant le vôtre.SSL rendra cela plus frustrant, mais pas impossible.
c'est ce que je pensais aussi.Tu ne peux pas faire confiance à ces clients!
fraxinus
2020-06-27 02:27:57 UTC
view on stackexchange narkive permalink

D'autres réponses étant bonnes concernant SSL (il s'appelle TLS de nos jours, mais qu'importe), elles ont presque contourné

Supposons que des paramètres de style GET aient été ajoutés à une requête POST - ces paramètres seraient-ils ignoré de manière fiable?

Non. Il existe même des frameworks d'application qui permettent un mélange gratuit entre l'URL et les paramètres du corps de la requête dans une requête POST.

En JavaEE, par exemple, il faut faire un travail supplémentaire pour déterminer si un paramètre spécifié est venu à partir de l'URL ou du corps de la requête. Et généralement, personne ne s'en soucie.

Cela n'a pas non plus d'importance du point de vue de la sécurité - quiconque peut transmettre un paramètre d'URL au serveur peut également transmettre un paramètre de corps de requête. Si la connexion n'est pas chiffrée, un homme du milieu peut la modifier comme il l'entend.

Si la connexion est chiffrée avec SSL / TLS, elle est chiffrée dans son ensemble, avant que toute interaction HTTP puisse avoir lieu et il reste chiffré jusqu'à ce qu'il soit fermé.

La seule chose qu'un homme du milieu peut faire pour une connexion correctement chiffrée est de la rompre. (Eh bien, on peut aussi exploiter certaines vulnérabilités de protocole ou d'implémentation, mais elles sont rares de nos jours)

Matthew Steeples
2020-06-28 16:51:33 UTC
view on stackexchange narkive permalink

En plus des autres réponses, il y a une autre dimension de sécurité à considérer, et c'est à voir avec ce qui arrive à l'URL. Aucun des éléments suivants ne permet d'intercepter ou de modifier les valeurs, indiquez simplement où elles pourraient être lues . Tous ces éléments s'appliquent également à HTTP et HTTPS; la présence de HTTPS n'atténue aucun d'entre eux.

  1. Même en utilisant HTTPS, l'URL complète est transmise à tous les serveurs tiers qui chargent des composants sur la page via le référent en-tête. Cela signifie que tous les paramètres GET pourraient être exposés à des tiers. Cela peut être atténué en définissant une Politique de référence sur votre demande.

  2. Les serveurs Web enregistrent généralement les requêtes HTTP dans le système de fichiers. Par défaut, ceux-ci sont configurés pour consigner l'URL qui a été envoyée au serveur, ce qui signifie que tous les paramètres GET peuvent être visibles dans vos journaux et disponibles pour quiconque y a accès. Certains serveurs proxy enregistrent également les URL qui ont été visitées (mais le fait qu'un serveur proxy puisse voir votre trafic chiffré est un autre niveau de confiance).

  3. Votre navigateur peut mettre en cache un liste des URL que vous avez visitées, qui incluraient également les paramètres GET.

De plus, certains MitM-Proxies qui sont courants dans les paramètres d'entreprise (et interrompent la protection TLS de bout en bout avec de fausses autorités de certification de confiance) peuvent enregistrer les demandes (comme les serveurs) et sont moins susceptibles d'enregistrer l'ensemble du corps.c'est une exigence de conformité courante de ne pas envoyer de données sensibles dans l'URL même lorsque la protection https fonctionne en principe.D'autant plus qu'ils peuvent également se retrouver dans des fichiers de signets ou être envoyés à des services raccourcis ou à des éléments tels que des vérificateurs de réputation.Sans parler de l'aspect convivialité des URL qui ne sont pas facilement lisibles.


Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 4.0 sous laquelle il est distribué.
Loading...