web-dev-qa-db-fra.com

Prévenir le détournement de session

Comment empêcher plusieurs clients d'utiliser le même identifiant de session? Je pose cette question parce que je veux ajouter une couche de sécurité supplémentaire pour empêcher le détournement de session sur mon site Web. Si un pirate informatique détermine en quelque sorte l'ID de session d'un autre utilisateur et effectue des demandes avec ce SID, comment puis-je détecter que différents clients partagent un seul SID sur le serveur, puis rejeter la tentative de piratage?

MODIFIER

J'ai accepté la réponse de Gumbo après mûre réflexion, car je me suis rendu compte que ce que je demande est impossible en raison des restrictions imposées par un protocole HTTP stateless. J'ai oublié ce qui est peut-être le principe le plus fondamental de HTTP, et maintenant que je réfléchis à cette question semble un peu trivial.

Laissez-moi élaborer ce que je veux dire:

Une fois que l'utilisateur A s'est connecté à example.com, un identifiant de session aléatoire lui a été attribué. Par souci de simplicité, laissez-le être 'abc123'. Cet ID de session est stocké sous forme de cookie côté client et est validé avec une session côté serveur pour garantir que l'utilisateur qui s'est connecté reste connecté lorsqu'il se déplace d'une page Web à une autre. Ce cookie n'aurait bien entendu pas besoin d'exister si HTTP n'était pas sans état. Pour cette raison, si l'utilisateur B volait le SID de l'utilisateur A et créait un cookie sur son ordinateur avec la valeur 'abc123', il aurait réussi à détourner la session de l'utilisateur A, mais le serveur n'aurait aucun moyen de reconnaître légitimement la La requête est différente des requêtes de l'utilisateur A et le serveur n'a donc aucune raison de rejeter une requête. Même si nous devions répertorier les sessions qui étaient déjà actives sur le serveur et essayer de voir si quelqu'un accède à une session déjà active, comment pouvons-nous déterminer qu'il s'agit d'un autre utilisateur qui accède à la session de manière illégitime et non du même utilisateur qui est déjà connecté avec un ID de session, mais essaie simplement de faire une autre demande avec celui-ci (c.-à-d. accéder à une page Web différente). Nous ne pouvons pas Vérification de l'agent utilisateur? Peut être usurpé - mais bon comme mesure de défense en profondeur néanmoins. Adresse IP? Peut changer pour des raisons légitimes - mais au lieu de ne pas vérifier l'adresse IP du tout, je suggère de vérifier quelque chose comme les deux premiers octets de l'IP, comme même un utilisateur sur un réseau de plan de données qui a une IP en constante évolution pour des raisons parfaitement légitimes n’auraient généralement que les deux derniers octets de leur changement d’IP.

En conclusion, c'est le HTTP sans état qui nous condamne à ne jamais être en mesure de protéger complètement nos sites Web contre le détournement de session, mais de bonnes pratiques (comme celles fournies par Gumbo) seront suffisamment efficaces pour empêcher une bonne majorité des attaques de session. Essayer de protéger les sessions contre le piratage en refusant plusieurs requêtes du même SID est donc tout simplement ridicule et irait à l'encontre de l'objectif des sessions.

60
hesson

Malheureusement, il n’existe aucun moyen efficace d’identifier sans équivoque une demande émanant d’un attaquant par opposition à une demande réelle. Comme la plupart des propriétés vérifiées par des mesures telles que l'adresse IP ou les caractéristiques de l'agent utilisateur ne sont pas fiables (l'adresse IP peut varier selon plusieurs requêtes) ou peuvent être falsifiées facilement (par exemple, en-tête de la demande User-Agent), ce qui peut générer des modifications indésirables. faux positifs (adresse IP réelle d'utilisateur commuté) ou faux négatifs (un attaquant a réussi à créer une demande falsifiée avec le même User-Agent).

C’est pourquoi la meilleure méthode pour empêcher le détournement de session est de s’assurer qu’un attaquant ne peut pas trouver l’ID de session d’un autre utilisateur. Cela signifie que vous devez concevoir votre application et sa gestion de session de sorte qu'un attaquant ne puisse pas deviner un identifiant de session valide en utilisant suffisamment d'entropie et (2) qu'il ne puisse trouver d'autre moyen pour obtenir un identifiant de session valide avec des attaques connues./des règles telles que la détection de la communication réseau, les scripts intersite, les fuites via Referer, etc.

