¿Usar JSON realmente es suficiente para arreglar la inserción de objetos PHP?

1

Así que acabo de leer en el sitio de OWASP sobre Inyección de objetos PHP . Según su sitio, la solución sugerida es no usar serialze y unserialize sino usar json_encode y json_decode .

Sin embargo, después de hacer algunas pruebas en un tiempo limitado, he descubierto que este no es el caso en absoluto. Por ejemplo ( ejemplo del teclado de trabajo ):

<?php 
function e($method, $args) {
    return $method($args); 
}

var_dump(call_user_func_array("e", array((string)array_shift(json_decode("[\"system\"]")), "ls" )));

?>

Por lo tanto, mis preguntas son:

  1. ¿Estaría de acuerdo conmigo en que este no es el caso, y debería haber más de una solución sugerida en lugar de simplemente usar las funciones json_* ?

  2. ¿Tengo razón al suponer que lo que he hecho es correcto?

pregunta DarkMantis 15.07.2014 - 17:30
fuente

3 respuestas

5

A diferencia de unserialize , si ejecuta json_decode solo, no podrá instanciar ningún tipo de variable diferente a los simples (por ejemplo, matrices, cadenas, int, float, etc.), por lo que es bastante seguro ejecutarlo con datos de entrada del usuario.

El problema en su código es con la función e . Si los parámetros que le pasa provienen de una fuente no confiable como la entrada del usuario, algún atacante podría pasar el nombre de una función potencialmente peligrosa que existe en su código, por lo que e lo ejecutaría y podría dañar su aplicación. Nunca debes dejar que esto suceda.

    
respondido por el Guilherme Sehn 16.07.2014 - 13:54
fuente
2

Soy el autor de la página OWASP sobre Inyección de objetos PHP. Como ya lo dijo Guilherme Sehn, json_decode no permitirá la deserialización de objetos, y el código de fragmento que ha publicado contiene una vulnerabilidad que no concierne a la Inyección de objetos PHP. Por lo tanto, creo que es correcto decir que usar las funciones JSON es suficiente para evitar ataques de inyección de objetos. Esta también debería ser la razón por la que algún tiempo después de crear esa página OWASP, los chicos de PHP agregaron una nota en la página de referencia unserialize : enlace

    
respondido por el EgiX 17.07.2014 - 14:54
fuente
1

¿Arreglar para qué?

Los objetos serializados pueden ser útiles, pero solo deberías nunca unserialze() user-input ; esto fallará y habrá un tipo más inteligente que encontrará esta vulnerabilidad.

La página OWASP está muy mal, en mi humilde opinión. Solo debe emitir una gran advertencia roja: ¡No use unserialize en los datos del usuario!

¿O me equivoco aquí?

    
respondido por el that guy from over there 16.07.2014 - 08:58
fuente

Lea otras preguntas en las etiquetas