Skip to content

Latest commit

 

History

History
75 lines (45 loc) · 6.74 KB

File metadata and controls

75 lines (45 loc) · 6.74 KB

9.4 SQL injection

¿Qué es la inyección de SQL

Los ataques de inyección SQL (SQL Injection), que se refiere a ataques de inyección, el desarrollo web es la forma más común de las vulnerabilidades de seguridad. Se puede utilizar para obtener información sensible de la base de datos, o el uso de las características del proceso de agregar usuarios a la base de datos, archivo de exportación y una serie de acciones maliciosas, hay incluso puede obtener una base de datos, así como el sistema de más alta autoridad los usuarios.

Inyección SQL produce porque el programa no filtra eficazmente la entrada del usuario, por lo que un atacante enviado correctamente al código de consultas SQL servidor malicioso, el programa recibirá el error después de la entrada del atacante como parte de la ejecución de consultas, lo que lleva a la original de la consulta lógica se cambia, la ejecución adicional de atacante elaborado códigos maliciosos.

Ejemplos de inyección SQL

Muchos desarrolladores web no se dan cuenta de cómo las consultas SQL pueden ser manipulados, por lo que una consulta SQL es un comando de confianza. Como todos saben, las consultas SQL pueden burlar los controles de acceso, de modo que pueden evitar los chequeos estándares de autenticación y autorización. Lo que es más, es posible ejecutar consultas SQL a través de los comandos de nivel de sistema host.

A continuación se presentan algunos ejemplos reales para explicar en detalle la forma de inyección SQL.

Considere el siguiente formulario de acceso simple:

<form action="/login" method="POST">
<p>Username: <input type="text" name="username" /></p>
<p>Password: <input type="password" name="password" /></p>
<p><input type="submit" value="Login" /></p>
</form>

Nuestro procesamiento dentro del SQL podría tener este aspecto:

username := r.Form.Get("username")
password := r.Form.Get("password")
sql := "SELECT * FROM user WHERE username='" + username + "' AND password='" + password + "'"

Si la entrada del usuario como nombre de usuario, contraseña cualquiera

myuser' or 'foo' = 'foo' --

Entonces nuestra SQL se convierte en la siguiente:

SELECT * FROM user WHERE username='myuser' or 'foo'=='foo' --'' AND password='xxx'

En SQL, algo después - es un comentario. De este modo la inserción -- altera la consulta. Esto permite al atacante iniciar sesión correctamente como un usuario sin una contraseña válida.

Hay mucho más peligros para una inyección SQL MSSQL, es el sistema de control, los siguientes ejemplos demostrarán cuán terrible en algunas versiones de la base de datos MSSQL a cabo los comandos del sistema.

sql := "SELECT * FROM products WHERE name LIKE '%" + prod + "%'"
Db.Exec(sql)

Si el atacante envia a%' exec master..xp_cmdshell 'net user test testpass /ADD' -- valor prod como una variable, entonces el sql se convertirá en

sql := "SELECT * FROM products WHERE name LIKE '%a%' exec master..xp_cmdshell 'net user test testpass /ADD'--%'"

Server ejecuta la sentencia SQL, incluyendo la espalda que se utiliza para añadir nuevos usuarios a los comandos del sistema. Si este programa se ejecuta sa y el servicio MSSQLSERVER suficientes privilegios, el atacante puede obtener una cuenta de sistema para acceder a esta máquina.

Aunque los ejemplos anteriores está vinculada a un sistema de base de datos específicos, pero esto no significa que otros sistemas de bases de datos no pueden implementar un ataque similar. En respuesta a esta vulnerabilidad, siempre y cuando el uso de diferentes métodos, diversas bases de datos son propensos a sufrir.

How to prevent SQL injection

Perhaps you will say the attacker to know the database structure information in order to implement SQL injection attacks. True, but no one can guarantee the attacker must get this information, once they got, the database exists the risk of leakage. If you are using open source software to access the database, such as forum, the intruders easily get the related code. If the code is poorly designed, then the risk is even greater. Currently Discuz, phpwind, phpcms popular open source programs such as these have been precedents of SQL injection attacks.

These attacks happen when safety is not high on the code. So, never trust any kind of input, especially from the user's data, including the selection box, a hidden input field or a cookie. As a first example above it, even if it is a normal query can cause disasters.

SQL injection attacks harm so great, then how to combat it ? Following suggestions may be the prevention of SQL injection have some help.

  1. Estrictamente limitar el funcionamiento de los permisos de la base de datos de aplicaciones Web a este usuario sólo es capaz de cumplir con los permisos mínimos de su trabajo, para así reducir al mínimo el daño a los ataques de inyección de base de datos.
  2. Compruebe si la entrada de datos tiene el formato de datos esperado, y limitar estrictamente los tipos de variables, tales como el uso de algún paquete de procesamiento de coincidencia de expresión regular, o utilizar ConvCadena empaquetar cadena a la derecha en otros tipos básicos de datos al juez.
  3. Los pares de caracteres especiales en la base de datos ('"& *; etc) se escaparon o transcodificación Go to. texto / plantilla de paquete dentro de la HTMLEscapeString función es posible acabar con las cadenas.
  4. Toda la interfaz de consulta con parámetros de consulta de base de datos recomendada, instrucción parametrizada utiliza parámetros en lugar de la concatenación de las variables de entrada del usuario en sentencias de SQL incorporado que no empalman directamente sentencia SQL. Por ejemplo, usando la base de datos / sql dentro de la function Prepare and Query, or Exec(query string, args... interface {}).
  5. En la aplicación antes de soltar recomienda el uso de un profesional de las herramientas de detección de inyección SQL para detectar y reparar se descubrió cuando una vulnerabilidad de inyección SQL. Hay muchos herramienta en línea de código abierto a este respecto, por ejemplo, sqlmap, sqlninja así sucesivamente.
  6. Evite imprimir información de error de SQL en la página web con el fin de evitar que un atacante utilizar estos mensajes de error para la inyección SQL. Ex. tales como errores de tipo, y los campos no coincidentes, o alguna sentencia de SQL.

Resumen

A través del ejemplo anterior podemos saber, inyección SQL es perjudicial para considerables vulnerabilidades de seguridad. Así que escribimos generalmente para una aplicación web, que debería ser para cada pequeño detalle debe otorgar gran importancia a los detalles determinan el destino de la vida es así, la escritura de aplicaciones Web también..

Links