¿Cuál es la falla de seguridad en este ejemplo de "parámetros mágicos"?

4

Estoy leyendo Guía de pruebas OWASP v3 :

  

Ejemplo 1: Parámetros mágicos

     

Imagina una aplicación web simple que acepta un par de valor-nombre de "magia" y luego el valor. Para simplificar, la solicitud GET puede ser: http://www.host/application?magic=value .

     

Para simplificar aún más el ejemplo, los valores en este caso solo pueden ser caracteres ASCII a - z (mayúsculas o minúsculas) y números enteros de 0 a 9. Los diseñadores de esta aplicación crearon una puerta trasera administrativa durante las pruebas, pero la ofuscaron para evitar El observador casual de descubrirlo. Al enviar el valor sf8g7sfjdsurtsdieerwqredsgnfg8d (30 caracteres), el usuario iniciará sesión y se le presentará una pantalla administrativa con el control total de la aplicación. La solicitud HTTP es ahora:

http://www.host/application?magic=sf8g7sfjdsurtsdieerwqredsgnfg8d
     

Dado que todos los otros parámetros eran campos simples de dos y tres caracteres, no es posible comenzar a adivinar combinaciones en aproximadamente 28 caracteres. Un escáner de aplicaciones web necesitará forzar (o adivinar) la totalidad del espacio clave de 30 caracteres. ¡Eso es hasta 30 ^ 28 permutaciones, o billones de solicitudes HTTP! ¡Eso es un electrón en un pajar digital!

     

El código para esta comprobación ejemplar de Magic Parameter puede tener el siguiente aspecto:

public void doPost( HttpServletRequest request, HttpServletResponse response)
{
String magic = “sf8g7sfjdsurtsdieerwqredsgnfg8d”;
boolean admin = magic.equals( request.getParameter(“magic”));
if (admin) doAdmin( request, response);
else .... // normal processing
}
     

Al observar el código, la vulnerabilidad prácticamente salta de la página como un problema potencial.

Como soy un principiante, no veo la vulnerabilidad en el código de inmediato. ¿Alguien podría explicar qué es exactamente lo que está mal con el código?

    
pregunta Alex Popov 07.03.2014 - 09:10
fuente

5 respuestas

6

Aquí, si un usuario conoce la cadena mágica, obtiene privilegios de administrador si envía una solicitud que contiene la cadena "sf8g7sfjdsurtsdieerwqredsgnfg8d" como valor para el parámetro "magia".

Los desarrolladores utilizan a menudo las credenciales / cadenas mágicas para realizar pruebas. A menudo, se olvidan de eliminarlos al implementar la aplicación en las etapas de producción, lo que genera una vulnerabilidad.

    
respondido por el DanielE 07.03.2014 - 09:41
fuente
10

En realidad, hay otro más importante, debido a la falta de una constante de tiempo de implementación de iguales, se puede usar un ataque de tiempo para calcular magic .

Consulte enlace

public static boolean isEqual(byte[] a, byte[] b) {
    if (a.length != b.length) {
        return false;
    }

    int result = 0;
    for (int i = 0; i < a.length; i++) {
      result |= a[i] ^ b[i]
    }
    return result == 0;
}
    
respondido por el Steven R. 07.03.2014 - 23:18
fuente
3

No hay una vulnerabilidad inherente en el fragmento de código en sí mismo ya que no parece propenso a la inyección, asumiendo que la variable mágica local no se expone en algún lugar del código de "procesamiento normal" en la línea. Uno podría discutir sobre la calidad del código, pero no puedo ver qué lo haría vulnerable en esta instancia.

La vulnerabilidad de todo viene del diseño.

Por supuesto, nadie intentará encontrar la cadena mágica mediante la fuerza bruta de cizallamiento: tomaría tiempo, terminaría en los registros del servidor y se descubriría fácilmente mucho antes de cualquier posibilidad estadística de adivinar la cadena mágica. En su lugar, el ataque más fácil en todo el sistema es colocarse frente al servidor (o en cualquier punto entre los usuarios legítimos de administrador y el servidor, ya que la WiFi pública es la mejor opción si los administradores son lo suficientemente tontos) y los paquetes de solicitud de caché enviados al servidor: tarde o temprano, un administrador iniciará sesión y prácticamente le dará la cadena mágica en una bandeja de plata.

Y eso es todo asumiendo que el propio servidor está bien asegurado: si pierde los registros de acceso o respalda los registros de acceso a una ubicación no segura, ni siquiera necesita realizar la red foo en orden para obtener la cadena mágica.

    
respondido por el BeagleEagle 07.03.2014 - 17:45
fuente
1

Desearía haber visto esto antes, pero solo estoy leyendo esa Guía de prueba de OWASP. Para mí, el fragmento de código tiene los siguientes defectos obvios:

  • La contraseña almacenada es texto sin cifrar.
  • La contraseña almacenada se compara con la contraseña de texto simple proporcionada por el usuario
  • La contraseña se almacena en el código fuente y podría comprometerse con el control de versión

Es como almacenar sus contraseñas de usuario en una base de datos como texto sin cifrar. Si la base de datos es hackeada (o el código fuente es robado), la contraseña se conoce de inmediato. No hay excusa o razón para almacenar contraseñas de texto claro. Ya es bastante malo almacenar contraseñas que no están encriptadas o encriptadas fuertemente.

Para mejorar este código, y aún dejar la puerta trasera del desarrollador para realizar pruebas ...

  • Almacene una versión salada / hash de la cadena como una variable de MEDIO AMBIENTE (no se confirmará en un VCS)
  • compare la cadena cifrada almacenada con la versión con sal / hash de la contraseña de texto simple proporcionada por el usuario. (Similar al inicio de sesión estándar)

En PHP, eso podría parecer:

public function doPost(HttpRequest $request, HttpResponse $response){

    $admin = password_verify($request->get('magic'), $_ENV['ENCRYPTED_STRING']);

    if($admin) {
        $this->doAdmin($request, $response);
    } else {
        // do normal processing of request and response
    }

}

Esto todavía deja el problema de pasar la contraseña de texto no cifrado en una cadena de consulta que podría registrarse o rastrearse ... pero ese es un problema fuera del alcance de la pregunta.

    
respondido por el NickB 08.09.2015 - 19:14
fuente
-1

En el escenario de ataque real, el parámetro mágico de búsqueda es casi sombrío, ya que la aleatoriedad en el parámetro mágico es lo suficientemente alta como para protegerlo de un posible ataque de fuerza bruta. Sin embargo, cuando se trata de la revisión del código fuente, se menciona claramente que si el parámetro magic coincide con el hash aleatorio, el usuario aterrizará en el panel de administración.

    
respondido por el Rakesh Singh 08.09.2015 - 19:53
fuente

Lea otras preguntas en las etiquetas