JavaScript eval () para analizar JSON después de la desinfección con expresiones regulares. ¿Es posible XSS?

5

¿Es posible omitir mi expresión regular y ejecutar cualquier JavaScript?

<script>      
  function json(a){

  if (/^\s*$/.test(a) ? 0 : /^[\],:{}\s\u2028\u2029]*$/.test(a.replace(/\["\\/bfnrtu]/g, "@").replace(/"[^"\\n\r\u2028\u2029\x00-\x08\x0a-\x1f]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]").replace(/(?:^|:|,)(?:[\s\u2028\u2029]*\[)+/g, ""))) 
    try{
         return eval("(" + a + ")")
    } catch (b) {}

    g(Error("Invalid JSON string: " + a))
  }

  json(window.name);    
</script>
    
pregunta LucasNN 06.02.2013 - 07:41
fuente

2 respuestas

16

Mi reacción inmediata a esto no fue positiva, por varias razones.

  1. Intentar usar expresiones regulares para analizar construcciones de lenguaje complejas es una mala idea . Las expresiones regulares simplemente no son adecuadas para tales construcciones.
  2. La seguridad a través de listas negras es una mala idea porque siempre estarás, por definición, un paso por detrás de los atacantes. Debe usar un modelo de seguridad positivo .
  3. Hay un número enorme de Técnicas de evasión del filtro XSS que se pueden usar en la parte superior de los vectores estándar. No es posible detectarlos y bloquearlos a todos.
  4. el análisis de JavaScript de JSON a través de eval() se se considera una vulnerabilidad de seguridad .
  5. Los navegadores modernos tienen soporte para el análisis JSON nativo adecuado, a través de JSON.parse() y JSON.stringify() .
  6. Si tiene que admitir navegadores antiguos, hay una biblioteca JSON segura que puede usar que no usa eval() por decodificación.

En general, su enfoque de expresiones regulares es sobre-diseñado, inseguro, mal dirigido y redundante. Estás intentando resolver un problema que ya se ha resuelto. No seas un Dave. Usa el apropiado Funciones y bibliotecas de análisis JSON disponibles para usted.

    
respondido por el Polynomial 06.02.2013 - 13:34
fuente
4

esto (true");alert(9);//"

está muy cerca de una declaración javascript válida y se aceptará en su expresión regular.

Tenga cuidado con su expresión regular, alguien puede evitarla.

    
respondido por el Brian 06.02.2013 - 07:47
fuente

Lea otras preguntas en las etiquetas