¿Es la inyección de matriz una vulnerabilidad y cuál es el término adecuado para ella?

4

Cuando estoy realizando pruebas de penetración, a veces observo un comportamiento no deseado de un script PHP cuando inyecto una matriz única o multidimensional utilizando los parámetros HTTP GET.

Posible riesgo de disponibilidad

Esto puede provocar un riesgo de disponibilidad, especialmente en el caso de una inyección de matriz multidimensional cuando una secuencia de comandos PHP recurre en bucle recursivamente a través de una matriz multidimensional (profunda) y no hay un límite alto en el tiempo de ejecución. Porque esto puede causar agotamiento de recursos. En la práctica, este puede ser el caso cuando toda la matriz $_GET se recorre en bucle para aplicar algún tipo de filtrado o validación.

Preguntas sobre este comportamiento

  1. ¿Cuál sería el término adecuado para tal vulnerabilidad? ¿"Inyección de matriz"?
  2. ¿En qué categoría de vulnerabilidad pertenece (por ejemplo, en el Top 10 de OWASP o en la lista de CWE)?
  3. ¿Esto, aparte del riesgo de disponibilidad, se considera una vulnerabilidad?
  4. ¿Cuál es un buen escenario en el que esto puede ser explotado?

Ejemplo de comportamiento

Entrada: (esperar cadena como parámetro)

/search.php?query=test

Resultado: (en $_GET de PHP)

[query] => test

Entrada: (matriz inyectada)

/search.php?query[]=test

Resultado: (en $_GET de PHP)

[query] => Array
(
    [0] => test
)

Entrada: (matriz multidimensional inyectada)

/search.php?query[][][][]=test

Resultado: (en $_GET de PHP)

[query] => Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => Array
                        (
                            [0] => test
                        )
                )
        )
)
    
pregunta Bob Ortiz 22.06.2016 - 12:19
fuente

4 respuestas

3
  

¿Cuál sería el término adecuado para tal vulnerabilidad? "Formación   inyección "?

     

¿En qué categoría de vulnerabilidad pertenece (por ejemplo, en la parte superior de OWASP > 10 o CWE)?

Esto se llama " manipulación de parámetros " y ha sido llamado como tal por PHP developers , OWASP, y cae bajo diferentes números CWE con el padre CWE-371 , por ejemplo, cuando el parámetro involucra la instrucción SQL de inyección, se convierte en una inyección SQL. Todo lo que está haciendo es manipular (manipular) la entrada en un esfuerzo por producir un efecto adverso.

  

¿Esto, aparte del riesgo de disponibilidad, se considera una vulnerabilidad?

La vulnerabilidad sería que el servidor falla en entrada de desinfección

  

¿Cuál es un buen escenario en el que esto puede ser explotado?

Esto depende de la aplicación en sí. Tendría que seguir manipulando los comentarios para ver qué podría suceder en diferentes circunstancias. Por ejemplo, ¿ha intentado insertar comandos anidados dentro de la manipulación? Por ejemplo:

/search.php?query[() { example;};echo \"Content-type: text/plain\"; echo; echo; /bin/cat /etc/shadow"]=test

Sin entender la aplicación subyacente, es difícil determinar qué es vulnerable. El hecho de que la entrada no esté validada, debería poder probar todo tipo de cosas para inyectar para intentar que el servidor responda a sus datos manipulados. Podría insertar grandes cantidades de datos para ver si podría desencadenar un desbordamiento de pila / búfer / montón. Hay algunas cosas que puedes probar, pero una vez más, sin conocer la función de la aplicación inicial, esto se convierte en un juego de adivinanzas

    
respondido por el munkeyoto 28.06.2016 - 21:03
fuente
6

Creo que el término contaminación de parámetros HTTP sería la mejor opción. Este tipo de contaminación generalmente envía el mismo parámetro varias veces con diferentes valores en la misma solicitud. Esto hace que el parámetro sea tratado como una matriz de valores con el nombre del parámetro como el nombre de la matriz como se describe en este artículo . La forma en que el servidor web y el lenguaje de programación manejan estos arreglos en comparación con el valor único es lo que explota esta clase de error.

De manera similar, sus ejemplos causan una matriz con el mismo nombre, aunque a través de un método diferente para repetir el parámetro, pero parece un ajuste mejor en comparación con otros términos como fault injection o type confusion .

Si bien este tipo de contaminación generalmente explota un comportamiento indefinido, los ejemplos que ha proporcionado no lo harían. Causarían un comportamiento definido para manejar una matriz. Esto todavía puede desencadenar excepciones que podrían usarse para alterar el flujo de una aplicación, como errores antes de que una verificación de autorización haya cambiado su sesión, lo que resulta en una escalada de privilegios.

    
respondido por el wireghoul 22.06.2016 - 13:51
fuente
4

