Evita que el escape / corte evite XSS [duplicado]

1

Tengo una entrada, que muestra un valor (Nombre) en un cuadro de la página. En el lado del servidor, la entrada se escapa mediante la siguiente regla (vb.net):

Public Function UnescapeString(strValue As String) As String
    If (String.IsNullOrEmpty(strValue)) Then Return strValue
    strValue = Replace$(strValue, """", "")
    strValue = Replace$(strValue, "'", "")
    strValue = Replace$(strValue, "<", "")
    strValue = Replace$(strValue, ">", "")
    Return strValue
End Function

La salida no está validada en absoluto.

¡¡No puedo creer que la entrada de escape de <> pueda ser tan segura como me parece !?

¿Hay trucos para inyectar código o es lo más importante para evitar XSS aquí, para cortar o escapar de los signos <> ?

Pregunta 2: Estoy planeando una reescritura de este método como este:

   strValue = Replace$(strValue, """", "&quot;")
   strValue = Replace$(strValue, "<", "&lt;")
   strValue = Replace$(strValue, ">", "&gt;")
   strValue = Replace$(strValue, "&", "&amp;")
   strValue = Replace$(strValue, "'", "&#x27;")
   strValue = Replace$(strValue, "/", "&#x2F;")
   strValue = System.Web.HttpUtility.HtmlEncode(strValue) <- or only this

Estoy planeando no recortar, pero escapar de los valores correctamente, como en el ejemplo anterior. O simplemente uso HtmlEncode (última línea) de .NET, que incluso codifica caracteres especiales como diéresis alemanas, así como señales peligrosas como <>"'/ .

    
pregunta Timbo 07.09.2018 - 15:26
fuente

1 respuesta

1

El problema es que puedes usar otra codificación como base64 que tu navegador puede procesar para crear un XSS exitoso, usa HttpContext.Current.Server.HtmlEncode () en su lugar.

Ejemplo:

$ echo '<script>' | base64 
PHNjcmlwdD4K
$echo PHNjcmlwdD4K | base64 -D
<script>

Ejemplo de Javascript:

 var decodedData=window.atob('PGlmcmFtZSBzcmM9L3hzcy9iYXNlLmh0bWwgd2lkdGg9MTAwJSBoZWlnaHQ9MTAwJT48L2lmcmFtZT4K');
     document.write(decodedData);

Ejemplo de iframe:

src=data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4K

Punto adicional: es posible que no esté manteniendo este código durante la vida útil del código; posiblemente, un nuevo exploit pueda sortear su filtro. Esperamos que los mantenedores de .NET publiquen una actualización que aborde eso y que apliquen los administradores de sistemas.

    
respondido por el Joe M 07.09.2018 - 15:37
fuente

Lea otras preguntas en las etiquetas