
Preuve de concept de XSS stocké pour le groupware SOGo, exploitant le cookie 'Remember Username' pour injecter des charges utiles JavaScript via le point de terminaison de connexion.
Stored XSS dans le cookie Alinto/SOGo
Chercheurs : Daniil Khomichenok, Alexander Klimenko
Versions concernées < 5.12.4 ( https://github.com/Alinto/sogo/releases/tag/SOGo-5.12.4 )
Date : 01.10.2025
Lorsque la fonctionnalité "Se souvenir du nom d'utilisateur" est activée, un champ encodé en base64 est ajouté au cookie du navigateur.
Cette valeur est obtenue à partir du paramètre "userName" dans la requête POST vers le point de terminaison /SOGo/connect.
La réponse du serveur contient une charge utile XSS encodée en base64 avec un cookie défini :
Set-Cookie: SOGoLogin=dGVzdDIyMkBxYXRlc3Qub2YuYnk8L3NjcmlwdD48c2NyaXB0PmFsZXJ0KCcxMjMnKTwvc2NyaXB0Pg%3D%3D; expires=Sun, 02-Nov-2025 09:58:23 GMT;
L'ajout de la valeur suivante à la requête POST pour le paramètre "userName" :
qui contient une injection JavaScript qui est exécutée lorsque l'utilisateur revient sur la page d'authentification et est stockée dans le cookie "SOGoLogin" du navigateur de l'utilisateur.
Code de la page d'authentification, qui contient l'injection :
<script type="text/javascript">
var cookieUsername = "[email protected]</script><script>alert('123')</script>";
var language = 'English';
var loginHint = ''
</script>
Code du cookie de connexion mémorisé qui accepte les injections XSS comme valeur de paramètre :
if (rememberLogin)
[response addCookie: [self _cookieWithUsername: [params objectForKey: @"userName"]]];
else
[response addCookie: [self _cookieWithUsername: nil]];
Correctif : https://github.com/Alinto/sogo/commit/9e20190fad1a437f7e1307f0adcfe19a8d45184c