20 vues
[Sécurité - CSRF/Replay] Possibilité de spammer le chat & envoyer un messag
Raf

1 sujet, 1 réponse

Message non lu
Hello,

Tout d'abord je voulais vous féliciter pour NeoFrag, bien que je ne l'utilise pas et que je ne suis plus un grand fan de PHP, il rempli un manque dans le domaine (CMS pour gamers/teams) et est bien complet.

Passons au sujet principal :) Il y a une faille CSRF/Replay sur le chat. Je ne sais pas si elle a déjà été signalée car elle est assez flagrante. Il est possible de simplement rejouer la requête POST sur /ajax/talks/add_message.html et d'ainsi spammer le chat ou avec une attaque un peu plus élaborée d'envoyer un message en tant qu'un autre utilisateur.

Le fix est relativement simple. Il suffit de générer un token pour le chat et l'envoyer à l'utilisateur lorsqu'il le charge. Dès que l'utilisateur envoie un message, le token est vérifié et si il est valide, le message est posté puis un nouveau token est généré et retourné dans la réponse de la requête AJAX afin qu'il puisse poster un message suivant.

++
Raf
3 participants
3 réponses
FoxLey

25 sujets, 573 réponses

Staff
Message non lu
Salut @Raf

Merci pour ton analyse
On va voir pour corriger ça rapidement

Par contre je ne vois pas comment on pourrait envoyer un message à la place d'un autre... (a part en ayant voler la session d'un membre connecté)
GitHub
crazy

60 sujets, 474 réponses

Message non lu
Yo @Raf tu es ici
Debout les morts !
Raf

1 sujet, 1 réponse

Message non lu
@FoxLey Merci pour ta réponse rapide. Poster un message en tant que quelqu'un d'autre peut se faire via un formulaire POST qui peut être hébergé n'importe où (voir PoC ci-dessous) et en invitant l'utilisateur à le soumettre. Ou bien en exploitant une faille XSS autre part sur le site (je n'ai pas vérifié si il y'en avait mais même en étant prudent ça arrive d'en avoir).

Formulaire post:
<html>
<head>
<title>NeoFrag Chat CSRF PoC</title>
</head>
<body>
<form action="[URL]/ajax/talks/add_message.html" method="POST">
<input name="talk_id" type="hidden" value="2" />
<input name="message" type="text" />
<input type="submit" />
</form>
</body>
</html>

@Crazy Coucou :-)