Cela dit, vous devriez:

En outre, vous devez également régénérer l'ID de session en invalidant l'ancien (voir session_regenerate_id fonction ) après certains changements d'état de la session (par exemple, confirmation de l'authenticité après la connexion ou la modification de l'autorisation/des privilèges) et vous pouvez également le faire périodiquement. pour réduire le laps de temps nécessaire à une attaque de piratage de session réussie.

72
Gumbo

Pouvons-nous faire quelque chose comme ça?.

Stocker l'identifiant de session dans la base de données . Enregistrez également l'adresse IP et le HTTP_USER_AGENT pour cet identifiant de session . Maintenant, lorsqu'une requête contenant l'identifiant de session correspondant arrive, votre script.

Peut faire en sorte que ce fonds fonctionne par une fonction ou une classe commune pour une session, de sorte que chaque demande soit vérifiée avant son traitement. Cela prendrait à peine quelques micro secondes. Mais, si de nombreux utilisateurs visitent votre site et que vous avez une base de données de sessions énorme, cela peut poser peu de problèmes de performances. Mais, il serait sûrement très sûr comparé à d’autres méthodes comme => Utiliser des sessions en régénération.

Lors de la régénération d'identifiants de session, il y a encore une faible chance de détournement de session.

supposons que l'identifiant de session de l'utilisateur soit copié et que cet utilisateur ne travaille pas ou ne soit pas actif pendant un certain temps et qu'aucune demande n'est faite au serveur avec l'ancien identifiant de session demandant de régénérer le nouvel identifiant. Ensuite, si l'id de la session est piraté, le pirate l'utilisera et fera une demande au serveur portant cet identifiant, puis le serveur répondra avec l'identifiant de la session régénéré afin que l'intrus puisse continuer à utiliser les services. L'utilisateur réel ne sera plus en mesure de fonctionner car il ne sait pas quel est l'identifiant régénéré et quel identifiant de session de requête doit être transmis dans request. Complètement parti.

S'il vous plaît, corrigez-moi si je me trompe quelque part.

4
kanchan

Il existe de nombreuses défenses standard contre le détournement de session. L'un d'eux consiste à faire correspondre chaque session à une adresse IP unique.

Autres schémas peuvent utiliser un HMAC généré à partir de:

  • l'adresse réseau de l'IP du client
  • l'en-tête user-agent envoyé par le client
  • le SID
  • une clé secrète stockée sur le serveur

Si l'adresse IP de l'adresse IP est utilisée uniquement si l'utilisateur se trouve derrière un proxy public, son adresse IP peut changer à chaque demande, mais l'adresse réseau reste la même.

Bien sûr, pour être vraiment sécurisé, vous devez forcer SSL pour toutes les demandes afin que le SID ne puisse pas être intercepté par des attaquants potentiels. Mais tous les sites ne le font pas (:: toux :: Débordement de pile :: toux ::).

2
Lèse majesté

Une des implémentations faciles peut être réalisée en créant une table dans la base de données, en tant qu’utilisateurs connectés, puis lors de la connexion, mettez à jour cette table avec le nom de l’utilisateur et son identifiant SID, afin d’empêcher d’autres connexions en tant que même utilisateur, maintenant Il suffit d'exécuter une requête simple, qui supprime les données enregistrées dans la base de données. Elle peut également être utilisée pour suivre l'utilisateur connecté sur votre site Web à la fois.

1
Ratan Kumar

Évidemment, lorsque vous définissez un cookie de session dans le navigateur, ce cookie est envoyé dans la requête. Maintenant, quand la demande arrive, le serveur vérifiera l'identifiant de session dans la base de données et accordera l'accès. Pour éviter cela uniquement, il est important de stocker l'agent et l'adresse IP. Ainsi, avant de vérifier le serveur, assurez-vous que l'accès aux sessions est accordé au client unique et non à l'identifiant de session unique qui peut être détourné.

1
kanchan

