Fuzzing de estructuras JSON con ffuf y jdam

Según la inteligencia artificial:

Fuzzing es una técnica de prueba de software que envía datos aleatorios a un programa o sistema para encontrar errores o vulnerabilidades. Se utiliza comúnmente para descubrir bugs y garantizar la seguridad de un sistema o aplicación.

Ahora, supongamos que tenemos un blog y su respectiva API, viendo como ejemplo la siguiente petición que se encarga de crear una entrada.

Petición

POST /blog/posts
Accept: application/json
Content-Type: application/json
Content-Length: 256
{
    "title": "Hello World!",
    "body": "This is my first post!",
    "user": 100,
    "content": "My txt content",
    "data": {
        "id": 12345,
        "account": 98765,
        "comment": "This is a comment"
    }
}

Respuesta

Observamos que la petición anterior nos retorna un código de estado 201 que indica que el artículo fue creado.

HTTP/1.1 201 Created
Content-Type: application/json
Content-Length: 87
Connection: clocase
{
    "id":"1",
    "status":"creado",
    "msg":"Articulo creado satisfactoriamente"
}

Hasta ahora, vemos el normal funcionamiento de una API cualquiera, sin embargo, en el marco de una auditoría de seguridad hacia dicha API, una de las pruebas (dentro de un set de pruebas que se realizan en APIS), es probar cada parámetro en busca de que el sistema falle y sea posible explotar vulnerabilidades del tipo inyección como por ejemplo:

  • SQL Injection
  • Command Injection
  • LDAP Injection
  • NoSQL Injection
  • Format String Injection
  • Local File Inclusion
  • Integer Overflow
  • etc.

Es en este punto donde entramos al tema de este artículo, realizar estas pruebas con la combinación de las herramientas mencionadas en el título (ffuf+jdam).

¿Qué es ffuf?

ffuf es un Web Fuzzer, el cual nos sirve para descubrir rutas válidas en un aplicativo web basado en un diccionario. El uso más básico que se le puede dar a esta herramienta es ejecutarla de la siguiente forma.

ffuf -w /path/to/paramnames.txt -u https://target/script.php?FUZZ=test_value -fs 4242

Sin embargo, tiene un montón de parámetros los cuales podemos usar para un uso más avanzado, para nuestro caso, usaremos los siguientes:

OpciónDescripción
–input-numNúmero de pruebas a realizar
–input-cmdComando que produce el input
-dData post a enviar
-uURL a usar
-XMétodo HTTP a usar
-HDefinir Headers
-vVerbose
-cColorizar el output
-pSegundos de delay entre peticiones
-tThreads concurrentes
-odDirectorio para guardar el resultado
-xProxy web

¿Qué es jdam?

Según su desarrollador jdam es una

Herramienta inspirada para la comprobación de objetos JSON arbitrarios teniendo en cuenta la estructura, lo que garantiza que los resultados de la comprobación siempre serán JSON válidos.

Esta herramienta se diferencia del resto, ya que como bien dice su desarrollador, siempre genera una estructura JSON válida, por lo que podremos testear los parámetros de mejor forma y analizar su comportamiento basándose en los payloads generados por la herramienta.

Veamos un ejemplo con nuestra petición HTTP de ejemplo, primero, debemos guardar el contenido en un archivo que llamaremos DATA.json (el nombre puede ser cualquiera)

{
    "title": "Hello World!",
    "body": "This is my first post!",
    "user": 100,
    "content": "My txt content",
    "data": {
        "id": 12345,
        "account": 98765,
        "comment": "This is a comment"
    }
}

Ahora, si usamos la herramienta jdam.

cat DATA.json | jdam

Vemos que transforma nuestro JSON de la siguiente forma

{
    "body": {
        ":test": ")(cn=))\u0000"
    },
    "content": "My txt connnnnnnnnnnnnnnnnnnnnntent",
    "data": {
        "account": 98765,
        "comment": null,
        "id": 12345
    },
    "title": {
        "$gt": ""
    },
    "user": null
}

Combinar ffuf y jdam

Finalmente, podemos combinar ambas herramientas a través de la opción

--input-cmd

De ffuf, en donde podemos pasarle el comando de jdam que lee nuestro archivo DATA.json y va permutando sus parámetros.

Nuestro comando final quedaría de la siguiente forma:

ffuf --input-num 100 --input-cmd "cat DATA.json | jdam -rounds 3" \\
-d FUZZ \\
-u "URL_AQUI" \\
-X POST \\
-H "Authorization: Bearer token_aqui" \\
-H "Accept: */*" \\
-H "Content-Type: application/json" \\
-v \\
-c \\
-p 0 \\
-t 1 \\
-od ffuf_test \\
-x <http://127.0.0.1:8080>

Si ejecutamos el comando anterior, nos generará 100 request (definidas en —input-num) con distintos payloads en cada una. No olvidar modificar los parámetros segun la necesidad.

Agregar un comentario

Tu dirección de correo electrónico no será publicada. Los campos requeridos están marcados *