Chiusura di un elemento HTML senza utilizzare barre letterali?

12

Sto esaminando una vulnerabilità in un'applicazione che riecheggia un nome file fornito dall'utente senza disinfettare il nome file.

es. un file chiamato test-<script>alert("evil");.txt risulterà in quel testo riecheggiato nell'XHTML. (Nel caso in cui sia importante, questo particolare documento viene fornito come text / html e il doctype è xhtml1-transitional.)

Il problema è che il tag <script> non può essere chiuso perché il nome file non può contenere / . Ciò significa che lo script non viene eseguito perché tutto ciò che segue è parte dello script e tutto il codice HTML sarà JS non valido.

(FWIW, sto anche studiando l'uso delle sottodirectory come metodo per inserire la barra nell'applicazione, ma sembra che tagli la dirname dal file prima di essere visualizzata. Heh - avere un file chiamato ./<script>alert("evil subdir?");</script>.txt fa mi sento un po 'nauseato ...)

Basati su alcuni cheat XSS , ho provato diversi modi per codificare la barra in modo che possa apparire nel nome del file, ma deve essere interpretato dal parser HTML come tag di chiusura. Senza fortuna; i caratteri sono inseriti letteralmente nell'HTML senza alcuna codifica / decodifica intermedia.

Anche senza la barra ho trovato tre o quattro modi di sfruttarlo, ma finora richiedono l'interazione dell'utente con quell'elemento (ad esempio onmouseover ). Rendono anche la pagina brutta perché la struttura del tag cade a pezzi. Se riesco a chiudere il tag, l'exploit è sia invisibile che automatico.

Esistono tecniche standard (ad esempio l'evasione del filtro XSS) per la chiusura di un tag senza virgolette che mi mancano?

    
posta bstpierre 18.11.2011 - 18:36
fonte

1 risposta

12

Ecco alcuni altri che puoi provare. Scommetto che uno di questi funzionerà (in effetti, scommetto che il primo funzionerà, e quindi puoi smettere di leggere):

  • Prova <img src="" onerror="alert(0)"> . Nessuna interazione utente coinvolta.

  • Stai rinunciando troppo facilmente a onmouseover . Crea un elemento gigante che copre la maggior parte della pagina, quindi usa onmouseover . Mentre tecnicamente l'interazione con l'utente è coinvolta, penso che tu possa renderla quasi automatica.

  • Prova onreadystatechange , ad esempio <iframe onreadystatechange=alert(0)> . Si tratta solo di IE (IE7 e versioni successive, penso) ma potenti .

  • Prova onfocus="alert(0)" autofocus , ad esempio <input autofocus onfocus=alert(0)> . Non so se funzionerà.

  • In Opera, prova <table background=javascript:alert(0)> . Potrebbe funzionare .

  • Prova <img src="javascript:alert(0)"> e <iframe src="javascript:alert(0)"> (è improbabile che funzioni sulla maggior parte dei browser, ma puoi provarlo).

  • Se il server non specifica il tipo di codifica del contenuto nelle intestazioni della risposta HTTP, prova UTF -7 shenanigans (funziona solo su browser meno recenti).

Si noti che è probabile che queste tecniche siano altamente dipendenti dal browser.

Se sei ancora bloccato, prova a chiedere su Sla.ckers ; ci sono un sacco di persone che sono là fuori che sono super ben informati su questo genere di cose. Per le basi, raccomando il foglio trucchi XSS di RSnake . Per i vettori XSS più avanzati, prova il blog di Gareth Heyes e Sla.ckers.

    
risposta data 18.11.2011 - 19:08
fonte

Leggi altre domande sui tag