Inyeccion SQL
Angel Ivan Hernandez Pineda
Created on April 29, 2024
Over 30 million people create interactive content in Genially.
Check out what others have designed:
EXPLLORING SPACE
Presentation
FOOD 1
Presentation
COUNTRIES LESSON 5 GROUP 7/8
Presentation
BLENDED PEDAGOGUE
Presentation
WORLD WILDLIFE DAY
Presentation
FOOD AND NUTRITION
Presentation
2021 TRENDING COLORS
Presentation
Transcript
wow
Inyección SQL
Es una vulnerabilidad de seguridad web que permite a un atacante interferir con las consultas que una aplicación realiza a su base de datos. Esto puede permitir a un atacante ver datos que normalmente no puede recuperar. En muchos casos, un atacante puede modificar o eliminar estos datos, lo que provoca cambios persistentes en el contenido o el comportamiento de la aplicación.
En algunas situaciones, un atacante puede escalar un ataque de inyección SQL para poner en peligro el servidor subyacente u otra infraestructura de back-end. También puede permitirles realizar ataques de denegación de servicio.
¿Cómo detectar vulnerabilidades de inyección SQL? Puede detectar la inyección SQL manualmente mediante un conjunto sistemático de pruebas en cada punto de entrada de la aplicación. Para ello, normalmente enviaría:
- El carácter de comillas simples ' y busque errores u otras anomalías.
- Sintaxis específica de SQL que se evalúa como el valor base (original) del punto de entrada y con un valor diferente, y busca diferencias sistemáticas en las respuestas de la aplicación.
- Cargas útiles diseñadas para desencadenar retrasos de tiempo cuando se ejecutan dentro de una consulta SQL y buscar diferencias en el tiempo que se tarda en responder.
- Cargas útiles OAST diseñadas para desencadenar una interacción de red fuera de banda cuando se ejecuta dentro de una consulta SQL y supervisar las interacciones resultantes.
- Alternativamente, puede encontrar la mayoría de las vulnerabilidades de inyección SQL de forma rápida y confiable utilizando Burp Scanner.
La mayoría de las vulnerabilidades de inyección SQL se producen dentro de la cláusula WHERE de una consulta SELECT. La mayoría de los probadores experimentados están familiarizados con este tipo de inyección SQL.Sin embargo, las vulnerabilidades de inyección SQL pueden ocurrir en cualquier ubicación dentro de la consulta y dentro de diferentes tipos de consulta.
Algunas otras ubicaciones comunes donde surge la inyección SQL son:
- En las instrucciones UPDATE, dentro de los valores actualizados o en la cláusula WHERE.
- En las instrucciones INSERT, dentro de los valores insertados.
- En las instrucciones SELECT, dentro del nombre de la tabla o columna.
- En las instrucciones SELECT, dentro de la cláusula ORDER BY.
Imagine una aplicación de compras que muestra productos en diferentes categorías. Cuando el usuario hace clic en la categoría Regalos, su navegador solicita la URL: https://insecure-website.com/products?category=Gifts Esto hace que la aplicación realice una consulta SQL para recuperar detalles de los productos relevantes de la base de datos: SELECT * FROM products WHERE category = 'Gifts' AND released = 1 Esta consulta SQL pide a la base de datos que devuelva: Todos los detalles (*) de la tabla de productos donde la categoría es Gifts y liberado es 1.
La restricción liberada = 1 se utiliza para ocultar productos que no se liberan. Podríamos suponer que para productos inéditos, liberados = 0. La aplicación no implementa ninguna defensa contra ataques de inyección SQL. Esto significa que un atacante puede construir el siguiente ataque, por ejemplo: https://insecure-website.com/products?category=Gifts'... Esto da como resultado la consulta SQL: SELECT * FROM products WHERE category = 'Gifts'--' AND released = 1
Fundamentalmente, tenga en cuenta que -- es un indicador de comentario en SQL. Esto significa que el resto de la consulta se interpreta como un comentario, lo que la elimina de forma efectiva. En este ejemplo, esto significa que la consulta ya no incluye AND released = 1. Como resultado, se muestran todos los productos, incluidos los que aún no se han lanzado.
Puede usar un ataque similar para hacer que la aplicación muestre todos los productos de cualquier categoría, incluidas las categorías que no conocen:https://insecure-website.com/products?category=Gifts'+OR+1=1-- Esto da como resultado la consulta SQL: SELECT * FROM products WHERE category = 'Regalos' OR 1=1--' AND liberado = 1
La consulta modificada devuelve todos los elementos en los que la categoría es Regalos o 1 es igual a 1. Como 1=1 siempre es verdadero, la consulta devuelve todos los elementos.Advertencia Tenga cuidado al inyectar la condición OR 1=1 en una consulta SQL. Incluso si parece ser inofensivo en el contexto en el que se está insertando, es habitual que las aplicaciones usen datos de una sola solicitud en varias consultas diferentes. Si su condición llega a una instrucción UPDATE o DELETE, por ejemplo, puede provocar una pérdida accidental de datos.
Imagine una aplicación que permite a los usuarios iniciar sesión con un nombre de usuario y una contraseña. Si un usuario envía el nombre de usuario wiener y la contraseña bluecheese, la aplicación comprueba las credenciales realizando la siguiente consulta SQL:SELECT * FROM users WHERE nombre de usuario = 'wiener' Y contraseña = 'bluecheese' Si la consulta devuelve los detalles de un usuario, el inicio de sesión se ha realizado correctamente. De lo contrario, se rechaza.
En este caso, un atacante puede iniciar sesión como cualquier usuario sin necesidad de una contraseña. Pueden hacerlo utilizando la secuencia de comentarios de SQL, para eliminar la comprobación de contraseña de la cláusula WHERE de la consulta. Por ejemplo, si se envía el nombre de usuario administrator'-- y una contraseña en blanco, se obtiene la siguiente consulta:SELECT * FROM users WHERE nombre de usuario = 'administrador'--' AND contraseña = '' Esta consulta devuelve el usuario cuyo nombre de usuario es administrador e inicia sesión correctamente el atacante como ese usuario.
Cuando una aplicación es vulnerable a la inyección de código SQL y los resultados de la consulta se devuelven dentro de las respuestas de la aplicación, puede utilizar la palabra clave UNION para recuperar datos de otras tablas de la base de datos. Esto se conoce comúnmente como un ataque UNION de inyección SQL. La palabra clave UNION permite ejecutar una o varias consultas SELECT adicionales y anexar los resultados a la consulta original. Por ejemplo: SELECT a, b FROM table1 UNION SELECT c, d FROM table2
Esta consulta SQL devuelve un único conjunto de resultados con dos columnas, que contiene los valores de las columnas a y b de la tabla1 y las columnas c y d de la tabla2.
Determinación del número de columnas necesariasCuando se realiza un ataque UNION de inyección SQL, hay dos métodos eficaces para determinar cuántas columnas se devuelven desde la consulta original. Un método consiste en insertar una serie de cláusulas ORDER BY e incrementar el índice de columna especificado hasta que se produzca un error. Por ejemplo, si el punto de inyección es una cadena entrecomillada dentro de la cláusula WHERE de la consulta original, enviaría lo siguiente: ' ORDENAR POR 1-- ' ORDEN BY 2--
Determinación del número de columnas necesariasCuando se realiza un ataque UNION de inyección SQL, hay dos métodos eficaces para determinar cuántas columnas se devuelven desde la consulta original. Un método consiste en insertar una serie de cláusulas ORDER BY e incrementar el índice de columna especificado hasta que se produzca un error. Por ejemplo, si el punto de inyección es una cadena entrecomillada dentro de la cláusula WHERE de la consulta original, enviaría lo siguiente: ' ORDENAR POR 1-- ' ORDEN BY 2--
Determinación del número de columnas necesariasCuando se realiza un ataque UNION de inyección SQL, hay dos métodos eficaces para determinar cuántas columnas se devuelven desde la consulta original. Un método consiste en insertar una serie de cláusulas ORDER BY e incrementar el índice de columna especificado hasta que se produzca un error. Por ejemplo, si el punto de inyección es una cadena entrecomillada dentro de la cláusula WHERE de la consulta original, enviaría lo siguiente: ' ORDENAR POR 1-- ' ORDEN BY 2--
El segundo método consiste en enviar una serie de cargas útiles UNION SELECT especificando un número diferente de valores nulos: ' UNION SELECT NULL-- ' UNION SELECT NULL,NULL-- ' UNION SELECT NULL,NULL,NULL--
¿Cómo prevenir la inyección SQL?Puede evitar la mayoría de los casos de inyección SQL utilizando consultas parametrizadas en lugar de concatenación de cadenas dentro de la consulta. Estas consultas parametrizadas también se conocen como "declaraciones preparadas". El siguiente código es vulnerable a la inyección SQL porque la entrada del usuario se concatena directamente en la consulta: String query = "SELECT * FROM products WHERE category = '"+ input + "'"; Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(query);
Puede reescribir este código de manera que evite que la entrada del usuario interfiera con la estructura de la consulta: PreparedStatement statement = connection.prepareStatement("SELECT * FROM products WHERE category = ?"); statement.setString(1, input); ResultSet resultSet = statement.executeQuery();