Aggiunta HTML di escape a DOM

0

Sto imparando su XSS e sto cercando di capire perché il codice HTML di escape aggiunto al DOM stia attivando la vulnerabilità XSS.

L'applicazione disegnerà un overlay modale per un modulo (bootstrap) e aggiungerà HTML (sia con escape sia senza escape) a quella porzione del documento DOM. Ottiene i dati da una richiesta al server che ignora automaticamente qualsiasi input utente che contiene HTML. Di seguito è riportato il codice che causa la vulnerabilità.

$('.update_button').live('click',function(){
    $('#name').modal()
    var id=$(this).attr('data-id');
    $('#form_holder').hide()
    $('#form_holder_loading').show()
    $.ajax({
        url:'/some/path/',
        data:'id='+id,
        dataType:'json',
        success:function(data){
            // data is an HTML string with HTML entered by the user encoded
            // such that any HTML characters are replaced with their entity
            // e.g. '<' becomes '&lt;'
            $('#user_form_holder_loading').hide()
            $('#user_form_holder').empty().html(data.form)
            $('#user_form_holder').show()
        }
    });
});
    
posta Gerad Bottorff 12.10.2017 - 22:13
fonte

2 risposte

1

Il .html() di jQuery è pericoloso. Analizza e valuta il contenuto utilizzando eval() , che è disapprovato. html() trova effettivamente i tag <script> e li esegue, di proposito! Normalmente quando si aggiungono tag di questo tipo come una stringa cadono in posizione silenziosa come contenuto benigno senza l'esecuzione.

Se si usasse il costrutto elm.innerHTML=str; invece di $(elm).html(str) , l'elaborazione del contenuto "intelligente" eseguita da jQuery verrebbe omessa e la dom risultante sarebbe la stessa, meno le vulnerabilità. Devi ancora sfuggire agli attributi degli eventi, ma la vulnerabilità abbagliante html() di <script> verrà ignorata.

Naturalmente, se non hai bisogno di formattazione HTML, la risposta di Arminius sull'aggiunta come testo normale è adatta.

    
risposta data 12.10.2017 - 22:55
fonte
3

Il modo di stampare in modo sicuro dati non attendibili in HTML è la sostituzione di caratteri significativi in HTML con entità di carattere . (Ovvero, sostituiresti < con &lt; , ecc.) Suppongo che questo sia ciò che intendi per "escape HTML".

Ora, se filtri in questo modo un codice HTML non attendibile, non puoi più attivare XSS con html() di jQuery. Ad esempio, questo stamperà solo testo semplice senza marcatura:

$('#element').html("&lt;h1&gt;XSS&lt;/h1&gt;");

Nota inoltre che il metodo consigliato per inserire contenuti non attendibili con jQuery è text() , poiché non devi preoccuparsi del proprio filtraggio. Questo è sicuro:

$('#element').text("<h1>XSS</h1>");

Vedi questo JSFiddle per una demo.

    
risposta data 12.10.2017 - 22:42
fonte

Leggi altre domande sui tag