¿Cómo Realizar un ERROR BASED SQL INJECTION Manualmente? [Parte 1]

editado November 12 en Web

Cómo realizar un Error Based SQLi

Nociones Básicas:

  1. ¿Que es el SQL Injection?

NOTA 1:

Es necesario cumplir con los conocimientos anteriores para comprender en su totalidad este tutorial.

  • PASO 1: Identificar el Método de Inyección

Lo primero que tenemos que hacer es identificar el método de inyección, el cual puede ser por Método GET o Método POST

En Esta imagen podemos apreciar que los valores se introducen directamente en el Url por lo tanto en este caso es una Inyección de Método GET

En esta imagen podemos apreciar que existe un input pero los datos que se ingresan en el input también se muestra en el URL por lo tanto también es una Inyección de Método GET

  • PASO 2: Identificar la Vulnerabilidad

Ahora que ya tenemos una aplicación que cambia su comportamiento con los datos que se introducen podemos asumir que utiliza una base de datos.

A continuación es necesario identificar si la aplicación es vulnerable a SQL Injection introduciendo una comilla simple (') en el input o en el parámetro de url en donde se introducen los datos.

En este caso se introdujo la comilla simple directamente en el url justo después del valor [Harry] del parámetro User

NOTA 2:
Para solicitar datos a los usuarios en una aplicación web se suelen utilizar principalmente los métodos GET & POST (existen más) y estos datos son enviados al servidor, para posteriormente ser procesados por la aplicación y mostrar la respuesta al usuario. A continuación como funcionan estos métodos

  • Método GET

Los datos son enviados por el URL

Ejemplo:

www.sitioweb.com/control.php?id=10&name=harry

En este ejemplo el archivo control.php es el que recibe los datos.
Estos datos se guardan en los parámetros (ID) & (name) y sus valores son (10) & (Harry) respectivamente.

Entonces podemos asumir que control.php recibe los valores 10 & harry dentro de los parámetros id & name

  • Método POST

Los datos son enviados en el cuerpo de las cabeceras HTTP

Ejemplo:

www.sitioweb.com/control.php

En este ejemplo podemos darnos cuenta que en el url no se envia ningun valor.

Entonces cómo se evian? Los datos son enviados en las Cabeceras HTTP. A continuación les muestro como se conforma una cabecera HTTP en la cual se envían los datos en sus respectivos parámetros

POST / HTTP/1.1
Host: www.sitioweb.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 16

id=10&name=harry

Finalmente estos datos son procesados en el back-end por el archivo que los recibe y una parte del código de ese archivo puede ser así.

  • GET

<?php

$id = $_GET['id'];
$id = $_GET['name'];

$sql=" SELECT * FROM users WHERE id=$id AND name='$name' "

  • POST

<?php

$id = $_POST['id'];
$id = $_POST['name'];

$sql=" SELECT * FROM users WHERE id=$id AND name='$name' "

Nótese 1:

El valor del parámetro id será almacenada en la variable $id que posteriormente será procesada por qué QUERY

Ambas serán procesados y almacenadas de la misma manera, lo único que cambia es el nombre de la variable reservada. $_GET['name'] | $_POST['name'] Y se utilizara una u otra según que método se utilice para enviar los datos.

Nótese 2:

Ese Query que aparece en el código es el que genera la vulnerabilidad de sql injection ya que el valor que introduce el usuario no es procesado antes de que sea implementado en la query por lo tanto si el usuario introduce una comilla simple (') el codigo quedaria de esta manera.

<?php

$id = $_POST['id'];
$id = $_POST['name'];

$sql=" SELECT * FROM users WHERE id=10 AND name=''' "

En el código anterior podemos identificar que en el parámetro id el usuario introdujo el valor 10 y en el parámetro name el usuario introdujo una comilla simple, la cual deja a la query con 3 comillas simples la cual la del centro es la introducida por el usuario.

Y es aquí donde se genera el error de syntaxis: La comilla simple que queda al final es la comilla que pertenece al código original que termina generando el error.

Nota:

Se utiliza comilla simple debido a que las Query se almacenan en variables de tipo cadena las cuales ya utilizan las comillas dobles y es necesario utilizar las comillas simples.

Este pequeño apartado se extendió un poco, pero considero necesario comprender esto en su totalidad para poder comprender las inyecciones SQL y no cometer los errores de los novatos.

Ejemplo:
En ocasiones los novatos intenta utilizar Sqlmap para la automatización de la inyección pero solo ponen el url de la página sin el parámetro vulnerable.

  • Forma incorrecta:

Python sqlmap.py -u www.pagina-vulnerable.com --dbs --random-agent

  • Forma Correcta:

Python sqlmap.py -u www.pagina-vulnerable.com/archivo.php?parametro=10 --dbs --random-agent

¡¡NOVATOS POR DIOS PONGANLE PARÁMETROS Y QUE SEAN VÁLIDOS!!

Así que todo lo anterior sobre parámetros tuvo que ser introducido gracias a que mucha gente comete ese error, pero es hora de continuar con la realización de una inyección sql.

  • PASO 3: Identificar el Tipo de Inyección

Para identificar el tipo de inyección es necesario analizar el valor del parámetro.

Los tipos de inyección pueden ser String (texto) o Integer (numérico).

En la siguiente imagen podemos apreciar el tipo de inyección que se realizara a esta aplicación web.

Al analizar el URL nos pudimos dar cuenta que el tipo de inyección es de tipo STRING por lo tanto lo inyeccion se realizará utilizando la comilla simple.

Nota:

En dado caso que el tipo de inyección sea de tipo Integer (numérica) no se debe de incluir la comilla simple para inyectar las Querys. Si aún no comprendes a lo que me refiero lo explicaré más adelante.

  • PASO 4: Identificar la Cantidad de Columnas Existentes

Una vez identificado el tipo de inyección es necesario determinar la cantidad de columnas existentes en la tabla seleccionada. Esto para poder inyectar las query que te permitirán extraer los datos.

Para ello utilizamos el siguiente Query en el parámetro vulnerable:

TIPO STRING

' Order by 10 -- -

Nota:

Si el tipo de inyección es de tipo STRING, es necesario comentar al final del QUERY para evitar que la comilla simple que está demás siga generando un error de Syntaxis

Al realizar la inyección con el Query anterior la aplicación responde con un error el cual dice que la cantidad de columnas es incorrecta, por lo tanto es necesario bajar la cantidad hasta que deje de generar error.

A continuación bajaremos la cantidad de columnas a 7

Al realizar la inyección con la cantidad de 7 columnas ya no genera un error, pero aun no sabemos la cantidad exacta ya que podrían ser 8 o 9 debido a que solo el 10 nos genero un error.

Por lo tanto intentaremos con 8 columnas. Si este genera un error, confirmamos que la cantidad de columnas exacta es de 7 de lo contrario seguiremos intentando

Parte 2

Accede o Regístrate para comentar.