De mon point de vue, vous pouvez enregistrer l’identifiant de session dans la base de données lorsque les utilisateurs se connectent et vérifier que tout le monde est identique avant de vous connecter. Supprimez le même identifiant de session que vous avez enregistré dans la base de données lors de la déconnexion des utilisateurs. Vous pouvez facilement trouver l'identifiant de session de chaque utilisateur, sinon je peux vous aider.

1
Sk MiRaj

Je ne connais pas bien la partie codage. Je peux donc vous dire un algorithme pour le faire. La définition d'objets tels que SSL ou la configuration du cookie de session sur secure et httpOnly ne fonctionnera pas si un utilisateur renifle l'identifiant de session depuis un réseau LAN (L'utilisateur et l'attaquant se trouvent sur le même réseau local). 

Donc, ce que vous pouvez faire est, une fois que l'utilisateur s'est connecté avec succès à l'application, définissez un jeton unique sur chacune des pages de l'application Web et en gardez une trace côté serveur. Ainsi, si l'utilisateur valide envoie la demande pour accéder à une page particulière, le jeton de cette page sera également envoyé au côté serveur. Étant donné que les jetons sont uniques pour un utilisateur pour une session particulière, même si l'attaquant peut obtenir l'ID de session, il ne peut pas détourner la session de l'utilisateur car il ne peut pas fournir le jeton valide au serveur. 

0
Anandu M Das

Le détournement de session est une menace sérieuse, il doit être manipulé en utilisant une couche de socket sécurisée pour une application avancée qui implique des transactions ou en utilisant des techniques simples comme l’utilisation de cookies, de délais de session et de régénération d’identité, etc. comme expliqué ci-dessus.
À la naissance d’Internet, les communications HTTP étaient conçues pour être sans état; c'est-à-dire qu'une connexion entre deux entités n'existe que pendant la brève période requise pour l'envoi d'une demande au serveur et que la réponse résultante est renvoyée au client. Voici quelques méthodes que les pirates suivent pour pirater la session

  • Écoute de réseau
  • Exposition involontaire
  • Transmission, proxy et hameçonnage
  • Proxys inversés

Toujours recommander SSL Secure Sockets Layer
Utilisez cookies également pour suivre les directives ini_set () au début de vos scripts, afin de remplacer tout paramètre global dans php.ini:

ini_set( 'session.use_only_cookies', TRUE );                
ini_set( 'session.use_trans_sid', FALSE );

Utiliser Délais de session et ID de régénération de session

<?php
// regenerate session on successful login
if ( !empty( $_POST['password'] ) && $_POST['password'] === $password )         
{       
 // if authenticated, generate a new random session ID
  session_regenerate_id();

 // set session to authenticated
  $_SESSION['auth'] = TRUE;

 // redirect to make the new session ID live

 header( 'Location: ' . $_SERVER['SCRIPT_NAME'] );
}                   
// take some action
?>
0
Manjeet Kumar Nai

@Anandu M Das:

Je pense que vous faites allusion à l'utilisation de jetons de session avec chaque ID de session. Ce site peut expliquer l'utilisation de jetons avec des sessions:

https://blog.whitehatsec.com/tag/session-token/

Bien que les jetons de session soient facilement compromis par une attaque XSS, cela ne signifie pas qu'ils ne doivent jamais être utilisés. Je veux dire, avouons-le, si quelque chose pouvait être compromis par une vulnérabilité de sécurité sur le serveur, ce n’est pas la faute de la méthode, c’est la faute du programmeur qui a introduit cette vulnérabilité (pour mettre en évidence les points soulevés par Hesson et Rook).

Si vous suivez les conventions et pratiques de sécurité appropriées et sécurisez votre site contre l'injection SQL, XSS et si vous souhaitez que toutes les sessions soient gérées via HTTPS, vous pouvez facilement gérer l'attaque potentielle à partir de CSRF en utilisant des jetons côté serveur, stockés dans la session. et mis à jour à chaque fois que l'utilisateur provoquerait une manipulation de sa session (comme un $ _POST soumis). En outre, ne stockez JAMAIS les sessions ou leur contenu dans une URL, quelle que soit la qualité de leur codage.

Lorsque la sécurité de vos utilisateurs est primordiale (comme il se doit), l'utilisation de jetons de session permettra de fournir des fonctionnalités améliorées ou plus avancées sans compromettre la sécurité de leur session.

0
user253780