web-dev-qa-db-fra.com

Comment identifier de manière unique les utilisateurs avec la même adresse IP externe?

J'ai créé un module de connexion sur mon site Web. J'ai pu faire face à de simples attaques par force brute car je peux identifier l'utilisateur en fonction de son nom d'utilisateur/e-mail et limiter sa connexion en fonction des tentatives de connexion infructueuses par compte d'utilisateur.

Mais lorsqu'il s'agit d'attaques de force brute énumérées par l'utilisateur (alias les attaques de force brute inversées), l'identification de l'utilisateur devient assez difficile. La limitation de la connexion basée sur les tentatives infructueuses par adresse IP peut ne pas fonctionner correctement et ennuyer les utilisateurs connectés à Internet via un réseau local car ils auront la même adresse IP externe, car ils pourraient faire face à une limitation en raison des tentatives infructueuses faites par quelqu'un d'autre sur le réseau.

Existe-t-il un moyen d'identifier de manière unique ces utilisateurs?

29
ashu

Comment identifier de manière unique les utilisateurs avec la même adresse IP externe? Existe-t-il un moyen d'identifier de manière unique ces utilisateurs?

Oui, il existe de nombreuses façons:

  • Biscuits
  • Evercookies (code JavaScript qui utilise de nombreuses techniques différentes pour stocker des informations d'identification, parmi lesquelles les cookies flash, les différentes options de stockage HTML5, l'historique des liens des navigateurs visités, etc.)
  • Empreinte digitale de l'appareil: utilisez l'en-tête HTTP (principalement l'agent utilisateur, mais les autres en-têtes et leur ordre peuvent également vous aider)
  • Empreinte digitale de l'appareil avec JavaScript: avec JavaScript, vous pouvez obtenir de nombreuses informations, telles que la résolution d'écran, le fuseau horaire, les plugins, les polices système, etc.
  • Comportement: à quelle vitesse les utilisateurs remplissent-ils les formulaires, où cliquent-ils sur un bouton, etc.

Mais la plupart d'entre eux ne sont pas utiles pour se défendre contre les attaques par force brute, car le programme qui les exécute n'acceptera probablement pas les cookies ou n'exécutera pas JavaScript.

Dans votre cas, vous pouvez essayer:

  • En-tête HTTP: ceux-ci pourraient déjà suffire à différencier les utilisateurs utilisant la même adresse IP (bien sûr, un attaquant peut simplement les commuter de manière aléatoire, mais je suppose que la plupart ne le font pas actuellement).
  • Limitation légère: vous n'avez pas à bloquer les adresses IP, vous pouvez simplement ralentir le processus de connexion pour elles. De cette façon, le forçage brut devient beaucoup moins réalisable, mais les vrais utilisateurs utilisant la même adresse IP peuvent toujours se connecter.
  • CAPTCHAs : ceux-ci ennuieront les utilisateurs légitimes, mais espérons que trop peu d'utilisateurs utilisent réellement une adresse IP d'où proviennent les attaques par force brute (bien sûr, il existe des outils pour résoudre automatiquement les CAPTCHA, mais c'est toujours plus difficile que pas de CAPTCHA).
  • Vous pouvez demander à un utilisateur d'accepter les cookies et d'envoyer diverses informations d'identification avant d'être autorisé à se connecter (comme la résolution d'écran, le fuseau horaire, etc.). Bien sûr, un attaquant peut le faire également, mais je ne pense pas que les outils bruteforce existants puissent le faire, ils devraient donc écrire un script personnalisé. Mais cela pourrait également agacer les utilisateurs légitimes.
37
tim

Vous pouvez obtenir l'adresse IP interne des utilisateurs même à partir d'Internet en utilisant HTML5 & WebRTC . Vous pouvez consulter l'article Découverte IP locale avec HTML5 WebRTC: risque de sécurité et de confidentialité? pour plus d'informations et l'essayer sur http://net.ipcalf.com/ .

Le site Web qui sert l'article semble maintenant en panne. Cependant, je pense que cet artice WebRTC a trouvé des adresses IP locales qui fuient peut également fournir des informations.

21
Batuhan

Il n'y a pas à ma connaissance de méthode non spoofable. Si vous limitez déjà le nombre maximal de tentatives à huit essais par minute avec un délai d'attente d'une minute. Un temps mort d'une minute n'est généralement pas considéré comme ennuyeux tant que vous donnez suffisamment d'informations à l'utilisateur.

Assurez-vous de revoir activement ces événements où il y a des brutes de force suspectées d'une adresse IP, car il pourrait être intéressant de rechercher qui essaie de vous brutaliser.

5
Lucas Kauffman

La plupart des autres méthodes mentionnées ici sont facilement supprimées et/ou réduisent considérablement les performances.

C'est pourquoi les pare-feu d'applications Web (WAF) ne comptent pas sur eux.

2 méthodes fiables sont:

  • Analysez la séquence des paquets dans l'en-tête IP: La plupart des piles TCP/IP numérotent les paquets séquentiellement, donc si le nombre est aléatoire, alors le client est probablement derrière = NAT (une connexion Internet partagée avec d'autres clients). Il y a un RAM surcharge pour se souvenir de l'ID de paquet précédent, mais il est comparable à un cookie de session. Ceci est plus difficile à usurper car l'attaquant a besoin de réécrire le paquet à un niveau bas, mais pas impossible, donc il doit être combiné avec une limitation de débit: permettre aux IP publiques NATted d'avoir plus de hits/seconde.
  • Cookies de session avec authentification cryptographique: Les cookies de session normaux sont pas suffisants. Ils ne sont pas chiffrés avec HTTP, et même avec HTTPS, ils peuvent ne pas faire partie d'une charge utile chiffrée HTTPS, et donc pas authentifiés non plus. http://blog.teamtreehouse.com/how-to-create-totally-secure-cookies Faites-le correctement. Assurez-vous qu'il n'est pas seulement crypté, mais authentifié/"signé". http://spring.io/blog/2014/01/ 20/exploiting-encrypted-cookies-for-fun-and-profit Si vous n'avez accès qu'au code de l'application Web, c'est la meilleure option. Évidemment, si les cookies sont désactivés, exécutez un JavaScript côté client qui fait la distinction entre les navigateurs et les bots (appelez à une résolution d'écran, etc. qu'un bot ne prendrait pas en charge, et retournez l'état du bot si le script échoue). Combinez cela avec une limitation de débit par un cookie de session authentifié ou, si les cookies sont désactivés, une limitation de débit basée sur IP ("limitation") ou un blocage. Cela accepte/rejette la demande au début de la routine de l'analyseur IP/HTTP, conservant ainsi les cycles CPU futurs, car un attaquant en force brute peut réessayer des milliers de fois. En raison de DHCP/PPPoE/de nouveaux cookies de session, les interdictions devraient expirer après quelques minutes. Gardez à l'esprit que vous devez répertorier les adresses IP non falsifiées des robots des moteurs de recherche comme Google et Baidu. Sinon, votre classement de recherche pourrait en souffrir.

Si vous combinez votre solution avec une limitation de débit, la limite de débit correcte doit être 1 à 2 fois le nombre d'URL par page. Par exemple, si login.php comprend 2 fichiers CSS, 4 fichiers JavaScript et 10 images plus la 1 page elle-même, vous devez autoriser au moins 17 accès par cookie de session client, par seconde. Sinon, vous risquez de bloquer/limiter les demandes normales.

Pour les attaques persistantes, vous devez demander à votre FAI de bloquer/trou noir la route en amont.

Pourquoi ne pas utiliser les autres solutions?

'User-Agent:' est très trivial à usurper:

wget -O index.html --user-agent="My Fake Browser"

Les cookies de session, l'en-tête HTTP "X-Forwarded-For:" et d'autres en-têtes sont également triviaux à voler/usurper. Google 'Firesheep' ou 'Cookies Manager +' ou 'Modify Headers plugin' ou 'LiveHeaders plugin' etc. pour preuve.

La limitation du débit ne suffit pas non plus, car une attaque furtive aléatoirement ou augmentera le temps d'attente entre les requêtes:

wget --limit-rate=10 http://example.com/index.php

La force brute n'est généralement pas votre seul problème. https://www.owasp.org/index.php/Top_10_2013-Top_1 = Le codage et le test d'une protection efficace prennent également du temps. Pour vous faire gagner du temps et/ou des cycles CPU sur vos serveurs Web - c'est un gaspillage multiplié si vous avez une batterie de serveurs - votre hôte Web devrait offrir un WAF frontal avec celui-ci configuré pour vous. C'est la meilleure solution - ne le faites pas côté serveur. Faites-le en amont.

4
Courtney Schwartz

L'identification unique peut être difficile, mais il est possible d'ajouter des variables de serveur comme l'agent utilisateur et des variables locales comme les cookies (qui peuvent toutes deux être falsifiées et/ou contournées, mais ajoutent au moins quelques variations à côté de l'adresse IP). Si JavaScript est une option, vous pouvez essayer empreinte digitale du navigateur (JavaScript ou HTML5 Canvas)

3
Alasjo