2009-10-02 9 views
5

Me gustaría señalar primero que este es un intento de educación en mi propia base de datos para comprender mejor las inyecciones de MySQL para proteger mi propio código.¿Cómo demostrar la inyección SQL en este código PHP y MySQL?

Tengo que encontrar un par de ejemplos de cómo se puede construir una inyección de MySQL contra el siguiente código. Es un sistema básico de entrada de usuario donde yo estoy aceptando el nombre de usuario y contraseña sin ningún escape

$user = (!empty($_POST['user'])) ? $_POST['user'] : ''; 
$pass = (!empty($_POST['pass'])) ? $_POST['pass'] : ''; 

La consulta MySQL entonces trata de encontrar el nombre de usuario y la contraseña introducidos en mi tabla llamada a los usuarios, de la siguiente manera:

$res = mysql_query("SELECT * from users where user='{$user}' AND pass='{$pass}'"); 

Ésta es la entrada por la ONU escapado, y estoy tratando de llegar a las inyecciones de MySQL a:

  1. derivación de la contraseña sabiendo nombre de usuario de un usuario legítimo (un usuario en mi tabla de usuarios es probador) y
  2. una inyección que dejaría caer la tabla users en su totalidad.

he intentado un par de ejemplos de inyección de MySQL Wikipedia, pero estoy adivinando el {} en mi consulta es la prevención de la inyección, por lo que agradecería un poco de ayuda de aquellos que son seguros con esto, y gracias a todos ustedes

+1

favor enumerar los que ya trató – Natrium

Respuesta

5

Algo como esto debería hacer:

  1. Para entrar como usuario "foo", establecer el nombre de usuario para "foo' -"

Esto hará que su mirada consulta como

$res = mysql_query("SELECT * from users where user='foo' -- ' AND pass=''"); 

el "-" significa que el resto de la línea se comenta

  1. No estoy seguro si esto va a funcionar, pero intente configurar el nombre de usuario para "foo' O (usuarios DROP TABLE) -"

Esto hará que su mirada consulta como:

$res = mysql_query("SELECT * from users where user='foo' OR (DROP TABLE users) -- ' AND pass=''"); 

no podría aceptar Sin embargo, creo que las subconsultas solo pueden SELECCIONAR.

La función mysql_query sólo se ejecuta una consulta - los demás le permitan hacer esto:

$res = mysql_query("SELECT * from users where user='foo'; DROP TABLE users -- ' AND pass=''"); 
+0

consultas múltiples usando mysql_query no está soportado como se indica en el documento: mysql_query() envía una consulta única (varias consultas no son compatibles) a la base de datos activa en el servidor que está asociado con el link_identifier especificado. –

1

Aquí hay una larga lista.

http://ha.ckers.org/sqlinjection/

Su código será, obviamente, fracasan casi toda la prueba, ya que es totalmente desprotegidos.

+0

gracias por el recurso, bastante votos – Chris

0

{} no son la razón. Puede ser que php Magic Quotes (ahora en desuso) lo proteja de ataques bastante simplistas. Sin embargo, puede switch them off y luego volver a probar.

3

Usted no será capaz de DROP la tabla porque el uso de mysql_query no puede enviar varias consultas.

0

probar este y ver si se vuelca toda la tabla:

For both username and password, I enter: 

' OR 1=1 AND '}' '= 

Por supuesto, esto supone que sé que está utilizando la llave de cierre para envolver los valores de los datos.

Realmente no estoy seguro de cómo MySQL maneja la lógica mixta de esa manera, ya que no está entre paréntesis, así que avíseme si funciona.

1
$user = (!empty($_POST['user'])) ? $_POST['user'] : ''; 
$pass = (!empty($_POST['pass'])) ? $_POST['pass'] : ''; 

$user = mysql_real_escape_string($user); 
$pass = msyql_real_escape_string($pass); 

$res = mysql_query("SELECT * from users where user='{$user}' AND pass='{$pass}'"); 

Eso protegerá el código para usted. Cualquiera no podrá DROP la tabla.

Cuestiones relacionadas