
Hola mundo y bienvenidos a este post, hoy vas a aprender SQL Injection, una de las 10 vulnerabilidades más comunes que tienen las páginas web y también algunas aplicaciones móviles. Cómo explotar estas vulnerabilidades y cómo protegernos de estos ataques. Y por cierto, este post es con fines educativos, no vayas hackeando otras webs, es ilegal, te puedes meter en muchos problemas, ademas la mayoría de las webs guardan registros de donde vienen las conexiones de los clientes, o sea… tú. Así que solo haz esto en tus servidores.
Antes de continuar, puedes leer este post o ver y escuchar esta información en formato de video en nuestro canal de Youtube, te dejamos el link por si prefieres este formato. 😃 👍
Pero antes de continuar recuerda que puedes aprender a programar desde cero o aprender una nueva tecnología con mis cursos de programación, todos los cursos los encuentras con una única suscripción en nuestra Academia Hola Mundo.
Además, si quieres mejorar tu concentración al estudiar o trabajar, puedes escuchar mi música Hola Beats, esta se encuentra pensada en profesionales, estudiantes pero sobre todo programadores, la puedes encontrar en Spotify, Apple Music, Amazon Music, Youtube Music y Deezer.
Ahora sí, devuelta al post.
¿Qué es SQL Injection?
SQL Injection, también conocida como SQLI es un ataque que utiliza código SQL malicioso para manipular validaciones a nivel del backend y de esta manera poder acceder a información, la cual el hacker inicialmente no podía acceder. Este tipo de información puede incluir un número indeterminado de elementos, como tokens de autorización, datos de usuarios, números de tarjetas de crédito, listado de usuarios, entre muchos otros datos.
Las formas más comunes para poder realizar ataques de SQL injection es a través de formularios, URLs que utilizan parámetros GET o también documentos que deban cargarse en algún sistema.
Ahora veremos este post en dos partes, la primera es cómo se puede realizar este tipo de ataque y la segunda es cómo podemos protegernos de este.
¿Cómo se hace SQL Injection?
Acá como podemos ver tenemos un formulario de inicio de sesión, donde se pide un usuario y contraseña. Y también incluye un botón para enviar los datos del formulario. Este formulario es una manera excelente para poder explicar cómo funciona SQL injection, ya que con este vamos a intentar suplantar la identidad de un usuario y tener acceso para esta aplicación
La mayoría de las veces, los datos que ingresamos en estos formularios van a parar a una base de datos. Y en esta situación es donde nosotros podremos realizar este ataque.

Acá quiero hacer una pausa, si bien un formulario de login es una excelente forma de poder mostrar este ejemplo, debes considerar que cada dato que se ingrese en nuestra aplicación podría ser utilizado para atacar nuestro sistema.
Vamos a verificar que la validación de usuario y contraseña esté funcionando, eso lo haremos escribiendo el usuario chanchitofeliz y su contraseña 123456.

Y ahora, después de enviar y obtener el login exitoso, vemos cómo nos da la bienvenida y el nombre del usuario.

Ahora lo que vamos a tratar de hacer tratar de validar el caso de error, esto quiere decir, colocar el mismo nombre de usuario, pero una contraseña que no tenga ningún sentido.

Ahora, en lugar de escribir la contraseña, vamos a escribir una contraseña SQL
Como podemos ver funciona, ahora, cerraremos sesión e intentaremos escribir lo siguiente:
Tal vez no se note por el formato, pero hay un espacio al final de toda la consulta, este es sumamente importante:
' OR username='chanchitofeliz' LIMIT 1 —
Lo ingresamos en el formulario:

¡Hemos iniciamos sesión con éxito!

