Demostración de inyección SQL

4

Quiero hacer una demostración de una página de inicio de sesión que sea vulnerable a la inyección de SQL para fines de capacitación. Ya intenté construir uno usando PHP y MySQL. Comenté el código de saneamiento para hacer vulnerable la página.

El código de la página de inicio de sesión es este:

//step 1a: sanitise and store data into vars (storing encrypted password)
//$usr = mysqli_real_escape_string($dbc, htmlentities($_POST['u_name']));
//$psw = SHA1($_POST['u_pass']) ; //using SHA1() to encrypt passwords  
$usr = $_POST['u_name'];
$psw = $_POST['u_pass'] ; 

//step2: create query to check if username and password match
$q = "SELECT * FROM users WHERE userName='$usr' AND password='$psw'  ";

//step3: run the query and store result
$res = mysqli_query($dbc, $q);

Luego, intenté ingresar esto en los campos de nombre de usuario y contraseña: ' or '1' = '1

Sin embargo, la página web me dice que el nombre de usuario y la contraseña son incorrectos. ¿Cómo puedo hacer que la inyección SQL funcione?

    
pregunta user2192774 26.02.2015 - 19:43
fuente

3 respuestas

2

Si está inyectando ambos campos al mismo tiempo:

Piense en la cadena SQL con el texto reemplazado:

"SELECT * FROM users WHERE userName='$usr' AND password='$psw' "

se convierte en

"SELECT * FROM users WHERE userName='' OR '1' = '1' AND password='' OR '1' = '1' "

¿Puede ejecutar esa consulta desde un indicador de SQL y obtener una respuesta? Creo que es posible que la lógica fluya con todos esos AND y OR que te harán tropezar.

    
respondido por el schroeder 26.02.2015 - 20:06
fuente
1

Como otros han comentado, debe prestar atención a la declaración SQL resultante. Con un SQLi, normalmente solo necesita o desea inyectar en el campo uno . Como @schroeder señaló, su entrada de ejemplo termina esencialmente con

SELECT * FROM users WHERE userName='' OR '1' = '1' AND password='' OR '1' = '1'

se está enviando al servidor SQL. Es difícil llegar a las declaraciones AND y OR en un punto en el que se obtenga una declaración verdadera. Esto sería especialmente difícil si no tuviera acceso al código fuente.

El truco típico de SQLi es provocar el final de la declaración SQL y comentar el resto de la consulta que creará el código. Por lo tanto, si entras

' or 1=1;--  

para el nombre de usuario y lo que desee para la contraseña, la declaración SQL que se crea es:

SELECT * FROM users WHERE userName='' OR 1=1;-- ' AND password='whatever'

* Editar: @gumbo señaló que MySQL requiere un espacio después de -, que ahora se ha agregado. La eliminación de la ; puede ser requerido. ¡Parte de la diversión de la inyección de SQL es cómo cada motor interpreta el SQL!

Esto le permite evitar tener que preocuparse por cómo se construye el resto de la declaración porque el resto no se ejecuta . Aquí la base de datos no verá / ejecutará la parte de comparación de contraseñas porque ahora forma parte de un comentario. En el caso de que no pueda ver el código fuente, lo probaría primero con el nombre de usuario y luego con la contraseña, ya que no sabe qué parámetro vendría primero en la declaración SQL.

    
respondido por el Alex Kuhl 26.02.2015 - 21:52
fuente
0

Si usas

userName: ' OR 1=1 -- .
password: whatever

Usted esta consulta

SELECT * FROM users WHERE userName='' OR 1=1 -- .' AND password='whatever'
  • ' cierra la cadena
  • OR 1=1 hace que se ignore que userName='' no coincide con nada
  • Con -- . creas un comentario, por lo que no importa lo que venga después.
  • El . es solo en caso de que no lo uses de forma sino en una URL porque algún navegador cortará el espacio.

La consulta básicamente será esta:

SELECT * FROM users WHERE 1=1

Tenga en cuenta que esto devolverá a todos los usuarios. Dependiendo del código que siga, es posible que deba devolver exactamente un usuario. Para esto podrías limitar los resultados:

userName: ' OR 1=1 LIMIT 1 -- .

O adivina el nombre de usuario:

userName: admin' OR 1=1 -- .

Por último, pero no menos importante, eche un vistazo a Comenzando con el desarrollo de sandbox

    
respondido por el PiTheNumber 06.03.2015 - 09:28
fuente

Lea otras preguntas en las etiquetas