Attaque web
Par Plum05 • 17 Janvier 2018 • 2 481 Mots (10 Pages) • 500 Vues
...
- Exemple
Dans notre exemple on va utiliser un programme nome fireforce sur le navigateur Firefox.
Sur le champ de mot de passe (mot de passe correct s’est 129), on va générer notre dictionnaire sur les mots de passes.
[pic 14]
Figure 13: exemple sur brute force
On peut choisir quel champ utiliser pour générer notre mot de passe, dans notre exemple on va test que sur les chiffres, pour ne pas rendre le test très long.
[pic 15]
Figure 14: informations pour le brute force
Remarque : échec s’est que le navigateur affiche à l’échec de login
Pour le résultat :
[pic 16]
Figure 15: résultat de brute force
- Solution
- Les mesures suivantes peuvent être utilisées pour se défendre contre les attaques par force brute:
- Exiger les utilisateurs d'avoir des mots de passe complexes
- Limiter le nombre de fois qu'un utilisateur peut tenter de se connecter
- Temporairement de verrouillage sur les utilisateurs qui dépassent le nombre maximal de tentatives de connexion
- Utilisation files d'attente.
La théorie :
La clé pour dissuader les attaques par force brute est de retarder chaque demande assez longtemps pour que l'attaque de devenir impraticable. Si vous ne pouvez tester seul mot de passe par seconde, alors il va prendre une éternité pour les tester tous. Ils peuvent toujours essayer, mais c’est un effort inutile. Il y a tout simplement trop de possibilités à franchir que lentement. Toutefois, un utilisateur normal remarquera à peine si leur tentative de connexion prend quelques secondes pour passer.
Alors, comment pouvons-nous mettre en œuvre ce en PHP? Cette solution est de mettre en place une base de données où chaque tentative de connexion est entrée et un ID est généré. La tentative avec l'ID le plus bas est alors autorisé à traiter, après quoi il est retiré de la base de données, et la tentative suivante, il est autorisé à continuer. - Idéalement, je voudrais qu'il y ait un processus de fond qui gère la validation; trouver la première tentative non transformés, valider, mettre à jour son statut dans la base de données, et de passer à la suivante. Les demandes de tentatives de connexion se ajouter leurs entrées à la base de données, puis vérifier périodiquement pour voir si leur tentative a encore été traitée, après quoi ils enlèvent la tentative de la base de données et renvoient le résultat à l'utilisateur.
Cependant, les processus d'arrière-plan peuvent être gênants pour de nombreux hébergeurs PHP, donc pour les fins de cet article, je suis en optant pour une solution où chaque demande est chargée de valider leurs propres tentatives. Ils ajoutent une entrée dans la base de données, puis vérifier périodiquement la base de données pour voir si leur entrée est la première entrée répertoriés, puis le traiter, et enfin supprimer. Assez simple.
Exécution :
La première chose que nous devons faire ici est mise en place une base de données. En raison de sa disponibilité générale dans le monde de PHP, je vais utiliser MySQL comme ma base de données. Notez, cependant, que vous pouvez tout aussi bien utiliser des systèmes en mémoire comme mémoire cache ou les mécanismes de cache de l'utilisateur de l'extension APC. Ceux seraient en fait probablement de meilleurs résultats.
Le tableau que je vais utiliser contiendra quatre colonnes.
Une colonne d'identité que nous pouvons utiliser pour commander les tentatives, et de découvrir ce qui est à côté tentative à traiter.
Une colonne last_checked, qui sera mis à jour par chaque tentative à chaque fois le code vérifie si la tentative est prêt. Cette colonne last_checked sera utilisé pour filtrer les tentatives morts; tentatives ajoutés par les demandes qui ont depuis été tués hors tension. Si nous ne prenons pas cette précaution, toute demande morte calera l'ensemble de file d'attente jusqu'à ce qu'il soit supprimé manuellement.
Une colonne d’ip_address, qui permet de stocker la représentation d'entier non signé de l'adresse IP du client. Cette colonne aura un frein essentiel UNIQUE sur elle, pour s’assurer que chaque adresse IP ne peut exister une fois dans la file d'attente. (Vous pouvez aussi facilement stocker la chaîne IP, mais j’ai une chose à propos de l'espace de stockage gaspillé.)
Une colonne de nom d'utilisateur, pour mémoriser le nom de l'utilisateur qui tente attend. Il sera utilisé pour diviser la file d'attente vers le haut dans les files d'attente par utilisateur. Cela signifie que même s’il y a dix tentatives en file d'attente pour un utilisateur, une tentative pour un autre utilisateur n’aura pas à attendre.
[pic 17]
En outre, puisque c’est un système de connexion utilisateur, je serai en utilisant ce que la table où les haschs nous validons sont stockés:
[pic 18]
Pour gérer l'ensemble de chose, je ai mis en place une classe qui peut être utilisé pour créer les tentatives de connexion, les attendre pour être traitées, puis traiter le résultat de validation.
- Usage :
Pour résumer la fonctionnalité de la classe, nous n’avons que deux méthodes publiques, nous devons nous préoccuper.
__construct crée la tentative, en prenant le nom d'utilisateur, mot de passe et une instance PDO. Il fixe leur classe respective attribue à ces valeurs, et déclenche la fonction de addToQueue, qui continue à créer une nouvelle entrée pour la classe de base de données et définir l'attribut attemptID ensuite.
whenReady est notre «auditeur», pour ainsi dire. Il faut une fonction
...