Curiosidades De Hackers
BASE DE DATOSOWASP TOP 10

Inyecciones SQL (1/4). Operador UNION; Explicación y PoC


    En esta serie de 4 partes, estaré explicando los diferentes tipos de Inyecciones SQL que hay de una forma muy básica a nivel principiante, en la cual iremos aumentando la dificultad capitulo a capitulo.

Pero, antes que nada. ¿Qué es una inyección SQL?

Una inyección SQL consiste en la inserción de código SQL por medio de los datos de entrada desde la parte del cliente hacia la aplicación. Es decir, por medio de la inserción de este código el atacante puede modificar las consultar originales que debe realizar la aplicación y ejecutar otras totalmente distintas con la intención de acceder a la herramienta, obtener información de alguna de las tablas o borrar los datos almacenados, entre otras muchas cosas.

Como consecuencias de estos ataques y dependiendo de los privilegios que tenga el usuario de la base de datos bajo el que se ejecutan las consultas, se podría acceder no sólo a las tablas relacionadas con la aplicación, sino también a otras tablas pertenecientes a otras bases de datos alojadas en ese mismo servidor.

Lo comentado anteriormente es posible gracias a que el uso de ciertos caracteres en los campos de entrada de información por parte del usuario, ya sea mediante el uso de los campos de los formularios que son enviados al servidor mediante POST o bien por medio de los datos enviados mediante GET en las urls de las páginas web, posibilitan coordinar varias consultas SQL o ignorar el resto de la consulta, permitiendo ejecutar la consulta que elija, de ahí que sea necesario realizar un filtrado de esos datos enviados para evitar problemas.

Qué es un ataque de inyección SQL, qué tipos hay, cómo identificarlos, cómo protegerse

Así lo explique en un articulo anterior sobre Inyecciones SQL, con mayor detalle teórico.

El primer paso es identificar los parámetros que podrían utilizarse potencialmente en una consulta SQL para comunicarse con la base de datos subyacente. En este ejemplo, encontramos que el método «/home» obtiene datos mediante pageID y muestra el contenido.

Ahora veamos si podemos crear un error inyectando una comilla simple.

Al hacerlo, la sintaxis de la consulta SQL ahora es defectuosa. Esto se debe al hecho de que la entrada proporcionada por el usuario se está concatenando directamente en la consulta SQL.db.get(

Ahora también podemos usar operadores lógicos para determinar si realmente podemos manipular las declaraciones SQL, inyectamos un operador lógico que es verdadero (and 1=1). Esto debería hacer que la aplicación funcione según lo previsto sin errores.

Ahora que sabemos que la aplicación es vulnerable a inyecciones SQL, vamos a utilizar esta vulnerabilidad para leer información sensible de la base de datos. Este proceso podría automatizarse con herramientas como SQLMAP. Sin embargo, para este ejemplo, intentemos explotar la inyección SQL manualmente.

El operador UNION se utiliza en las inyecciones SQL para unir una consulta, modificándola intencionadamente con respecto a la consulta original. Esto permite obtener los valores de las columnas de otras tablas. Primero necesitamos determinar el número de columnas utilizadas por la consulta original. Podemos hacer esto mediante prueba y error.

Esta consulta produce un error porque la consulta original comenzaba con 3 columnas, a saber:

Observamos que»title» y «content» se convierten en marcadores de posición para los datos que queremos recuperar de la base de datos.

Una vez hemos determinado el número de columnas, necesitamos saber el numero de tablas de la cual queremos extraer la información. De nuevo, podemos observar que si intentamos consultar una tabla que no existe, obtenemos un error. En cambio, si consultamos una tabla correcta, vemos que la aplicación funciona como se espera. Es decir USERS

    Simplemente nos ahora falta editar la columna y poner las cuales queremos extraer la información, en esta caso la columna username y password

Prevención

El siguiente código es vulnerable a la inyección SQL ya que la entrada del usuario se concatena directamente en la consulta sin ningún tipo de validación:

Este código puede reescribirse fácilmente de una manera que impida que la entrada del usuario interfiera con la estructura de la consulta


Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *