Hackeando con matemáticas y números.

Esto podría ser aparente para cualquiera que haya estado trabajado en seguridad por algún tiempo, pero yo (siendo un noob) recientemente descubrí una propiedad muy interesante respecto a los números.

Consideremos en código a continuación:

    <?php
    $amount = $_GET['amount'];
    $price = '300';
    $user_balance = user_balance_get();

    // Actualizamos el balance del usuario para reflejar la compra.
    $user_balance = $user_balance - ($price * $amount);
    user_balance_set($user_balance);

Los números tienen una gran cantidad de propiedades que tenemos que considerar a la hora de testear la seguridad de una aplicación, que, nuevamente, son obvias para la gente inteligente pero siempre es importante repetir para aclarar.

  •  Multiplicar un número negativo por un número positivo nos va a dar como resultado un número negativo.
  • Al sumar un número positivo con un número negativo, se substraerá el valor absoluto del número negativo al número positivo. (por ej. 300 + (-200) va a dar como resultado 100.)
  • Lo inverso tambien es cierto. Restar un número negativo a un número positivo resultará en una suma.

Cosas básicas. Aplicar esto a la seguridad informática, sin embargo, es interesante. Viendo el código que escribí mas arriba, y habiendo mencionado los hechos que acabo de mencionar, debería ser aparente que el código es vulnerable.

La línea de código responsable de actualizar el balance de los usuarios (una operación muy riesgosa, desde el punto de vista de la seguridad) es:

    $user_balance = $current_user_balance - ($price_of_item * $user_submitted_quantity)

Esto es interesante porque nos permite aumentar el balance del atacante enviando números negativos. Si ponemos -1 en la cantidad, por ejemplo, sucedería lo siguiente:

    $user_balance = 1000 - (300 * -1)
    $user_balance = 1000 - ( -300 )
    $user_balance = 1300

Ka-ching! Así da gusto ir a comprar cosas.

El nuevo balance es mayor que el balance anterior, lo que significa que logramos una ganancia con esa compra. Otra situación que puede demostrarse como muy enriquecedora para nosotros como atacantes, es si pudieramos transferir plata entre diferentes usuarios (como por ejemplo, el sistema de transferencias de paypal, o un banco).

Consideremos el siguiente código:

    <?php
    $receiver = User(id=1);
    $sender = User(id=2);

    $amount = $_GET['amount'];

    $receiver->balance_set($receiver->balance + $amount);
    $sender->balance_set($sender->balance - $amount);

Parece bastante sencillo, y no particularmente inseguro. Poniendo un número negativo en el parametro “amount”, sin embargo, va a causar que el balance de la persona que reciba la transferencia disminuya, mientras que el balance de la persona que envía el dinero aumentará. En una manera muy real, el emisor esta robando dinero del receptor.

Antes de cerrar el post, otras cosas que pueden ser interesantes cuando lidiamos con aplicaciones son:

  • Integer overflows. Enviar un número muy grande (o muy pequeño, en los negativos), puede tener como consequencia que evitemos filtros como “solo números menores a X”, o viceversa.
  • Checkear que la aplicación no acepte operaciones matemáticas en lugar de números, como por ejemplo “10 + 10 + 10 + 10”
  •  A veces las aplicaciones pueden checkear por algo, por ejemplo, que el número sea menor a 50, y luego convierten el número a su valor absoluto. En esos casos, puedes enviar un gran número negativo y evitar el filtro.

Un abrazo grande,
Pedro

4 Respuestas a “Hackeando con matemáticas y números.

  1. Cuando ataco con mi elefante 3/3 y le disparan una fireball que hace 6 de daño, si yo le castro +4/+4 encima, entra antes o se muere? Gracias por tu respuesta, llevo 3 días con esta partida de Magic y debo terminarla ya, preciso ir al baño.

Agrega un comentario! los comentarios se aprueban automaticamente

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s