¿Acaso el usuario tiene una contraseña comodín?
No, en este caso lo que hicimos fue suponer que la consulta para iniciar sesión fuese esta:
SELECT * FROM usuario where username = ‘$usuario’ AND password = ‘$password’
Nosotros al reemplazar la variable $password por ‘ OR username='chanchitofeliz' — le estamos indicando a la consulta que puede encontrar el usuario con lo que sea que haya escrito el desarrollador o que tan solo sea por su nombre de usuario, o sea que independiente de la contraseña que ingresemos siempre obtendremos el usuario que nos interesa. Por ende, nos va a devolver el usuario. Lo siguiente, que vendría siendo dos guiones son para ignorar lo que venga en la consulta SQL.

Alguno de ustedes pensará que si están encriptando la contraseña, entonces se salvaron… y la verdad es que el hack se puede modificar de manera muy sencilla para que se utilice solo un campo de este formulario.
Sencillamente, escribes el nombre del usuario que te interesa atacar, y luego continúas escribiendo, en el mismo campo:
chacnhitofeliz' --

Y listo, ¿y ahora que ya sabemos esto, ¿cómo podemos protegernos de este ataque?
¿Cómo prevenir un ataque de SQL injection?
Nuevamente, muchos instructores de software dirán que con hacer un escapado de strings es suficiente, pero si me voy por la parte de escapado de strings te estaría diciendo exactamente lo mismo que te dije en un post anterior, te dejamos el link si te interesa conocer acerca de otro de los ataques más comunes, ¿Cómo hackear una página web? | cross site scripting; por lo que voy a proponerte una solución alternativa.
Como vas a estar trabajando con SQL, existen muchos ORM que vienen con esta solución incorporada, por lo que si ya te encuentras utilizando alguno solo debes verificar que incluya esta funcionalidad. Pero eso es fácil de validar, sequelize, el cual es un ORM para nodeJS hace escape string, doctrine, ORM para PHP también incluye esta funcionalidad. Y por lo general la mayoría la incluye.


Ahora solo tocaría ver los casos donde exista una consulta lo suficientemente compleja que te haga decidir no utilizar un ORM, mi consejo sería intenta utilizarlo de todas maneras, pero si por alguna razón no puedes, entonces debes acordarte de hacer un escapado de strings a TODO lo que sea input de un usuario.
Y ahora, ¿qué? Ya sabes esto, y que prácticamente te pueden hackear de cualquier lado. Te doy la bienvenida al Paranoid Driven Development. Pero si por alguna razón no crees que sea razón suficiente para volverte paranoico, entonces te recomiendo que veas nuestro post anterior, te dejamos de nuevo el link: ¿Cómo hackear una página web? | cross site scripting
Y esto ha sido todo de este post, si te ha encantado, ¡golpea al botón de me gusta!, dejanos un comentario, y visita nuestra Academia Hola Mundo, donde encontrarás todos los cursos para formarte como un desarrollador o desarrolladora. Y para no perderte nada, no olvides suscribirte a este blog, seguirnos en todas las redes como Youtube, Twitter e Instagram
¡Hasta la próxima!, y chao mundo
Comments (2)
Carlos Vargassays:
marzo 10, 2023 at 11:09 amHola Nicolas, honestamente, esto es muy antiguo, pero sigue ocurriendo, obviamente en sistemas que no usan un framework para su desarrollo. En una ocasión me pidieron dar un mantenimiento especifico a un sistema que tenía esta vulnerabilidad. Pese a informar a quien me contrato decidió hacer caso omiso a mi sugerencia. Asi en el mundo hay muchos sistemas, que no estan libre de un ataque SQL Inyection. Saludos desde Perú Nicolas
Ruta para ser desarrollador backend con Hola Mundo – Hola Mundosays:
mayo 17, 2023 at 4:47 pm[…] En la academia contamos con el curso: SQL: Sin Fronteras, en el que aprenderás a hacer sentencias SQL junto con el motor de bases de datos MySQL y te dejaremos un post adicional sobre el tema de seguridad en las bases de datos: ¿Cómo hackear una página web? | SQL Injection […]