10
votes

Comment prévenir la relecture de formulaire / l'attaque man-in-intermédiaire dans PHP, CSRF, XSRF

J'ai un formulaire Web et j'utilise php. Je suis conscient que les formulaires peuvent être manipulés (je crois que cela s'appelle une attaque de replay ou une attaque man-in-the-intermédiaire). Je voudrais donc utiliser un jeton d'authenticité comme champ caché.

Les possibilités de menace que je suis au courant sont:

  • L'attaquant détourne le formulaire de l'utilisateur légitime (ceci, je crois que l'attaque man-in-the-intermédiaire)
  • L'utilisateur légitime est lui-même l'attaquant: il obtient le formulaire, lit le jeton mais l'utilise pour envoyer des données dangereuses (je crois que l'attaque de replay)

    Avant d'arriver aux questions, corrigez-moi si quelque chose que j'ai dit jusqu'à présent est incorrect, car ma compréhension est peut-être défectueuse.

    maintenant aux questions:

    • Quelle est la meilleure pratique pour générer ce jeton afin que le formulaire sans qu'il soit rejeté (par exemple, salage?).
    • Que font les gens pour s'assurer que le jeton n'est pas rejoué.

      nouvelles petites questions basées sur les commentaires:

      • La session est-elle détournant la même chose que l'attaque man-in-intermédiaire?

8 commentaires

Pour une raison quelconque, je pense que vous avez trop complétant ce processus. Pourquoi la validation des données ne suffit-elle pas? Êtes-vous préoccupé par des données de formulaire détournement que quelqu'un soumettrait? Et c'est changé? Ou formulaires de type de connexion? (ce qui pourrait être fait sur SSL pour éliminer l'attaque inter-attaque man-in-the-intermédiaire).


Peut-être que je suis trop compliqué, je ne sais pas. Il semblait compliqué et semé de trop de lacunes lorsque je lisais à ce sujet. Mais la question 1 est toujours valable puisque je ne sais pas quelle est la meilleure pratique pour générer ce jeton :) Qu'il s'agisse de la question 2 (la question de rejouer un jeton) est valide ou non, que j'espère bien comprendre.


Vous utilisez définitivement le mauvais verbage. Il semble que vous parliez surtout de validation de données.


Oui, les termes sont faux. Ce que Chris décrit est la session du détournement et du XSRF. SSL protège contre la première conception du site contre la seconde.


+1 SUDIT STEVEN. Donc, SSL peut protéger contre le détournement de la session. SSL est-il la seule chose nécessaire pour protéger contre elle, ou le meilleur, ou il doit être utilisé en combinaison avec autre chose?


SSL est une grosse aide à cela se cache votre cookie de renifler. Mais cela n'arrêtera pas votre biscuit d'être volé par XSS, alors ce n'est pas une balle magique.


Et non, le détournement de la session n'est pas un homme au milieu. Le détournement de la session vous imprègne en faisant passer votre session Cookie. L'homme au centre est un type d'attaque général basé sur le fait de raconter de chaque côté que c'est l'autre. Il peut être utilisé pour le détournement de la session, mais c'est plus général que cela.


Regardez ici: Stackoverflow.com/questions/2034281/PHP-FORM-TOKENS , c'est un Jeton de sécurité pouvant être utilisé pour empêcher toute action illégale sur vos formulaires. Cela générera un jeton unique pour chaque utilisateur et formulaire et il sera vérifié (vous devez le vérifier) ​​avant de mettre à jour ou d'ajouter un enregistrement à la DB.


4 Réponses :


3
votes

La méthode utilisée pour générer le jeton n'est pas très importante. L'important est que le jeton ne soit utilisé qu'une seule fois. Gardez une liste de jetons générés pour l'utilisateur dans la session de l'utilisateur. Si l'utilisateur soumet un formulaire et que le jeton soumis n'est pas dans la session, vous pouvez rejeter le formulaire.

Protéger contre l'homme dans le milieu est un peu difficile. Une technique courante que j'ai vue est incluant tous les champs de formulaire cachés de la fonction Hash pour générer le jeton, puis la régénérer le jeton basé sur des champs cachés connus. Cependant, cela ne protégerait que contre la manipulation de champ cachés, qui pourrait ne pas être la cible ultime de l'homme au milieu.

Lorsque l'utilisateur soumet un formulaire avec le jeton, supprimez le jeton de la session, de sorte que tout rejou de cette soumission échouera. Cependant, tout ce qu'il faut, c'est que l'utilisateur demande à nouveau le formulaire de générer un autre jeton. Ce nouveau jeton peut ensuite être utilisé dans des attaques automatisées ultérieures. En d'autres termes, les jetons de formulaire sont utiles contre le CSRF, mais pas très efficaces contre les attaques automatisées et les attaques maniantiques.

De même, vous souhaitez adapter votre application pour ne pas nécessiter l'utilisation du bouton arrière de l'utilisateur sur les formulaires. S'il y a un problème avec leur soumission, vous devrez renvoyer le formulaire à l'utilisateur avec leurs données remplies. Si l'utilisateur frappe son bouton de retour pour corriger l'erreur, sa soumission échouera ensuite en raison de la désormais invalide. jeton.

Également, pour être franc, au moment où vous avez besoin de vous inquiéter des redits et des attaques inter-in-hébergés, la connexion de votre utilisateur a déjà été compromise et que vous ne pouvez probablement pas faire pour atténuer les dommages. SSL seul est un niveau de protection adéquat contre Mitm et Replay, et si vous êtes inquiet à ce sujet, vous allez courir sous SSL ...


4 commentaires

Ou, en quelques mots: utilisez simplement SSL.


Non, SSL ne fait rien pour prévenir les attaques XSRF, alors "il suffit d'utiliser SSL" ne le couvre pas.


Il protège contre le détournement de la session, qui est l'autre préoccupation de Chris. XSRF n'est tout simplement pas un gros risque que vous violez les règles psychotik décrits en permettant de changer les choses.


Si l'attaquant contrôle le navigateur de l'utilisateur, il n'ya aucun moyen de protéger l'utilisateur. Toute protection implémentée dans le navigateur peut être contournée par l'attaquant.



5
votes

Vous avez mentionné le CSRF dans le titre mais je ne l'ai pas vraiment couvert dans votre question.

Vous pouvez en lire en détail en ligne , mais le CSRF est essentiellement une attaque qui Permet à un utilisateur légitime de soumettre à un site inconsciemment. Par exemple, si cela ne protégeait pas contre de telles attaques, je pouvais créer une forme qui provoque la modification de vos informations de profil afin de cliquer sur cette mauvaise forme de mine, attendez-vous quelque chose d'autre pour arriver («gagner un million de dollars !! Cliquez ici!!"). Ce formulaire utiliserait vos cookies de navigateur pour vous authentifier et le faire apparaître pour que vous soutiens légitimement les mises à jour de votre profil.

Pour protéger contre cela, vous voulez vraiment faire quelques choses:

  • Assurez-vous que ne provoque pas de mises à jour (par exemple, ne postez pas une nouvelle mise à jour de statut dans le profil d'un utilisateur à l'aide de paramètres de requête sur un GET)
  • Assurez-vous que tous les messages sont accompagnés d'un champ caché qui vous permet de valider que le formulaire a été généré par votre service et non par quelqu'un d'autre, et que c'était pour l'utilisateur envisagé. Donc, ce champ caché doit être généré par le serveur chaque fois qu'il envoie le HTML pour le formulaire et doit être unique pour cet utilisateur pour cette session.

    Une alternative à ce second élément consiste à vérifier que le référent est toujours votre site ou un site que vous attendez à partir du message. Je n'encourage pas cela pour les sites non-HTTPS, car certains référenciers du matériel de navigation / réseau de réseautage, et il n'est pas toujours fiable qu'un référent existe.


4 commentaires

J'ai mentionné le CSRF uniquement dans le titre, car je sentais que c'était en quelque sorte lié à la forme de jeton authenticité, tout simplement pas sûr de la manière.


C'est certainement - j'espère que ma réponse était assez claire sur la façon dont / pourquoi.


Oui, il devient plus clair maintenant, merci pour la réponse. J'ai voté ça


Un référent peut être spoofé, IIRC



1
votes

Pour générer ce jeton, voici une stratégie que j'utilise qui semble bien fonctionner.

  • Définissez un cookie sur une valeur aléatoire (générée sur le serveur à l'aide des astuces habituelles) et définissez-la pour expirer en fonction de vos besoins.
  • Lorsque vous servez une page avec un formulaire, incorporez un champ caché dont la valeur est égale à la valeur de ce cookie.
  • Lorsque vous manipulez le poste, validez que ce champ existe et que la valeur correspond à la cookie de l'utilisateur


0
votes

CSRF-Magic est une excellente classe pour les jetons CSRF, il les met automatiquement dans votre page

http://csrf.htmlpurifier.org/

"CSRF-MAGIC utilise les capacités tamponnées de sortie de PHP pour réécrire de manière dynamique les formulaires et les scripts de votre document. Il interceptera également les demandes postales et vérifiera leur jeton (divers algorithmes utilisés; certains générent des jetons spécifiques à l'utilisateur). Cela signifie que pour un site Web traditionnel avec des formulaires, vous pouvez déposer une magie CSRF dans votre application et l'oublier! "


0 commentaires