Agregando HTML escapado a DOM

0

Estoy aprendiendo sobre XSS y estoy tratando de entender por qué el HTML que se agrega al DOM está activando la vulnerabilidad de XSS.

La aplicación dibujará una superposición modal para un formulario (bootstrap) y agregará HTML (con escape y sin escape) a esa parte del documento DOM. Obtiene los datos de una solicitud al servidor, que escapa automáticamente a cualquier entrada de usuario que contenga HTML. A continuación se muestra el código que está causando la vulnerabilidad.

$('.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()
        }
    });
});
    
pregunta Gerad Bottorff 12.10.2017 - 22:13
fuente

2 respuestas

1

jQuery's .html() es peligroso. Analiza y evalúa el contenido usando eval() , que es mal visto. html() en realidad encuentra <script> tags y los ejecuta, a propósito! Normalmente, cuando se agregan tales etiquetas como una cadena, se ubican silenciosamente en su lugar como contenido benigno sin ejecución.

Si utilizaría la construcción elm.innerHTML=str; en lugar de $(elm).html(str) , se omitirá el rendimiento "inteligente" del procesamiento de jQuery y el dominio resultante sería el mismo, menos las vulnerabilidades. Aún necesita escapar de los atributos del evento, pero se omitirá la vulnerabilidad de html() <script> .

Por supuesto, si no necesita el formato HTML, la respuesta de Arminius acerca de agregarlo como texto sin formato es adecuada.

    
respondido por el dandavis 12.10.2017 - 22:55
fuente
3

La forma de imprimir de forma segura los datos que no son de confianza en HTML es reemplazando los caracteres significativos de HTML por entidades de caracteres . (Es decir, reemplazarías < con &lt; , etc.) Supongo que esto es lo que quieres decir con "escape HTML".

Ahora, si filtra el HTML no confiable de esa manera, ya no puede activar XSS con html() de jQuery. Por ejemplo, esto solo imprimirá texto simple sin marcas:

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

También tenga en cuenta que la forma recomendada para insertar contenido no confiable en jQuery es text() , ya que no tiene que hacerlo. molestarse con su propio filtrado. Esto es seguro:

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

Consulte este JSFiddle para ver una demostración.

    
respondido por el Arminius 12.10.2017 - 22:42
fuente

Lea otras preguntas en las etiquetas