HackedByDummies
Linkedin
  • 🤠BIENVENIDO
    • Whoami
  • 🔴PENTESTING
    • Windows Active Directory
      • Conceptos básicos
  • 🌍PENTESTING WEB
    • SQL Injection (SQLi)
    • Cross-Site Scripting (XSS)
    • Local File Inclusion (LFI)
    • Remote File Inclusion (RFI)
    • Directory Path Traversal
  • 📋CERTIFICACIONES
    • INE Security
      • eWPTv2 Review
      • eCPPTv2 Review
      • eJPT Review
  • 📦CTF
    • VulNyx
      • Brain - Walkthrough
      • Ready - Walkthrough
      • Shock - Walkthrough
      • Serve - Walkthrough
    • Vulnhub
      • Symfonos 1 + Symfonos 2 Walkthrough
Con tecnología de GitBook
En esta página
  • Tipos de SQL Injection:
  • PoC
  • Mitigación
  1. PENTESTING WEB

SQL Injection (SQLi)

Última actualización hace 1 año

Es una vulnerabilidad web crítica que permite a un atacante interferir en las consultas que una aplicación realiza contra su base de datos.

Este ataque consiste en la inyección de consultas SQL a través de los datos de entrada del cliente a la aplicación permitiendo a un atacante leer datos que normalmente no podría consultar y en muchos casos, también modificar o borrar.

Dentro de los riesgos de seguridad que presentan las aplicaciones web, esta técnica se encuentra en tercera posición, listada como dentro del informe de 2021, que facilitó el proyecto abierto de seguridad de aplicaciones web y categorizada dentro del sistema de debilidades y vulnerabilidades de software como .

Tipos de SQL Injection:

Existen diferentes tipos de SQLi agrupados en los siguientes grupos:

El atacante utiliza el mismo canal de comunicación para enviar el ataque y recibir el resultado. En otras palabras el atacante inyecta el código SQL malicioso en la aplicación web y recibe el resultado del ataque a través del mismo canal usado para enviar el código.

Dentro de este grupo tenemos dos variaciones:

  • Error-Based: El atacante inyecta código malicioso para causar mensajes de error del lado de la aplicación web.

  • Union-Based: El atacante hace uso del operador UNION para combinar el resultado de dos o mas consultas SQL en un solo resultado.

El atacante no recibe mensajes de error directos de la base de datos, lo que hace que sea más difícil identificar y explotar la vulnerabilidad. En lugar de eso, el atacante realiza consultas condicionales que pueden ser evaluadas como verdaderas o falsas para extraer información poco a poco.

Dentro de este grupo tenemos dos variaciones:

  • Boolean-Based: El atacante envía una consulta SQL maliciosa a la aplicación y evalúa la respuesta en función de si la consulta se ha ejecutado correctamente o no.

  • Time-Based: El atacante envía una consulta SQL maliciosa a la aplicación y mide el tiempo que tarda la aplicación en responder.

El atacante que explota una vulnerabilidad en una aplicación web para extraer datos de una base de datos utilizando un canal diferente, que no sea la propia aplicación web.

El ataque Out-of-Band se vuelve necesario en situaciones donde el atacante no puede recibir directamente los resultados de la consulta inyectada debido a restricciones de seguridad, como bloqueo de puertos de red o filtrado de salida. Para superar estas limitaciones, el atacante utiliza técnicas ingeniosas para extraer datos de la base de datos a través de canales de comunicación alternativos.

Debido a que el ataque Out-of-Band no depende de la entrega directa de los resultados de la consulta al atacante, puede ser más difícil de detectar y mitigar.

PoC

En este apartado veremos una breve demostración de como se realiza un ataque simple SQLi. Para ponernos en situación, imaginemos que tenemos un panel de autenticación como podría ser el siguiente, que por detrás se esta realizando una consulta SQL a la base de datos para validar el proceso de autenticación.

Tenemos tanto la entrada de datos para el usuario como para la contraseña.

Explotación de la comilla simple (')

Viendo el panel login de acceso podemos intuir que por detrás se puede estar empleando una consulta SQL de validación como la siguiente:

SELECT * FROM users WHERE username = 'ejemplousuario' AND password 'ejemplo1234'

Si la aplicación no trata el input de datos correctamente como en este caso una comilla simple, un atacante puede introducirla para cerrar la cadena de texto de la consulta y seguidamente inyectar su payload malicioso. Aquí podríamos ver un payload muy típico.

' OR '1'='1'; --

La posible consulta SQL que se podría emplear para la validar la autenticación, quedaría así:

SELECT * FROM users WHERE username = '' OR '1'='1'; -- ' AND password = 'eric1234'

Con este payload conseguimos las siguientes condiciones:

  1. Se cerrará la cadena de texto del campo username gracias a la comilla simple. Esto significa que se seleccionarán todas las filas donde el campo username está vacío, es decir, se seleccionarán las filas donde no hay nombre de usuario (muy improbable que exista una entrada en la tabla users sin nombre de usuario).

  2. 1=1, esta parte siempre será verdadera (TRUE) en una sentencia SQL. Por lo tanto, esta parte de la condición siempre se cumple, independientemente del valor del campo username. Por lo que, se seleccionarán todas las filas de la tabla users.

  3. Con el punto y coma ";" cerramos la consulta.

  4. Por último, los caracteres "--" se utilizan para realizar comentarios en las consultas SQL por lo que todo lo que viene después de "--" será ignorado por el motor de la base de datos.

En resumen, esta consulta SQL seleccionará todas las filas de la tabla users, ignorando cualquier contraseña que pudiera haberse proporcionado en la consulta. Es un ejemplo de una inyección SQL potencialmente maliciosa, ya que está diseñada para evadir la autenticación y seleccionar todas las filas de la tabla de usuarios.

Mitigación

Para evitar ser vulnerables a SQLi es posible implementar una serie de medidas de seguridad.

  1. Utilizar consultas parametrizadas o preparadas: En lugar de concatenar directamente los valores en la consulta SQL, utiliza parámetros o marcadores de posición. Esto evita que los datos de entrada se interpreten como parte del código SQL.

  2. Validar y filtrar la entrada del usuario: Antes de ejecutar cualquier consulta SQL, valida y filtra la entrada del usuario. Esto implica verificar que los datos proporcionados por el usuario sean del tipo y formato esperados, y rechazar cualquier entrada que parezca sospechosa o maliciosa.

  3. Escapar caracteres especiales: Si no es posible utilizar consultas parametrizadas, asegúrate de escapar los caracteres especiales dentro de las entradas del usuario antes de concatenarlos en la consulta SQL. Esto evita que los caracteres especiales se interpreten como parte del código SQL.

  4. Utilizar listas blancas en lugar de listas negras: En lugar de intentar filtrar y bloquear cada posible ataque, utiliza listas blancas para permitir solo ciertos caracteres o patrones de entrada. Esto reduce la superficie de ataque y hace que el sistema sea más seguro.

🌍
A03:2021 – Injection
Top 10
OWASP
CWE
CWE-89
Panel Login