¿Qué es una inyección SQL?
La inyección SQL (también conocida como SQL fishing) es una técnica que se usa a menudo para atacar aplicaciones impulsadas por datos.
Esto se hace incluyendo porciones de declaraciones SQL en un campo de entrada en un intento de hacer que el sitio web pase un nuevo comando SQL falso a la base de datos (por ejemplo, volcar los contenidos de la base de datos al atacante). La inyección SQL es una técnica de inyección de código que explota una vulnerabilidad de seguridad en el software de una aplicación.
La vulnerabilidad ocurre cuando la entrada del usuario se filtra incorrectamente para los caracteres de escape literales de cadena incrustados en las declaraciones SQL o la entrada del usuario no se escribe con fuerza y se ejecuta inesperadamente. La inyección SQL se conoce principalmente como un vector de ataque para sitios web, pero se puede usar para atacar cualquier tipo de base de datos SQL.
Requisitos para hacer la práctica
Tener instalado Fedora 14
Tener instaldo BackTrack 5 R1
Tener instalado Firebug
En esta práctica haremos lo siguiente:
Hacemos un ifconfig de las dos máquinas para saber la ip, luego en el Backtrack instalamos Firebug por si no está instaldo
Si no tenemos instalado Firebug
Abrimos el navegador y vamos a http://getfirebug.com/releases/firebug/1.7/firebug-1.7.3.xpi e instalamos
clic en restar now
Desde el Bt vamos a http://ip-fedora/mutillidae y pulsamos la opcion de login/register
En el campo de texto “name” escribimos (') y pulsamos login
Analizamos que ha pasado
Una comilla simple (') es un carácter SQL reservado que rompe la consulta siguiente colocándola en el cuadro de texto Nombre. El mero hecho de que la consulta produzca un error significa que existe una gran posibilidad de que sea susceptible a una Inyección de SQL.
Que sentencia ha entendido el ordenador?
SELECT * FROM accounts WHERE username = ''' AND password =' '
A continuación escribo un ejemplo de una consulta normal
SELECT * FROM accounts WHERE username = 'admin' AND password = 'adminpass'
Ahora reemplazamos ' or 1=1– (hay que poner espacio detrás de los los –)
¿Qué hemos hecho?
Buscamos un nombre de usuario que sea igual a nada O donde 1 sea igual a 1. Entonces, creamos una condición que siempre es verdadera (O 1 = 1). La cadena “-” es un comentario en SQL.
Usamos este truco para comentar el resto de la consulta SQL (AND password = ' '), que elimina esa autenticación de contraseña.
SELECT * FROM accounts WHERE username = '' OR 1 = 1-- 'AND password =' '
Verificando resultados
Ha iniciado sesión como administrador. Debido al diseño del código de Mutillidae, iniciamos sesión como administrador porque admin es el primer usuario en la tabla de cuentas.
En DVWA, como una cadena similar (% 'or' 0 '=' 0 '–) muestra toda la lista aplicaciones que puede realizar el usuario
Click en logout
Ahora toca el campo password, hacemos la prueba de la comilla simple en el campo Password pulsamos en Login/register, ponemos Name: samurai y en password pulsamos botón derecho e inspeccionar elemento
Analizamos los resultados de la comilla simple (')
Una comilla simple (') es un carácter SQL reservado que rompe la consulta siguiente al colocarla en el cuadro de texto Contraseña. El mero hecho de que la consulta produzca un error significa que existe una gran posibilidad de que podamos realizar una Inyección de SQL.
SELECT * FROM accounts WHERE username='samurai' AND password='''
a continuación muestro un ejemplo normal
SELECT * FROM accounts WHERE username='samurai' AND password='samurai'
obteniendo el acceso poniendo comilla simple en el campo contraseña
Inspeccionamos el campo de texto contraseña
Hacemos Click en Login/Register Ponemos en el campo Name: samurai En Password:pulsamos boton derecho del raton y pulsamos en “Inspect Element”
y reemplazamos la palabra password por la palabra text
Aplicamos el test que siempre es verdad (' or 1=1 – )
En name escribimos samurai en password escribimos ' or 1=1– (recuerda que tenemos que poner un espacio en blanco despues de los guiones) y pulsamos Login
Bueno, lo que veo son buenas noticias. Por un lado, estoy contento de haber iniciado sesión, pero debo iniciar sesión como samurai en lugar de administrador.
Hemos iniciado sesión como administrador, porque admin es el primer usuario en la tabla accounts, pulsamos logout
Obtener acceso (3)
Inspeccionaremos el cuadro de texto Password,
Clic en Login/register
Name : samurai
Password : clic boton derecho y click en inspeccionar elemento
Editamos el campo Password
reemplazamos la palabra “password” por la palabra “text”
En vez del 20 en el campo size ponemos 50
Despues de maxlengh= ponemos 50
Minimizamos Firebub
Aplicamos el text que siempre es verdad
Name : samurai
password : ' or (1=1 and username='samurai')– (ponemos un espacio en blanco despues de los 2 guiones)
vemos que el pasword ya no está oculto por asterisco, sino está en texto plano
Verificamos los resultados, (somos usuario samurai ?)
Observamos que hemos iniciado la sesión como samurai
ahora vamos la Fedora y encendemos un terminal root
escribimos
mysql -uroot -psamurai SHOW DATABASES; USE nowasp;
show databases nos proporciona una lista de bases de datos.
use nowasp, nos permite seleccionar una base de datos en particular.
SHOW TABLES; DESC accounts;
show tables nos permite ver todas las tablas en la base de datos nowasp.
desc accounts, nos permite ver todas las columnas de la tabla accounts.
SELECT * FROM accounts;
Para ver el contenido de la tabla accounts
Algunos ejemplos
SELECT * FROM accounts WHERE username = '' AND password = ''; nota son todo comillas simples SELECT * FROM accounts WHERE username = 'samurai' AND password = 'samurai'; nota son todo comillas simples SELECT * FROM accounts WHERE username = 'samurai' AND password = 'wrongpassword'; SELECT * FROM accounts WHERE username = 'samurai';-- and password = 'wrongpassword';
La primera consulta es el procedimiento almacenado real que Fedora usa para verificar las credenciales de nombre de usuario/contraseña.
La segunda consulta es un ejemplo de autenticación exitosa de credenciales. (Ej., Nombre de usuario = 'samurai' y contraseña = 'samurai')
La tercera consulta es un ejemplo de una autenticación fallida de credenciales. (Por ejemplo, username = 'samurai' y password = 'wrongpassword')
La cuarta consulta es un ejemplo de cómo comentar el campo “contraseña” del procedimiento para autenticar credenciales.
SELECT * FROM accounts WHERE username = ''' and password = ''; nota todas las comillas son simples '; SELECT * FROM accounts WHERE username = '' OR 1=1; -- and password = ''; nota: todas las comillas son simples
La primera consulta es un ejemplo que hemos hecho al princicip de la practica
El intérprete de comandos mysql continúa en la línea siguiente, lo que significa que la instrucción está rota, lo que produjo los errores que hemos visto antes. Para volver al shell mysql, debemos completar la declaración con a (';).
La segunda consulta es el ejemplo 'or 1 = 1 produce una condición siempre verdadera, y el; – comentarios / deshabilita el “campo contraseña”.
SELECT * FROM accounts WHERE username = 'samurai' AND password = '' OR 1=1; -- '; (comillas simples) SELECT * FROM accounts WHERE username = 'samurai' AND password = '' OR (1=1 AND username = 'samurai'); -- '; (comillas simples);
La primera consulta es un ejemplo ya hecho. Para el diseño del código con el Fedora, solo se muestra un resultado en la aplicación. Sin embargo, ejecutar esta consulta directamente en mysql generará todos los registros.
La segunda consulta, el 'o (1 = 1 y nombre de usuario =' samurai '); - produce una condición siempre verdadera, y el;– comentarios/inhabilita el campo “contraseña”
Practica que hay que entregar
mysql -uroot -psamurai USE nowasp; SELECT * FROM accounts WHERE username = 'samurai' AND password = '' OR (1=1 AND username = 'samurai'); -- '; \! DATE \! echo "tu nombre"