2012-04-23 11 views
15

Estaba leyendo sobre la inyección SQL y entiendo cómo funciona si hay un formulario donde el usuario puede ingresar su nombre de usuario e iniciar sesión. Lo que no entiendo es que los sitios web sin una página de inicio de sesión pueden ser vulnerables a la inyección de sql.Probando si un sitio es vulnerable a Sql Injection

http://thecybersaviours.com/how-to-find-out-if-a-website-is-vulnerable-to-sql-injection

Dice simplemente anexe a 'o ''=' para probarlo. No entiendo cómo esto ayuda a determinar si existe un error. Dónde se está construyendo la consulta en absoluto.

+2

CUALQUIER cuadro de texto o entrada en cualquier página donde el usuario puede escribir e ingresar datos puede tener inyección SQL si la entrada del usuario se pasa a un comando SQL. – DOK

+0

posible duplicado de [¿Qué es la inyección SQL?] (Http://stackoverflow.com/questions/601300/what-is-sql-injection) – CanSpice

Respuesta

16

Inyección SQL es el intento de emitir comandos SQL a una base de datos a través de una interfaz de sitio web para obtener otra información. A saber, esta información se almacena información de la base de datos, como nombres de usuario y contraseñas.

La primera regla para proteger cualquier secuencia de comandos o página que se una a una instancia de base de datos es No confíe en la entrada de usuario.

Su ejemplo intenta terminar una cadena mal citada en una instrucción de SQL. Para entender esto, primero necesita understand SQL statements. En el ejemplo de la adición de un ' a un parámetro de, su 'inyección' espera para el siguiente tipo de declaración:

nombre de usuario SELECT, contraseña FROM usuarios WHERE nombre de usuario = '$ nombre de usuario'

Por añadiendo un ' a esa declaración, que podría luego añadir Paramaters SQL adicionales o consultas .: ' OR username --

nombre de usuario, contraseña SELECT FROM usuarios WHERE nombre de usuario = '' o nombre de usuario - '$ nombre de usuario

Esa es una inyección (un tipo de; Reconstrucción de consultas). La entrada del usuario se convierte en una declaración inyectada en la instrucción SQL preescrita.

En general hay tres tipos de métodos de inyección de SQL:

  • consulta la remodelación o del cambio de dirección (arriba)
  • mensaje
  • Error basado (No dicho usuario/contraseña)
  • Ciegos Inyecciones

Lea en SQL Injection, How to test for vulnerabilities, understanding and overcoming SQL injection, y esta pregunta (y otras relacionadas) en StackOverflow about avoiding injections.

Editar:

En cuanto a las pruebas de su sitio para la inyección de SQL, entienden que se pone mucho más complejo que la simple áppend un símbolo '. Si su sitio es crítico, y usted (o su empresa) puede pagarlo, contrate un probador de lápiz profesional. En su defecto, this great exaxmple/proof puede mostrarle algunas técnicas comunes que uno podría usar para realizar una prueba de inyección.También hay SQLMap que puede automatizar algunas pruebas para Inyección SQL y escenarios de control de base de datos.

2

Cualquier entrada de un cliente son formas de ser vulnerable. Incluye todas las formas y la cadena de consulta. Esto incluye todos los verbos HTTP.

Existen soluciones de terceros que pueden rastrear una aplicación y detectar cuándo podría producirse una inyección.

0

La prueba tiene que realizarse en una página que consulta una base de datos, por lo que sí normalmente es una página de inicio de sesión porque es la página que puede hacer más daño pero también podría ser una página no segura.

En general, tendría sus consultas de base de datos detrás de un inicio de sesión seguro, pero si solo tiene una lista de elementos o algo que no le importa si el mundo ve que un pirata informático puede agregar una inyección SQL al final de la cadena de consulta.

La clave con inyección de SQL es que la persona que realiza la inyección debería saber que está consultando una base de datos, de modo que si no consulta una base de datos, no se puede realizar una inyección sql. Si su formulario se está enviando a una base de datos, entonces sí, SQL Inject that. Siempre es una buena práctica usar cualquiera de los procedimientos almacenados para seleccionar/insertar/actualizar/eliminar o asegurarse de preparar o escapar todas las afirmaciones que llegarán a la base de datos.

1

Una página de inicio de sesión no es la única parte de un sitio web basado en bases de datos que interactúa con la base de datos.

Cualquier entrada editable por el usuario que se utiliza para construir una consulta de base de datos es un posible punto de entrada para un ataque de inyección SQL. El atacante puede no necesariamente iniciar sesión en el sitio como administrador a través de este ataque, pero puede hacer otras cosas. Pueden cambiar los datos, cambiar la configuración del servidor, etc. según la naturaleza de la interacción de la aplicación con la base de datos.

Agregar una entrada ' suele ser una prueba bastante buena para ver si genera un error o produce un comportamiento inesperado en el sitio. Es una indicación de que la entrada del usuario se está utilizando para generar una consulta sin procesar y el desarrollador no esperaba una sola cotización, que cambia la estructura de la consulta.

Tenga en cuenta que una página puede ser segura contra la inyección SQL, mientras que la otra no. La página de inicio de sesión, por ejemplo, puede ser reforzada contra tales ataques. Pero una página diferente en otro lugar del sitio podría estar abierta. Entonces, por ejemplo, si uno desea iniciar sesión como administrador, entonces puede usar la inyección SQL en esa otra página para cambiar la contraseña de administrador. A continuación, regrese a la página de inicio de sesión perfectamente no inyectable con SQL e inicie sesión como administrador.

0

La manera más fácil de protegerse es utilizar procedimientos almacenados en lugar de sentencias SQL en línea.

Luego use los permisos de "privilegios mínimos" y solo permita el acceso a los procedimientos almacenados y no directamente a las tablas.

+0

** Precaución: ** El acto de usar procedimientos almacenados no es * solo * una protección contra la inyección de SQL. Uno todavía necesita entender lo que está haciendo. http://publicvoidlife.blogspot.com/2012/01/stored-procedures-and-sql-injection.html – David

+0

Tiene razón. El uso de procedimientos almacenados puede protegerlo de la inyección SQL cuando la persona que los escribe sabe cómo usarlos. Pero podríamos decir lo mismo para casi todo lo demás. La seguridad del servidor SQL funciona, cuando el DBA sabe lo que está haciendo. O qué tal si un desarrollador muestra la cadena de conexión en un mensaje de error, por lo que la lista sigue y sigue. Creo que lo que estoy tratando de decir es que se espera un grado mínimo de experiencia o talento. –

+0

De hecho. Solo quiero evitar interpretaciones erróneas de los usuarios principiantes (como el OP) que tienden a huir con las implicaciones incorrectas de un enunciado. Haz que el mundo sea un lugar mejor y todo eso :) – David

3

La inyección de SQL se puede realizar en cualquier entrada en la que el usuario pueda influir y que no se haya escapado correctamente antes de utilizarse en una consulta.

Un ejemplo sería una variable pongo así:

http//www.example.com/user.php?userid=5 

Ahora, si el código PHP que acompaña es algo como esto:

$query = "SELECT username, password FROM users WHERE userid=" . $_GET['userid']; 
// ... 

Usted puede utilizar fácilmente la inyección de SQL aquí también:

http//www.example.com/user.php?userid=5 AND 1=2 UNION SELECT password,username FROM users WHERE usertype='admin' 

(por supuesto, los espacios tendrán que ser reemplazados por %20, pero esto es más legible Además, esto es solo un ejemplo que hace algunas suposiciones más, pero la idea debe ser clara.)

Cuestiones relacionadas