Ser capaz de usar arreglos en $_GET de esta manera no es en sí mismo una vulnerabilidad de seguridad. El vector DoS me parece despreciable, aunque esto puede ser amplificado por el código que lo usa.

Sin embargo , los ejemplos que proporcionó se perdieron la parte más importante de esta función (desde el punto de vista de los atacantes): no solo es posible pasar matrices regulares en GET y POST parámetros de esta manera, pero también matrices asociativas . De hecho, PHP no destruye entre los dos:

  

Las matrices PHP pueden contener enteros y claves de cadena al mismo tiempo que PHP no distingue entre matrices indexadas y asociativas.   - PHP: Arrays - Manual

Esto significa que si un cliente suministra parámetros POST como este:

<input type="text" name="pass[pass1]" value="Password 1">
<input type="text" name="pass[pass2]" value="Password 2">

$_POST / $_GET se verá así:

$_POST = array(
    ...
    'pass' => array(
        'pass1' => 'Password 1',
        'pass2' => 'Password 2', 
    ),
    ...
);

Pero si el servidor esperaba que fuera una matriz normal en lugar de asociativa, podría provocar una vulnerabilidad de seguridad:

//Simplified example, bug is possible with parameterized queries as well
//Expects ?pass[]=password1&pass[]=password2
$query = 'INSERT INTO users (index, password) ';
$parts = array();

foreach($_GET['user'] AS $index=>$value){
  parts[]=" VALUES ({$index}, ".$pdo->real_escape_string($value).')';
}

$query .= implode(", ", $parts);
$pdo->exec($query);//

$query con entrada esperada:

INSERT INTO USERS (index, password) VALUES(0, 'password1'), VALUES(1, 'password2')

$query con ?pass[0,'');DROP DATABASE DATABASE();--]=foo :

INSERT INTO USERS (index, password) VALUES(0,'');DROP DATABASE DATABASE();--, 'foo')

Dehecho,esteesexactamenteelmismoerrorquellevóalafalladeseguridadllamada"Drupalgeddon" , y recibió ese nombre por una buena razón.

  

Una vulnerabilidad en esta API permite a un atacante enviar solicitudes especialmente diseñadas que resultan en una ejecución de SQL arbitraria. Dependiendo del contenido de las solicitudes, esto puede llevar a una escalada de privilegios, ejecución arbitraria de PHP u otros ataques. - SA-CORE-2014-005 - Drupal core - Inyección de SQL

  

Los ataques automatizados comenzaron a comprometer los sitios web de Drupal 7 que no fueron parcheados o actualizados a Drupal 7.32 en las horas posteriores al anuncio de SA-CORE-2014-005 - Drupal core - inyección SQL. Debe proceder bajo el supuesto de que todos los sitios web de Drupal 7 estaban comprometidos, a menos que estén actualizados o parcheados antes del 15 de octubre, a las 11 p.m. UTC, es decir, 7 horas después del anuncio. - Drupal Core - Highly Critical - Anuncio de servicio público - PSA-2014-003

También fue la vulnerabilidad que probablemente conduzca a la divulgación de la Panama Papers (probablemente debería haber instalado esas actualizaciones de seguridad ...).

La vulnerabilidad de Drupal se corrigió al actualizar el código para pasar la matriz recibida a array_values() , que devuelve una matriz indexada que contiene solo valores de la matriz que recibió, eliminando así cualquier clave maliciosa.

El código de ejemplo se podría arreglar de la misma manera:

Antes:

foreach($_GET['user'] AS $index=>$value){

Después de:

foreach(array_values($_GET['user']) AS $index=>$value){

Más información sobre Drupalgeddon, incluido un exploit operativo: Drupal 7: Drupalgeddon Exploit

Ten en cuenta que esto funciona de la misma manera, independientemente de si estás trabajando con $_GET o $_POST . No estoy seguro acerca de $_REQUEST y $_COOKIE .

    
respondido por el user2428118 24.06.2016 - 14:52
fuente
0

Existe otro ataque posible, como con MongoDB .

  

Si está pasando parámetros $ _GET (o $ _POST) a sus consultas, haga   Asegúrate de que son echados primero a las cuerdas. Los usuarios pueden insertar asociativa.   matrices en las solicitudes GET y POST, que luego podrían volverse no deseadas   $ -queries.

     

Un ejemplo bastante inocuo: suponga que está buscando un usuario   información con la solicitud enlace . Tu   la aplicación realiza la consulta $ colección- > find (array ("username" = >   $ _GET ['nombre de usuario'])).

     

Alguien podría subvertir esto obteniendo    enlace $ ne] = foo, que PHP mágicamente   conviértete en una matriz asociativa, convirtiendo tu consulta en   $ collection- > find (array ("username" = > array ('$ ne' = > "foo"))), que   devolverá todos los usuarios que no tengan el nombre "foo" (probablemente todos tus usuarios).

enlace

    
respondido por el Xavier59 28.07.2016 - 13:21
fuente

Lea otras preguntas en las etiquetas